hgweb.cgi で同じ対象を表示した時にcomparisonとdiffで変更箇所が違う

69 views
Skip to first unread message

shin ohira

unread,
Mar 27, 2014, 5:47:29 AM3/27/14
to mercur...@googlegroups.com
いつもお世話になっております。おおひらです。

hgweb.cgiで同じ対象を表示した場合comparisonとdiffで変更箇所の指摘が違っているのは正常なのでしょうか?

状況としては
comparisonでは正常に表示されているのですが、diffを選択すると何も表示されないということがまれに良くあります。


Katsunori Fujiwara

unread,
Mar 27, 2014, 6:35:39 AM3/27/14
to mercurial-ja
藤原です。

基本的には同一の差分判定ロジック (標準の difflib モジュールの
SequenceMatcher クラス) に行き着くのですが、そこに至るルート/与える
データが comparison と diff ではかなり違うので、状況次第では違いが
出てしまう可能性はあります。

一応、「妥当な範囲で一致してる」のが想定動作ですので、何がどの程度
違うのかが分かると良いのですが、公に参照可能なサンプルは作成 or 公
開できますかね?


2014年3月27日 18:47 shin ohira <shin....@gmail.com>:
> --
> from Mercurial 日本語コミュニティ <mercur...@googlegroups.com>
> ※ ヘルプ表示は http://groups.google.com/group/mercurial-ja?hl=ja
> ---
> このメールは Google グループのグループ「mercurial-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには mercurial-ja...@googlegroups.com
> にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



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

shin ohira

unread,
Mar 27, 2014, 10:04:58 PM3/27/14
to mercur...@googlegroups.com
おおひらです。
状況確認できるサンプルの
公開環境ができましたらお知らせいたします。

2014年3月27日木曜日 19時35分39秒 UTC+9 FUJIWARA Katsunori:

Katsunori Fujiwara

unread,
Mar 28, 2014, 1:43:43 AM3/28/14
to mercurial-ja
藤原です。

問題の発生するリビジョンを R、対象ファイルを F とした場合:

- 新規リポジトリ REPO を作成

- R の親 P 時点での F の行数を N とした場合、行番号だけを内容に
持つ N 行のファイル F1 を REPO に新規追加&コミット
(UNIX 環境なら "seq -w N" とかで作成)

- R における F の差分に応じて、以下の改変を適用&コミット

- 対応する "-" の行を F1 から削除

- 対応する "+" の行を F1 に追加
(= 改変扱いになるような行内容にする)

理屈の上では、上記手順で作ったリポジトリでも現象が再現できる筈です
が、問題の原因が「difflib による差分判定の曖昧さ」に由来する場合は、
比較対象の内容を単純化してしまうことで、再現できなくなる可能性もあ
ります。

以前 annotate の問題で ML にアナウンスした際にも書いたように、差分
抽出には「絶対」のアルゴリズムが無いので、何らかのコーナーケースに
おいては、期待と異なる結果になってしまうためです。

https://groups.google.com/d/msg/mercurial-ja/39ZKJw8lTco/vz-kyMhrT1EJ

ですので、再現用のリポジトリで現象が再現しない場合、頑張っても徒労
に終わる可能性もありますので、ある程度やってダメだったなら、その旨
お知らせください。


2014年3月28日 11:04 shin ohira <shin....@gmail.com>:
Message has been deleted

shin ohira

unread,
Apr 2, 2014, 12:57:33 AM4/2/14
to mercur...@googlegroups.com

Shun-ichi Goto

unread,
Apr 2, 2014, 2:43:35 AM4/2/14
to mercurial-ja
2014年4月2日 13:57 shin ohira <shin....@gmail.com>:
> おおひらです。
> 状況確認できるサンプルの
> 公開環境ができました。

comparison ってまったく使ってなかったんですが、試してみました。
どうやら
diff が 指定ファイルの 対象revでの変更内容 を表示するのに対して、
comparison は対象 revに最も近い過去の変更の内容 を処理していますね。
今回の例でいえば、index.htmlが変更されているチェンジセット(ex. 263:f1e194886b42)
はOKで、.hgtags しか変更されていないチェンジセット(ex. 141:e488744b5213) だと
index.htmlは変更していない(diffは空)なのに comparison が直近の変更を表示してしまって
ます。

別の言い方をすると r141 で見ている NGな comparison の内容は、 r140 でのcomparison
と同じものになります。

これはそもそも comparison 機能仕様がどういうものであるのかにもよるとは思いますが、
diffとcomparisonの違いについてはそういうことではないでしょうかね。

webcommands.py の comparison()を見ても確かにファイルの実revとその前のrevで
比較しているようなので、たしかにそうなりそう。それが意図したものかは不明。

最初のメールにあった「 comparisonでは正常に表示されているのですが、
diffを選択すると何も表示されないということが..」とありますが、どちらかと言えば
「diffが正しいのであってcomparison が間違ってる」といったほうがいいのかも
しんないです。


--
Shun-ichi GOTO

shin ohira

unread,
Apr 2, 2014, 3:57:11 AM4/2/14
to mercur...@googlegroups.com
おおひらです。
そういうことでしたか、こちらでは見た目で判断しただけだったので、、、、^_^;;;;;
diffとcomparisonでは比較している箇所が違うために、出力される内容も違っているのですね。

webインターフェースの動作としては、同じ比較対象についてdiffとcomparisonで見え方を変えられるのが望ましいのではないでしょうか?変更内容によってはdiffで見るほうがわかりやすい場合とcomparisonで見るほうがわかりやすい場合がありますし
人によってどちらが好きという好みもあるでしょうから、diffとcomparisonの間で楽に画面遷移できると便利だと考えます。

2014年4月2日水曜日 15時43分35秒 UTC+9 Shun-ichi Goto:

shin ohira

unread,
Apr 2, 2014, 4:28:47 AM4/2/14
to mercur...@googlegroups.com
おおひらです。
状況確認できるサンプル2



2014年4月2日水曜日 16時57分11秒 UTC+9 shin ohira:

Katsunori Fujiwara

unread,
Apr 2, 2014, 5:01:01 AM4/2/14
to mercurial-ja
藤原です。

2014年4月2日 15:43 Shun-ichi Goto <shunic...@gmail.com>:
> 2014年4月2日 13:57 shin ohira <shin....@gmail.com>:
>> おおひらです。
>> 状況確認できるサンプルの
>> 公開環境ができました。
>
> comparison ってまったく使ってなかったんですが、試してみました。
>
> どうやらdiff が 指定ファイルの 対象revでの変更内容 を表示するの
> に対して、comparison は対象 revに最も近い過去の変更の内容 を処理
> していますね。

この部分の Goto さんの発言で気が付きました。

ちょっと内部的な話を含みますが、comparison は、変更コンテキスト(=
履歴ツリーの要素) changectx の親ではなく、ファイルコンテキスト(=
ファイル毎の履歴ツリーの要素) filectx の親を比較対象にしてました。

http://selenic.com/repo/hg/file/9e9e3a4e9261/mercurial/hgweb/webcommands.py#l715

if path in ctx:
fctx = ctx[path] <<<< changectx から filectx を取得
rightrev = fctx.filerev()
rightnode = fctx.filenode()
rightlines = filelines(fctx)
parents = fctx.parents() <<<< filectx の親(= filectx)を取得
if not parents: <<<< リビジョン 0 で親が無い場合
leftrev = -1
leftnode = nullid
leftlines = ()
else: <<<< 通常ケース
pfctx = parents[0] <<<< filectx の 第1親を比較対象に選定
leftrev = pfctx.filerev() <<<< filectx から changectx を逆引き
leftnode = pfctx.filenode()
leftlines = filelines(pfctx)

ファイル履歴コンテキストは、各ファイル毎の変更履歴のみによるツリー
なので、ファイル履歴コンテキストの親はまさに「対象 revに最も近い」
親になります。


私の場合、diff を見てから comparison を見てた(= changectx と
filectx の親が一致)ので気が付かなかったのでしょうね。


> これはそもそも comparison 機能仕様がどういうものであるのかにもよ
> るとは思いますが、diffとcomparisonの違いについてはそういうことで
> はないでしょうかね。

diff と comparison の差が、表示形式(差分形式と side-by-side 形式)
のみだとすると:

> 「diffが正しいのであってcomparison が間違ってる」といったほうが
> いいのかもしんないです。

であるように思われます。


問題と原因がはっきりしたので、修正提案を投げてみようと思います。

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

FUJIWARA Katsunori

unread,
Apr 18, 2014, 2:13:37 AM4/18/14
to mercur...@googlegroups.com
藤原です。

2014年4月2日水曜日 18時01分01秒 UTC+9 FUJIWARA Katsunori:


> 2014年4月2日 15:43 Shun-ichi Goto <shunic...@gmail.com>:
> > 2014年4月2日 13:57 shin ohira <shin....@gmail.com>:
> >> おおひらです。
> >> 状況確認できるサンプルの
> >> 公開環境ができました。
> >
> > comparison ってまったく使ってなかったんですが、試してみました。
> >
> > どうやらdiff が 指定ファイルの 対象revでの変更内容 を表示するの
> > に対して、comparison は対象 revに最も近い過去の変更の内容 を処理
> > していますね。
>
> 問題と原因がはっきりしたので、修正提案を投げてみようと思います。


この障害の修正が、無事に取り込まれましたので、来月頭にリリースされ
る 3.0 (Mercurial のバージョン番号は N.9 ⇒ N+1.0 になります) から
は正しい表示になります。

    http://selenic.com/repo/hg/rev/8c9e84b44221

この件の修正の過程で、他にも幾つか comparison 周りの問題を発見・修
正することができました。報告ありがとうございます。

  - 対象ファイルの修正がないリビジョンでのファイル毎表示で、
    parents の表示対象が "hg parents -r REV FILE" と異なる問題を修正

    http://selenic.com/repo/hg/rev/50981ce36236

  - comparision 表示において比較対象上部に表示されるリビジョン番号・
    ハッシュ値が、ファイル毎の内部固有情報になっている問題を修正

    http://selenic.com/repo/hg/rev/92fab48dfec1

FUJIWARA Katsunori

unread,
Apr 18, 2014, 2:30:34 AM4/18/14
to mercur...@googlegroups.com
藤原です。

この話題自体には直接関係無いのですが……

Google group のウェブ UI から参照すると、このトピック上の投函に
「削除された」ものがある旨の表示があるのですが、自分の投函が配信さ
れずに破棄されたことに、心当たりのある方はいらっしゃいますか?

現時点で確認できる投函は、以下の3人によるものだけになっています。

  - おおひらさん
  - Goto さん
  - 私(藤原)

以下の様な状況からして、おそらくはスパム等の投函が自動的に破棄され
たのだとは思いますが、もしも想定外のメール破棄が発生している場合は
私宛 (flying.foozy アットマーク gmail.com) にお知らせください。

  - 管理者への「保留中メッセージがある」旨の通知等が無かった

  - 記憶している範囲の投函内容からすると、一旦配信されたものを、投
    函者が自分で削除した等のものではなさそう


2014年3月27日木曜日 18時47分29秒 UTC+9 shin ohira:

shin ohira

unread,
Apr 18, 2014, 7:06:24 AM4/18/14
to mercur...@googlegroups.com
おおひらです。

自分は間違った場所の書き込みボタンを押してしまい。同じ書き込みが複数行われてしまったため
重複したものを消去したことがあります。

他の方も消去されているかもしれませんが、自分は二回ぐらい自分で消したことがあったように思います。

2014年4月18日金曜日 15時30分34秒 UTC+9 FUJIWARA Katsunori:

Katsunori Fujiwara

unread,
Apr 18, 2014, 8:41:43 AM4/18/14
to mercurial-ja
藤原です。

心当たりのある人がいるのであれば、知らずに破棄されているメールは
無さそうですね。安心しました。

2014年4月18日 20:06 shin ohira <shin....@gmail.com>:

shin ohira

unread,
Apr 21, 2014, 9:45:16 PM4/21/14
to mercur...@googlegroups.com
おおひらです。

> 問題と原因がはっきりしたので、修正提案を投げてみようと思います。

この障害の修正が、無事に取り込まれましたので、来月頭にリリースされ
る 3.0 (Mercurial のバージョン番号は N.9 ⇒ N+1.0 になります) から
は正しい表示になります。
    http://selenic.com/repo/hg/rev/8c9e84b44221
 ありがとうございました。
これで安心してdiffとcomparisonを切り替えて変更内容を確認できるのでとても便利になりそうです。

ご対応感謝いたします。 

2014年4月18日金曜日 15時13分37秒 UTC+9 FUJIWARA Katsunori:
Reply all
Reply to author
Forward
0 new messages