彷徨えるフジワラ

年がら年中さまよってます

Mercurial に関するコミュニティ由来の成果(2014年版)

本エントリは、2014年の一年間に、ML/twitter/勉強会といったコミュニティから上がった情報/要望の中で:

  • Mercurial 本体に取り込まれた修正の契機になったもの
  • Mercurial 本体に取り込まれてはいないものの、何らかの成果に結びついたもの
  • 『今後の作業のネタ』(= バックログ)として認識されているもの

上記に該当するものを、情報提供への感謝の意味も込めて、列挙したものです。
『気になった点に関して、情報提供をする』だけでも、十分開発に貢献できる事の証拠とも言えます。
今後も、Mercurial に関して疑問/質問/要望等があれば、お気軽に情報をお寄せください > 利用者の皆様

情報をお寄せ頂く手段に関しては、"Mercurial で困った時に" をお読みください。
また、抽出が大変だったので本エントリでは列挙しませんでしたが、メッセージ翻訳に関する不具合報告/要望等も随時反映しておりますので、こちらに関してもお気軽にお知らせください&お知らせ頂いた皆様、ありがとうございました!

なお、以前のものは、以下から参照できます。

本体に取り込まれた修正(changed by 藤原)

以下に列挙するものは、コミュニティからの情報を元に私が提案した修正のうち、Mercurial 本体に取り込まれたものです。
なお、私の手による修正履歴一覧から、記憶を頼りに目視で抽出したものなので、『俺の情報を元にパッチ作成しておいて手柄を独り占めかよ!?』的なものに心当たりがある方は、お気軽に情報をお寄せください(笑)。

● コマンド名省略時の紛らわしさ判定

というツイートを元に提案した、以下の修正が取り込まれました。

● ウェブ UI での comparison と diff の差異

日本語 ML に以下の様な報告がありました。

hgweb.cgiで同じ対象を表示した場合comparisonとdiffで変更箇所の指摘が違っているのは正常なのでしょうか?
状況としては comparisonでは正常に表示されているのですが、diffを選択すると何も表示されないということがまれに良くあります。

状況確認等の結果、comparison が想定外の差分を表示していることが判明し、問題を解消する以下の修正が取り込まれました。

また、この修正を行う際のソースコード確認の過程で、comparison 周りの以下の問題も修正することができました。

  • 50981ce36236: hgweb: show as same parents as "hg parents -r REV FILE" in pages for file
  • 92fab48dfec1: hgweb: show revisions and hashes gotten from changelog in "comparison" page

● keyword エクステンション併用時のマージ失敗

というツイートを元に提案した、以下の修正が取り込まれました。

  • 65dd65c645ed: keyword: suppress keyword expansion while 'hg rebase' for internal merge

また、実装状況を確認してみたところ、内部的にマージ処理を実施してる rebase 以外のコマンドでも、同様の問題が発生する可能性があったので、以下の修正もまとめて取り込んでもらいました。

  • 99f7e5fe35f2: keyword: suppress keyword expansion while 'hg unshelve' for internal merge
  • dd5ca1a32109: keyword: suppress keyword expansion while 'hg graft' for internal merge
  • 5c64c338fa9f: keyword: suppress keyword expansion while 'hg backout' for internal merge
  • e22cfd1ae97c: keyword: suppress keyword expansion while 'hg histedit' for internal merge
  • 2668a78df8ba: keyword: suppress keyword expansion while 'hg fetch' for internal merge

● git サブモジュール設定ファイルの破棄を含むリビジョンからの変換

日本語 ML に以下の様な報告がありました。

phabricatorのソースコードをgitからhgにコンバートしようとしたところ、エラーが発生して途中で変換が止まってしまいます。

状況確認等の結果、変換元リビジョンで git のサブモジュール設定ファイルが破棄された場合に関する対処が不適切だったことが判明し、問題を解消する以下の修正が取り込まれました。

  • 3420346174b1: convert: detect removal of ".gitmodules" at git source revisions correctly

● 非 ASCII 文字の使用に関する問題

以下の様なツイートを見かけたのですが:

「(コミット文字列の)問答無用チョップ」のところで、以前日本語 ML に後藤さん本人が、以下の様な投函をしていたことを思い出しました。

症状としては、一言で言うと漢字のコミットメッセージだとよろしくないことがある、というやつです。
もう少し言うと、hg histedit コマンド実行で、編集指示用のテキストファイルをエディタで開きますが、これが2バイト目を失った不完全なSJISのテキストとなることがあるという症状。
emacsなどのような自動文字コード検出のものだとsjisと解釈されずにバケバケな状態で操作することになったりで不幸です。

確認したところ、後藤さん自身は暫定修正以後は、特に修正提案向けの作業をしていないとのことだったので、折角ですから関連修正をまとめて提案することにしました。

非 ASCII 文字列の切り落とし処理が、元々持っていた問題の解消を行う以下のパッチと:

  • d24969ee272f: encoding: add 'trim' to trim multi-byte characters at most specified columns
  • 86c2d792a4b7: util: replace 'ellipsis' implementation by 'encoding.trim'
  • b515c3a63e96: encoding: add 'leftside' argument into 'trim' to switch trimming side

非 ASCII 文字列の可能性がある箇所での、文字列切り落としと、表示カラム幅算出を、適切に行うための以下のパッチ:

  • 50fd3a36d166: histedit: use 'util.ellipsis' to trim description of each changesets
  • be4270d27a7e: progress: use 'encoding.trim' to trim output line correctly
  • e382cf9ec30b: progress: use 'encoding.colwidth' to get column width of output line correctly
  • ba7f75e7f4e5: progress: use 'encoding.trim' to trim items in output line correctly
  • f9c91c638378: progress: use 'encoding.colwidth' to get column width of items correctly
  • 78e56e70c70a: filemerge: use 'util.ellipsis' to trim custom conflict markers correctly

そして、文字コード混在によるマージ対象ファイルの破壊を防ぐために、[ui] mergemarkers のデフォルト値を basic にする以下のパッチが取り込まれました。

  • 10abc3a5c6b2: filemerge: use 'basic' as the default of '[ui] mergemarkers' for safety

● コミットメッセージ編集時初期テキストのカスタマイズ

というツイートを元に提案した、以下の修正が取り込まれました。

  • 5375ba75df40: cmdutil: make commit message shown in text editor customizable by template

実際には、当該修正を成立させる準備+関連機能の障害修正+利便性確保といった理由から、上記修正と前後して 74 個の修正を実施しています(笑)

詳細は別エントリ「コミットログ入力画面カスタマイズ機能実現の顛末」にて。

WinMerge のオプション解析問題

元々 isseu4463 として開発者 ML に情報が流れたこと自体は認識していたのですが、報告内容をざっと見て、「実行時の追加オプションとかの話かな?」と、比較的軽く考えていました。

しかし、以下のツイートを目にして改めて動作確認してみたところ、これまで WinMerge を使用できていた環境でも使用できなくなることを認識。

最終的に、以下の修正が取り込まれました。

  • 4075f2f8ea53: extdiff: avoid unexpected quoting arguments for external tools (issue4463)

なお、修正が有効になるのは、Mercurial 3.3 からになりますので、Mercurial 3.2.1 〜 3.2.3 では問題が発生します。

暫定対応方式等に関しては、日本語MLへ投函した情報を参照してください。

● コミットログ編集機能での diff() の使用

原因の特定と修正・確認まで済んでいて、後はパッチを投函するだけなのですが、Matt が年末年始休暇に入ったらしく、パッチの消化が止まってしまっているため、年明けまでの持越しとなりそう……で、予想通り、年明けに取り込まれました。

  • 1e6fb8db666e: context: avoid breaking already fixed self._status at ctx.status()

修正作業/パッチ投函/日付情報のいずれも 2014 年なので、「2014年の成果」に含めても問題ないでしょう。除外すると、2015年末の集計作業が面倒ですし(笑)

また、関連障害として:

上記の修正も取り込まれました。

  • bfce25d25c96: context: override _dirstatestatus in workingcommitctx for correct matching

本体に取り込まれた修正(changed by other)

● gvimdiff による差分表示・マージのための設定

上記のやり取りが契機となって、設定ファイルに記述を追加するための、西原さんの手による以下の修正が取り込まれました。

  • 33020e87f8c5: mergetools: add --nofork option to gvimdiff.diffargs for extdiff

ちなみに、ブログエントリ「Mercurial/TortoiseHg での差分表示に外部ツールを使う設定」は、このやりとりを契機に書いたものです。

何らかの成果に結びついたもの

以下は、Mercurial 本体には取り込まれていませんが、コミュニティからの要望を契機に、何らかの成果に結びついたものです。

● 間接参照テンプレートフィルタ機能

通常のテンプレートキーワードは、「表示対象のリビジョンのメタデータ」を取得します。

しかし、色々込み入ったことをやろうとすると、場合によっては「表示対象リビジョンの親のメタデータ」が欲しい、といったケースもあります。

メタデータ間接参照テンプレートフィルタエクステンションは、元々は別な用途向けに手元でチマチマ作っていたのですが、上記ツイートを受けて、急いで仕上げて公開したものです。

● 実行権限ビット変更の無視

実行権限ビットの変更を無視するエクステンションは、以下のツイートを契機に実装しました。

● ブログエントリ

以下のツイートは、ブログエントリ執筆の必要性を感じた動機付けツイートです。

2013年やそれ以前のものも含まれていますが(笑)、とりあえず「2014年に公開したブログエントリの契機」基準で列挙します。

並行した複数ファイルへの改名(divergent rename)

インストーラ経由でのMercurial のインストールに関する設定

ファイルを登録除外したリビジョンの検出

Mercurial のパターン指定におけるディレクトリ相対性/合致条件

Mercurial + Subversion 連携時の注意点

リポジトリホスティング使用時の .hgsub 記述

複数ルートなブランチの全ての差分の取得

バックログ

以下は、コミュニティにおける要望のうち、私の個人的な TODO リスト(2014 年版)に積まれているものです。

例によって、誰かが横取りしてやってくれても全然構いません。っていうか横取り大歓迎です(笑)。

● 履歴編集におけるタグ・ブックマーク付きリビジョンへの配慮

これ以外にも、MQ や rebase、shelve、 strip といった履歴改変系機能において、タグやブックマークで参照されているリビジョンが改変されるケースに対しては、せめて警告表示ぐらいは欲しいところですね。

タグ・ブックマークの「自動」追従は、厳密性とかから色々微妙かもしれませんが、「推奨される事後操作」(例: 「hg tag -r XXXX FOO-BAR を実施しては?」表示等)みたいなものを提示するとかも検討してみたいところ。

Windows 上での CVS からの変換

CVS の管理情報ファイル (CVS ディレクトリ配下のアレ) が DOS 改行になっていると、hg convert が失敗する件は、一応修正の目処はついているのですが、もう一つの cvs rlog が失敗する件は、原因が不明なままなんですよねぇ……

ひょっとしたら、cygwin cvs で checkout した領域を、(hg convert から起動された) Windows ネイティブな CVS で rlog しようとし失敗しているとか?

(2015-01-19 追記) cvs rlog の実行が失敗する件は、CVSNT の cvs コマンドが、先述した WinMerge同様の問題を持っていることが原因でした。詳細はこちらのエントリをご覧ください。

● オンラインヘルプの強化周り

オンラインヘルプの記述を強化することで、混乱を回避できそうな件に関するツイートがいくつかあります。

default での略称使用に対する注記とか:

keyword エクステンションにおける、各ファイルの "node" キーワードの意味とか:

.hgignore の部分合致に関する詳細とか:

revsets 表記の "+"/"-" 演算子は、算術演算の優先順位とは感覚が違う件とか: