Cygwin/MSYS2 で --mq 指定時に色が出ない

34 views
Skip to first unread message

ktakat...@gmail.com

unread,
Oct 18, 2017, 5:43:47 AM10/18/17
to mercurial-ja
初めまして、K.Takata と申します。

しばらく前に、Cygwin および MSYS2 の mercurial を 4.0.2 から 4.3.2 に
更新したところ、hg log --mq 等、--mq オプションを指定したときに、pager が
有効になっていると、カラー表示されなくなってしまいしました。
(他の環境は未確認です。)

hg --pager=no log --mq として pager を無効化するか、
hg --color=always log --mq として、カラー表示を強制すれば色が出ます。

hg log と hg log --mq での動作の違いを確認すると、--mq を指定した時には、
color._modesetup() が 1 回余計に呼び出されており、その中で ui.formatted() が
False を返すことでカラー表示が無効化されていることが確認できました。

ここで、4.0.2 と 4.3.2 のコードを比較したところ、localrepo.py の
localrepository.__init__() に違いがありました。4.0.2 では color.setup() を
呼んでいないのですが、4.3.2 では呼ぶようになっていました。

試しに、以下のように color.setup() の呼び出しを無効化したところ、
今まで通り、色が出るようになりました。

--- localrepo.py.orig
+++ localrepo.py
@@ -366,7 +366,7 @@
                     setupfunc
(self.ui, self.supported)
         
else:
             
self.supported = self._basesupported
-        color.setup(self.ui)
+        #color.setup(self.ui)
 
         
# Add compression engines.
         
for name in util.compengines:




Cygwin/MSYS2 でも色が出るように修正していただけるとありがたいです。
--
K.Takata

Yuya Nishihara

unread,
Oct 18, 2017, 8:01:33 AM10/18/17
to mercur...@googlegroups.com, ktakat...@gmail.com
On Wed, 18 Oct 2017 02:34:54 -0700 (PDT), ktakat...@gmail.com wrote:
> しばらく前に、Cygwin および MSYS2 の mercurial を 4.0.2 から 4.3.2 に
> 更新したところ、hg log --mq 等、--mq オプションを指定したときに、pager が
> 有効になっていると、カラー表示されなくなってしまいしました。
> (他の環境は未確認です。)
>
> hg --pager=no log --mq として pager を無効化するか、
> hg --color=always log --mq として、カラー表示を強制すれば色が出ます。
>
> hg log と hg log --mq での動作の違いを確認すると、--mq を指定した時には、
> color._modesetup() が 1 回余計に呼び出されており、その中で ui.formatted() が
> False を返すことでカラー表示が無効化されていることが確認できました。
>
> ここで、4.0.2 と 4.3.2 のコードを比較したところ、localrepo.py の
> localrepository.__init__() に違いがありました。4.0.2 では color.setup() を
> 呼んでいないのですが、4.3.2 では呼ぶようになっていました。
>
> 試しに、以下のように color.setup() の呼び出しを無効化したところ、
> 今まで通り、色が出るようになりました。
>
> --- localrepo.py.orig
> +++ localrepo.py
> @@ -366,7 +366,7 @@
> setupfunc(self.ui, self.supported)
> else:
> self.supported = self._basesupported
> - color.setup(self.ui)
> + #color.setup(self.ui)

話は分かりました。とりあえず pager エクステンションを無効にすると回避できる
はずです。 pager@runcommand -> --mq -> pager@log の流れでおかしくなってる。

Katsunori FUJIWARA

unread,
Oct 19, 2017, 8:58:46 AM10/19/17
to mercurial-ja, ktakat...@gmail.com
藤原です。

2017年10月18日 21:01 Yuya Nishihara <yu...@tcha.org>:

> On Wed, 18 Oct 2017 02:34:54 -0700 (PDT), ktakat...@gmail.com wrote:
>> しばらく前に、Cygwin および MSYS2 の mercurial を 4.0.2 から 4.3.2 に
>> 更新したところ、hg log --mq 等、--mq オプションを指定したときに、pager が
>> 有効になっていると、カラー表示されなくなってしまいしました。
>> (他の環境は未確認です。)

Twitter で話題を振ってもらったのに、返信できずに済みません
(時間が取れなかったのもありますが、メンションの通知が飛ばなかった
ので、気付くのが遅れてしまいました……)

>> hg --pager=no log --mq として pager を無効化するか、
>> hg --color=always log --mq として、カラー表示を強制すれば色が出ます。
>>
>> hg log と hg log --mq での動作の違いを確認すると、--mq を指定した時には、
>> color._modesetup() が 1 回余計に呼び出されており、その中で ui.formatted() が
>> False を返すことでカラー表示が無効化されていることが確認できました。
>>
>> ここで、4.0.2 と 4.3.2 のコードを比較したところ、localrepo.py の
>> localrepository.__init__() に違いがありました。4.0.2 では color.setup() を
>> 呼んでいないのですが、4.3.2 では呼ぶようになっていました。
>>
>> 試しに、以下のように color.setup() の呼び出しを無効化したところ、
>> 今まで通り、色が出るようになりました。
>>
>> --- localrepo.py.orig
>> +++ localrepo.py
>> @@ -366,7 +366,7 @@
>> setupfunc(self.ui, self.supported)
>> else:
>> self.supported = self._basesupported
>> - color.setup(self.ui)
>> + #color.setup(self.ui)
>
> 話は分かりました。とりあえず pager エクステンションを無効にすると回避できる
> はずです。 pager@runcommand -> --mq -> pager@log の流れでおかしくなってる。

こちらで以下の要領で動作確認をしてみたのですが:

Windows コマンドプロンプト::

> set HGRCPATH=null
> pytnon path\to\hg --config extensions.hgext.mq= parents --mq
(color 化された出力)
> pytnon path\to\hg --config extensions.hgext.mq= diff -c . --mq
(color 化された出力)
> pytnon path\to\hg --config extensions.hgext.mq= config --mq ui
ui.formatted=True
ui.interactive=False

Cygwin ターミナル::

$ export HGRCPATH=/dev/null
$ python path/to/hg --config extensions.hgext.mq= parents --mq
(color 化された出力)
$ python path/to/hg --config extensions.hgext.mq= diff -c . --mq
(color 化された出力)
$ python path/to/hg --config extensions.hgext.mq= config --mq ui
ui.formatted=True
ui.interactive=False

どちらも現象が再現できませんでした。西原さんの環境では再現できまし
た?

再現できない原因として考えられるのは、以下のような要因でしょうか?

- pure Python 版だと再現しない問題
- 使用しているターミナルソフト由来の問題
- Cygwin のバージョン依存の挙動 (+ MSYS2 は当該 Cygwin の挙動と同じ)
- 併用している他のエクステンションの副作用

以前、Windows 環境で明示的に pager を有効にすると、なぜか ANSI
color モードが選択されてしまう障害を修正した際に:

- keyword や mq は独自の color 設定を持っている
- エクステンション有効時の副作用で color 機能の初期化が動作
- "--pager on" 判定前の color 設定により適切なモードが選択

という挙動だったことがあったので、エクステンションの有効化位置
(.hg/hgrc 由来か、それ以外か) や、他のエクステンションとの前後関係
とかによる影響もゼロではないんですよねぇ。

https://www.mercurial-scm.org/repo/hg/rev/f928d53b687c


ちなみに、「Cygwin および MSYS2 の mercurial」は、どのような手段で
インストールしたものでしょうか? (自前でビルド, パッケージ管理経由
でインストール, その他)

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)

ktakat...@gmail.com

unread,
Oct 19, 2017, 9:30:19 AM10/19/17
to mercurial-ja
K.Takata です。

2017年10月19日木曜日 21時58分46秒 UTC+9 FUJIWARA Katsunori:
 すみません。古い設定が残っていたのが悪さをしていたようです。

[extensions]
pager
=

となっていたのですが、pager = をコメントアウトしたところ、色がつくようになりました。逆に、

    $ export HGRCPATH=/dev/null
    $ hg
--config extensions.hgext.mq= --config extensions.hgext.pager= log --mq

で色がつかなくなるのも確認できました。
(なお、mercurialはCygwinもMSYS2もパッケージ経由でインストールしたものです。)
--
K.Takata

Yuya Nishihara

unread,
Oct 19, 2017, 9:39:06 AM10/19/17
to mercur...@googlegroups.com, Katsunori FUJIWARA, ktakat...@gmail.com
On Thu, 19 Oct 2017 21:58:44 +0900, Katsunori FUJIWARA wrote:
> 2017年10月18日 21:01 Yuya Nishihara <yu...@tcha.org>:
> > On Wed, 18 Oct 2017 02:34:54 -0700 (PDT), ktakat...@gmail.com wrote:
> >> しばらく前に、Cygwin および MSYS2 の mercurial を 4.0.2 から 4.3.2 に
> >> 更新したところ、hg log --mq 等、--mq オプションを指定したときに、pager が
> >> 有効になっていると、カラー表示されなくなってしまいしました。
> >> (他の環境は未確認です。)

> >> 試しに、以下のように color.setup() の呼び出しを無効化したところ、
> >> 今まで通り、色が出るようになりました。
> >>
> >> --- localrepo.py.orig
> >> +++ localrepo.py
> >> @@ -366,7 +366,7 @@
> >> setupfunc(self.ui, self.supported)
> >> else:
> >> self.supported = self._basesupported
> >> - color.setup(self.ui)
> >> + #color.setup(self.ui)
> >
> > 話は分かりました。とりあえず pager エクステンションを無効にすると回避できる
> > はずです。 pager@runcommand -> --mq -> pager@log の流れでおかしくなってる。
>
> こちらで以下の要領で動作確認をしてみたのですが:

[...]

> どちらも現象が再現できませんでした。西原さんの環境では再現できまし
> た?
>
> 再現できない原因として考えられるのは、以下のような要因でしょうか?
>
> - pure Python 版だと再現しない問題
> - 使用しているターミナルソフト由来の問題
> - Cygwin のバージョン依存の挙動 (+ MSYS2 は当該 Cygwin の挙動と同じ)
> - 併用している他のエクステンションの副作用
>
> 以前、Windows 環境で明示的に pager を有効にすると、なぜか ANSI
> color モードが選択されてしまう障害を修正した際に:
>
> - keyword や mq は独自の color 設定を持っている
> - エクステンション有効時の副作用で color 機能の初期化が動作
> - "--pager on" 判定前の color 設定により適切なモードが選択

pager extension を有効にすれば再現できます。

$ HGRCPATH=/dev/null ./hg log --mq --config extensions.mq= \
--config extensions.color= --config extensions.pager=

原因は mq がやってる baseui.copy() です。暫定対策のメドはつけているので、
コードフリーズ後に修正を投げられると思います。今週はアホみたいにパッチが
流れていて、オーバーフローぎみです。
Reply all
Reply to author
Forward
0 new messages