彷徨えるフジワラ

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

テンプレート関数 revset() の利用

上記ツイートを契機としたやり取りの過程で、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

Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture

コミットログ入力画面カスタマイズ機能実現の顛末

いつもであれば、年末の振り返りで他の修正と一緒に、「利用者から要望のあった○○○○に対処するパッチを投げて、取り込んでもらいました」で終わらせるところなのですが、下準備のために相当量のパッチを投げる必要があったので、備忘録代わりに公開しておきます。

(2014-09-17 追記) 総計 75 個の修正をもって、この機能に関する対応は一段落しました。

事の始まり

2012年からの個人的なバックログとして、「コミットログ入力画面のカスタマイズ機能」がありました。

列挙系情報 (例: ファイル一覧等) に対するテンプレート機能が強化されている現状なら、初期表示内容をテンプレート機能で生成する実装に置き換えてやれば、比較的簡単に実現できるだろう、というのが、当初の目論見でした。

続きを読む

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

本ブログエントリで最初に思い付いた暫定版を公開してから、色々指摘を受けて修正した結果、以下の方法なら行けそう、という結論に達しました。

# 対象ブランチ名を指定
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

Solaris Internals: Solaris 10 and OpenSolaris Kernel Architecture

次回は "11.3.4 Vmem Implementation" からです。

ここ数回は、比較的快調なペースで進んでいますから、この調子で進められれば、あと2回〜3回ぐらい(=年内)に読み終えられれそうな感じですね。

Mercurial のブランチ、ブックマーク、タグの名前で使用を回避すべき文字

暫く前に、本家のユーザ ML 宛てに以下の質問が寄せられていました。

元々禁止されている文字以外に、ブランチ、ブックマーク、タグの名前に、使うべきではない文字ってある? (意訳)

Mercurial では、以下の名前と:

  • tip
  • . (ドット)
  • null
  • 数字のみで構成された名前

以下の文字を使用したブランチ、ブックマーク、タグの新規作成は、事前検出で「不正な名前」とみなされ、処理が中断されます。

  • ":" (コロン)
  • "\0" (ヌル文字)
  • "\n" (LF)
  • "\r" (CR)

ML でのやり取りでは、上記のものに加えて、以下の文字の使用は回避すべき、という意見が出されました。

続きを読む