テンプレート関数 revset() の利用
hg log で特定のファイルの履歴を取る時に そのファイルの変更リビジョンから次の変更の直前までにあるすべてのタグを同時に取得する方法は何かないですかねえ?
#mercurialjp
— Kaz Nishimura (@kazssym) 2014, 8月 8
上記ツイートを契機としたやり取りの過程で、Mercurial 3.0 からテンプレート定義中で revset()
が使えるようになったのを、すっかり失念していたことに気付きました……orz
このまま放置すると、また忘れてしまいそうなので、何か実際的な処理で使って、しっかり記憶しておきたいところです。
何か良い題材はないかと考えたところ、先日公開したrevsets に関するエントリで例示している以下の処理が、まさに revset()
のユースケースにピッタリなことを思い出しました。
BRANCH=foo hg log -r "roots(branch($BRANCH))" --template "{rev}\n" | while read root do hg log -r "heads(descendantsin($root, branch($BRANCH)))" \ --template "$root {rev}\n" done | while read start end do hg diff -r "p1($start)" -r "$end" done
なお、while ループ内での revsets 問い合わせが非常に複雑なので、簡略化のため以下の様なエイリアス descendantsin
の定義を仮定しています。
[revsetalias] descendantsin($1, $2) = (($1)::) and ($2) and not (((($1)::) and not ($2))::)
但し、エントリ執筆時点の最新版である Mercurial 3.1 では、revsetalias によるエイリアス定義は revset()
の中で使用できません…… orz なので、例としてはエイリアス定義を使っていますが、実際の利用ではエイリアス定義を使わないようにしてください。
(※ 2014-08-28 追記) 修正が取り込まれましたので、2014-11 にリリースされる 3.2 からは、revset()
中でもエイリアスが使えるようになります。
元の処理では、hg log
を二段重ねにしていますが、テンプレート関数 revset
を使うことで、これらを単一の hg log
に集約することができます。
OpenSolaris 勉強会 2014.07
日本OpenSolarisユーザーグループ主催の Tokyo OpenSolaris 勉強会 2014.07 に参加してきました。
今回は、いつもの Solaris Internals 枠に加えて、「OpenSolarisを移植しよう 〜DEC Alphaの場合〜」と題して、林さんによる DEC Alpha プロセッサへの OpenSolaris 移植の状況報告がありました。
移植の裏話もさることながら、OpenSolaris におけるアドレス境界違反周りの対応に関する情報が、個人的には一番衝撃的な話でしたが、ソースコードの確認とか、実環境での検証とかがあるため、詳細は追って別エントリとして公開しようと思います。
っていうか、詳細を書こうと思っていたら、参加報告エントリの公開が、丸々一ヶ月程遅れてしまったので、とりあえず後回しにするだけなのですが……
Solaris Internals 枠は順調に進んでいて、この調子なら 2014.08 で "Chapter 11: Kernel Memory" は読了できそうな感じですね。
Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture
- 作者: Richard Mauro, Jim McDougall
- 出版社/メーカー: Prentice Hall
- 発売日: 2006/07/10
- メディア: ハードカバー
- 購入: 2人 クリック: 28回
- この商品を含むブログ (16件) を見る
コミットログ入力画面カスタマイズ機能実現の顛末
いつもであれば、年末の振り返りで他の修正と一緒に、「利用者から要望のあった○○○○に対処するパッチを投げて、取り込んでもらいました」で終わらせるところなのですが、下準備のために相当量のパッチを投げる必要があったので、備忘録代わりに公開しておきます。
(2014-09-17 追記) 総計 75 個の修正をもって、この機能に関する対応は一段落しました。
事の始まり
2012年からの個人的なバックログとして、「コミットログ入力画面のカスタマイズ機能」がありました。
Mercurialのコミットメッセージのテンプレート(コミットコメントを編集するためにエディタに渡される一時作成されるファイルの内容)を変更したい場合ってどうしたらいいんでしょうか? #mercurialjp
— きょん@うさみみモード (@kyon_mm) 2012, 5月 10
列挙系情報 (例: ファイル一覧等) に対するテンプレート機能が強化されている現状なら、初期表示内容をテンプレート機能で生成する実装に置き換えてやれば、比較的簡単に実現できるだろう、というのが、当初の目論見でした。
複数ルートなブランチの全ての差分の取得
本ブログエントリで最初に思い付いた暫定版を公開してから、色々指摘を受けて修正した結果、以下の方法なら行けそう、という結論に達しました。
# 対象ブランチ名を指定 BRANCH=foo hg log -r "roots(branch($BRANCH))" --template "{rev}\n" | while read root do # 複数ヘッド化を検出する場合はここで実施 hg log -r "heads($root:: and branch($BRANCH) and not ($root:: and not branch($BRANCH))::)" --template "$root {rev}\n" done | while read start end do hg diff -r "p1($start)" -r "$end" done
外部スクリプト無しで、ぎりぎりワンライナー化できる範囲ではありますね。
(2014-08-22 追記) テンプレート関数 revset()
を使った書き換えに関するエントリを公開しました。
上記は POSIX 系環境での B shell 系シェルによる実行を前提にしたものですが、いわたさんが Windows 向けのものを公開しています。
記述内容解説
2つの revsets 記述のうち:
"roots(branch($BRANCH))"
最初の方は以下のような意味を持ちます。これは簡単ですね。
Mercurial/TortoiseHg での差分表示に外部ツールを使う設定
本エントリでは、Mercurial/TortoiseHg で差分表示を行う際に、外部ツールを使いたい場合の設定方法について説明します。
注意: Windows 環境で実行する場合、Mercurial 3.2.1 〜 3.2.4 では、適切に設定されていても、外部マージツールの起動が失敗してしまう可能性がありますので、これら以外の版を使用するようにしてください。
当初は、外部ツールを使ったマージに関する設定も、一緒に説明しようと思っていたのですが:
- 差分表示に比べると、マージの動作確認は面倒 (マージ前の状態を作る必要がある)
- 簡略化しても、説明全体が結構な分量になる
以上のような理由から、まずは外部ツールによる差分表示に関して、説明しようと思います。
多くの場合、マージツールは差分表示ツールを兼ねていますので、「外部ツールの利用はマージだけ」という場合でも、とりあえずは差分表示に関する設定を通して、外部ツールを使用する際の要領を掴んでおくのが良いと思います。
なお、本エントリでは、設定項目に関する網羅的な説明は行いません。
「余計な説明はいらないから、設定に関する網羅的な情報が欲しい!」という方は、"hg help config
" 出力中の "merge-tools" に関する項目を参照してください (日本語訳はネット上でも参照可能です)
「網羅的な情報が欲しいが、多少は解説的なものも欲しい」という方は、いわたさんによる "External Diffのはなし" を参照してみてください。
ちなみに、設定ファイルの記述形式や配置場所に関して、基本的な知識はあるものと仮定します。不安な方は、"hg help config
" 出力冒頭の説明等を参照してください。
以下、使えるようにしたいツールの名前を、便宜上 mytool
と表記しますので、使用するツールに応じて適宜読み替えてください。
OpenSolaris 勉強会 2014.06
日本OpenSolarisユーザーグループ主催の Tokyo OpenSolaris 勉強会 2014.06 に参加してきました。
今回は、丸々 Solaris Internals 枠として使えたので、前回〜前々回を振り返りつつ、第11章「Kernel Memory」の、Slab アロケータ実装の詳細や、vmem アロケータの話などをみっちりと。
Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture
- 作者: Richard Mauro, Jim McDougall
- 出版社/メーカー: Prentice Hall
- 発売日: 2006/07/10
- メディア: ハードカバー
- 購入: 2人 クリック: 28回
- この商品を含むブログ (16件) を見る
次回は "11.3.4 Vmem Implementation" からです。
ここ数回は、比較的快調なペースで進んでいますから、この調子で進められれば、あと2回〜3回ぐらい(=年内)に読み終えられれそうな感じですね。