foozy@708: \chapter{Adding functionality with extensions} foozy@708: \label{chap:hgext} foozy@708: foozy@708: Mercurial は機能性の見地から見た場合には申し分無い一方で、 foozy@708: 変り種の機能群は故意に除外されています。 foozy@708: 簡潔さを保つ遣り方は、 foozy@708: 保守担当と利用者の両方に対してソフトウェアの扱いやすさを維持します。 foozy@708: foozy@708: しかし Mercurial は、 foozy@708: 利用者を杓子定規なコマンド群の只中に利用者を閉じ込めるようなことはしません。 foozy@708: \emph{イクステンション} foozy@708: (この種のものは\emph{プラグイン}と呼ばれることもあります) foozy@708: として機能を追加することができるのです。 foozy@708: 幾つかのイクステンションについては、 foozy@708: 既に前の章で話題にしています。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item \ref{sec:tour-merge:fetch}~節では foozy@708: \hgext{fetch} イクステンションを取り上げています。 foozy@708: このイクステンションは、新たな変更の取得と手元の変更へのマージを、 foozy@708: 単一のコマンド \hgxcmd{fetch}{fetch} で実施します。 foozy@708: foozy@708: \item \hgext{bisect} は、 foozy@708: バグの原因となる変更を効率的に検索するイクステンションで、 foozy@708: \ref{sec:undo:bisect}~節で取り上げました。 foozy@708: foozy@708: \item \ref{chap:hook}~章では、 foozy@708: フックに関連した有用な機能を持つイクステンションを取り上げました。 foozy@708: \hgext{acl} はアクセスコントロールリストの機能を、 foozy@708: \hgext{bugzilla} は Bugzilla バグ追跡システムとの統合を、 foozy@708: \hgext{notify} は変更追加時における電子メール通知の機能を、 foozy@708: Mercurial に追加します。 foozy@708: foozy@708: \item Mercurial Queues パッチ管理イクステンションは、 foozy@708: 2つの章と1つの appendix を丸々費やすに値する価値を持っています。 foozy@708: \ref{chap:mq}~章は基本を、 foozy@708: \ref{chap:mq-collab}~章はより進んだ話題を、 foozy@708: そして appendix~\ref{chap:mqref} は各コマンドの詳細を取り上げています。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: 本章では、 foozy@708: 上記以外の Mercurial で利用可能な幾つかのイクステンションについて取り上げ、 foozy@708: その上で、 foozy@708: 自分でイクステンションを実装する際に必要と思われる仕組みについて、 foozy@708: 簡単に触れようと思います。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item \ref{sec:hgext:inotify}~節では、 foozy@708: \hgext{inotify} foozy@708: イクステンションによる\emph{絶大な}性能改善の可能性について取り上げます。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: \section{Improve performance with the \hgext{inotify} extension} foozy@708: \label{sec:hgext:inotify} foozy@708: foozy@708: 一般的な Mercurial の操作が 100 倍速くなることに興味があるのでしたら、 foozy@708: ぜひこの節を読んでください。 foozy@708: foozy@708: Mercurial は通常の環境であっても高い性能でを発揮します。 foozy@708: XXXX 否定の接続の筈 XXXX foozy@708: 例えば \hgcmd{status} コマンドの実行の際には、 foozy@708: ファイルの状態を表示するために、 foozy@708: リポジトリ配下の殆ど全てのディレクトリとファイルに対する走査が必要です。 foozy@708: 他の多くの Mercurial コマンドも、 foozy@708: 舞台裏では同様の作業を必要としています。 foozy@708: 例えば \hgcmd{diff} コマンドは、 foozy@708: 状態比較機構\footnote{訳注: \ref{sec:concepts:dirstate}~節参照 foozy@708: }を用いることで、 foozy@708: 明らかに変更されていないファイルに対して、 foozy@708: 実行コストの高い比較処理が実施されることを回避しています。 foozy@708: foozy@708: ファイル状態の取得は性能確保上重要なことなので、 foozy@708: Mercurial の開発者達は、 foozy@708: ギリギリのところまでこの部分の実装を最適化してきました。 foozy@708: しかし \hgcmd{status} 実行の際には、 foozy@708: 前回の確認以降の変更の有無を知るために、 foozy@708: コストの高いシステムコールを、 foozy@708: Mercurial の管理下にあるファイル毎に最低1回発行する必要がある、 foozy@708: という事実は回避しようがありません。 foozy@708: 一定以上の大きさのリポジトリでは、 foozy@708: この処理には長い時間がかかります。 foozy@708: foozy@708: 影響の大きさを数値化すべく、 foozy@708: 150,000 のファイルを管理するリポジトリで実験を行った結果、 foozy@708: いずれのファイルも変更\emph{されていない}場合であっても、 foozy@708: \hgcmd{status} の実行には10秒を要します。 foozy@708: foozy@708: 多くの近代的 OS は、ファイル更新の通知機構を備えています。 foozy@708: 適切なサービスにプログラムを登録しておくことで、 foozy@708: 対象となるファイルに関する生成・変更・削除といったイベントが発生する都度、 foozy@708: OS が通知をしてくれます。 foozy@708: Linux 環境では、 foozy@708: \texttt{inotify} foozy@708: と呼ばれるカーネルコンポネントが通知機構を提供します。 foozy@708: foozy@708: Mercurial の \hgext{inotify} イクステンションは、 foozy@708: カーネルの \texttt{inotify} と連携することで、 foozy@708: \hgcmd{status} コマンドを最適化します。 foozy@708: \hgext{inotify} イクステンションは2つの要素から構成されています。 foozy@708: デーモン部分がバックグラウンドで稼動することで、 foozy@708: \texttt{inotify} カーネルコンポネントから通知を受け取ります。 foozy@708: デーモン部分は、 foozy@708: 通常の Mercurial コマンドからの接続要求も受け付けます。 foozy@708: \hgext{inotify} イクステンションは、 foozy@708: ファイルシステムの走査の代替としてデーモンを必要とするため、 foozy@708: Mercurial の挙動そのものを改変します。 foozy@708: デーモンはリポジトリ状態に関する完全な情報を保持しているので、 foozy@708: リポジトリ配下のディレクトリやファイルを走査すること無しに、 foozy@708: 即座に応答を返すことができます。 foozy@708: foozy@708: 先に述べたとおり、 foozy@708: 通常の Mercurial では、 foozy@708: 150,000 のファイルを管理するリポジトリでの foozy@708: \hgcmd{status} 実行に10秒を要しました。 foozy@708: \hgext{inotify} イクステンションを有効にすることで、 foozy@708: 実行に要する時間は\emph{1000倍}早い0.1~秒まで低減できました。 foozy@708: foozy@708: 話を先に進める前に、 foozy@708: 以下の点に注意してください。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item \hgext{inotify} は Linux 環境固有のイクステンションです。 foozy@708: Linux の \texttt{inotify} サブシステムと直接連携するため、 foozy@708: 他の OS 環境下では機能しません。 foozy@708: foozy@708: \item 2005 年初旬以後にリリースされた foozy@708: Linux ディストリビューションでの利用をお薦めします。 foozy@708: それ以前のディストリビューションは、 foozy@708: \texttt{inotify} が組み込まれていないか、 foozy@708: 必要な API を \texttt{glibc} が提供していないものと思われます\footnote{ foozy@708: 訳注: man ページによれば、 foozy@708: \texttt{inotify} の利用に当たっては、 foozy@708: 2.6.13 版以後のカーネルと 2.4 版以後の \texttt{glibc} が必要だそうです。 foozy@708: }。 foozy@708: foozy@708: \item 全てのファイルシステムが foozy@708: \hgext{inotify} イクステンションの利用に適しているとは限りません。 foozy@708: 典型的な例としては、 foozy@708: 同一のネットワークファイルシステムを、 foozy@708: Mercurial を稼動させる複数のシステムでマウントしているような場合です。 foozy@708: カーネルの \texttt{inotify} サブシステムは、 foozy@708: リモートホストでの変更を知る術を持ちません。 foozy@708: 殆どのローカルファイルシステム(例えば ext3、XFS や ReiserFS)は、 foozy@708: 上手く機能する筈です。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: \hgext{inotify} イクステンションは、 foozy@708: 2007 年 5 月の時点では Mercurial に同梱されていません\footnote{訳注: foozy@708: 2007 年 10 月の 0.9.5 版段階でも同梱されていません}ので、 foozy@708: 他のイクステンションと比較して多少の準備作業が必要ですが、 foozy@708: 性能向上にはそれだけの価値があります。 foozy@708: foozy@708: \hgext{inotify} イクステンションは目下、 foozy@708: Mercurial ソースコードへのパッチと、 foozy@708: \texttt{inotify} サブシステム連携の foozy@708: Python バインディングライブラリの2つの要素から構成されています。 foozy@708: foozy@708: \begin{note} foozy@708: \texttt{inotify} の foozy@708: Python バインディングライブラリには\emph{2種類}あります。 foozy@708: 1つは \texttt{pyinotify} と呼ばれるもので、 foozy@708: 幾つかの Linux ディストリビューションには foozy@708: \texttt{python-inotify} という名前で同梱されています。 foozy@708: 実用に供するには非常にバグが多く効率も悪いので、 foozy@708: このライブラリは使うべきでは\emph{ありません}。 foozy@708: \end{note} foozy@708: foozy@708: 事を進めるに当たっては、 foozy@708: 既に機能しているインストール済み foozy@708: Mercurial を複製するのが良いでしょう。 foozy@708: To get going, it's best to already have a functioning copy of foozy@708: Mercurial installed. XXXXXX foozy@708: foozy@708: \begin{note} foozy@708: 以下の手順を踏む場合、 foozy@708: 最も最新の``最先端な''Mercurial 実装で、 foozy@708: 既にインストール済みの Mercurial を\emph{置き換える}ことになります。 foozy@708: これは警告です。 foozy@708: \end{note} foozy@708: foozy@708: \begin{enumerate} foozy@708: \item \texttt{inotify} の Python バインディングのリポジトリを複製します。 foozy@708: ビルドおよびインストールを行ってください。 foozy@708: foozy@708: \begin{codesample4} foozy@708: hg clone http://hg.kublai.com/python/inotify foozy@708: cd inotify foozy@708: python setup.py build --force foozy@708: sudo python setup.py install --skip-build foozy@708: \end{codesample4} foozy@708: foozy@708: \item Mercurial の \dirname{crew} リポジトリを複製します。 foozy@708: Mercurial Queues により foozy@708: \dirname{crew} リポジトリのローカルコピー\footnote{訳注: foozy@708: ここでは \dirname{crew} から更に \dirname{inotify} を複製していますが、 foozy@708: \hgext{inotify} イクステンション利用のためだけにビルドする場合、 foozy@708: 直接 \dirname{crew} で作業しても問題無い筈です。 foozy@708: }にパッチを当てる為に、 foozy@708: \hgext{inotify} パッチのリポジトリも複製してください。 foozy@708: foozy@708: \begin{codesample4} foozy@708: hg clone http://hg.intevation.org/mercurial/crew foozy@708: hg clone crew inotify foozy@708: hg clone http://hg.kublai.com/mercurial/patches/inotify inotify/.hg/patches foozy@708: \end{codesample4} foozy@708: foozy@708: \item Mercurial Queues イクステンション(\hgext{mq}) foozy@708: が利用可能であることを確認してください。 foozy@708: MQ を利用したことが無い場合、 foozy@708: まずは \ref{sec:mq:start}~節を読んでください。 foozy@708: foozy@708: \item \dirname{inotify} (ローカル)リポジトリに移動して、 foozy@708: \hgxcmd{mq}{qpush} コマンドの \hgxopt{mq}{qpush}{-a} オプションを使用して、 foozy@708: 全ての \hgext{inotify} パッチを適用してください。 foozy@708: foozy@708: \begin{codesample4} foozy@708: cd inotify foozy@708: hg qpush -a foozy@708: \end{codesample4} foozy@708: foozy@708: \hgxcmd{mq}{qpush} がエラーメッセージを表示した場合は、 foozy@708: 作業を継続せずに開発コミュニティに助けを求めてください。 foozy@708: foozy@708: \item パッチ適用版の Mercurial をビルドおよびインストールします。 foozy@708: foozy@708: \begin{codesample4} foozy@708: python setup.py build --force foozy@708: sudo python setup.py install --skip-build foozy@708: \end{codesample4} foozy@708: foozy@708: \end{enumerate} foozy@708: foozy@708: 適切にパッチが適用された版の Mercurial が一旦できてしまえば、 foozy@708: \hgext{inotify} イクステンションを有効にするために必要なことは、 foozy@708: \hgrc ファイルに以下の記述を追加することだけです。 foozy@708: foozy@708: \begin{codesample2} foozy@708: [extensions] foozy@708: inotify = foozy@708: \end{codesample2} foozy@708: foozy@708: \hgext{inotify} イクステンションが有効化されると、 foozy@708: リポジトリの状態を必要とするコマンドの初回起動の時点で、 foozy@708: Mercurial は自動的且つ透過的に状態管理用デーモンを起動します。 foozy@708: 状態管理デーモンは、リポジトリごとに起動されます。 foozy@708: foozy@708: 状態管理デーモンはひそやかに起動され、バックグラウンドで実行し続けます。 foozy@708: \hgext{inotify} イクステンションを有効にした複数のリポジトリで、 foozy@708: 幾つかのコマンドを実行した後に、 foozy@708: 実行中のプロセス一覧を見れば、 foozy@708: カーネルからの通知と foozy@708: Mercurial からの問い合わせの両方を待っている複数の foozy@708: \texttt{hg} プロセスを見ることができる筈です。 foozy@708: foozy@708: \hgext{inotify} イクステンションを有効にした際でも、 foozy@708: リポジトリにおける Mercurial コマンドの初回起動は、 foozy@708: 通常の Mercurial コマンド実行と同程度の性能で実行されます。 foozy@708: これは状態管理デーモンによる通常の状態走査が必要なためで、 foozy@708: 後にカーネルからの更新通知を受け取る際の基底状態となります。 foozy@708: しかし、これ以降の状態確認の必要な\emph{全ての}コマンド実行は、 foozy@708: どんなに小さなサイズのリポジトリであっても、 foozy@708: 目に見えて速くなっている筈です。 foozy@708: リポジトリが大きければ大きいほど、 foozy@708: 目に見えて性能が大きく改善されることでしょう。 foozy@708: \hgext{inotify} デーモンは、 foozy@708: どんなサイズのリポジトリであっても、 foozy@708: 状態取得操作を殆ど瞬時に終了させることができます。 foozy@708: foozy@708: \hgxcmd{inotify}{inserve} コマンドにより、 foozy@708: 状態管理デーモンを手動で起動することもできます。 foozy@708: 手動での起動により、 foozy@708: デーモンの実行に関して幾分明瞭な制御を手にすることができます。 foozy@708: このコマンドの起動は、 foozy@708: 当然 \hgext{inotify} foozy@708: イクステンションが有効になっている場合に限り使用可能です。 foozy@708: foozy@708: \hgext{inotify} イクステンションを使用している際には、 foozy@708: 状態関連コマンドの実行全般がそれ以前と比較して速くなっている点を除けば、 foozy@708: Mercurial の挙動は\emph{全く変わらない}筈です。 foozy@708: foozy@708: とりわけ、コマンドの出力は異ならず、同じ結果を返す筈です。 foozy@708: \hgext{inotify} イクステンションの有無で異なる結果が変える場合、 foozy@708: 障害として報告をしてください。 foozy@708: foozy@708: \section{Flexible diff support with the \hgext{extdiff} extension} foozy@708: \label{sec:hgext:extdiff} foozy@708: foozy@708: Mercurial の組み込み \hgcmd{diff} コマンドは、 foozy@708: unified 差分をそのまま出力します。 foozy@708: foozy@708: \interaction{extdiff.diff} foozy@708: foozy@708: 変更内容の表示に外部ツールを使いたい場合は、 foozy@708: \hgext{extdiff} イクステンションが良いでしょう。 foozy@708: \hgext{extdiff} イクステンションにより、 foozy@708: 変更内容表示に例えばグラフィカルな外部差分ツールが利用できるようになります。 foozy@708: foozy@708: \hgext{extdiff} イクステンションは foozy@708: Mercurial に同梱されているので簡単に利用できます。 foozy@708: \hgrc ファイルの foozy@708: \rcsection{extensions} セクションに、 foozy@708: イクステンションを有効にする記述を1行追加するだけで良いのです。 foozy@708: foozy@708: \begin{codesample2} foozy@708: [extensions] foozy@708: extdiff = foozy@708: \end{codesample2} foozy@708: foozy@708: この設定により、 foozy@708: \hgxcmd{extdiff}{extdiff} コマンドが利用可能になりますが、 foozy@708: 基底状態ではこのコマンドは、 foozy@708: 組み込みの \hgcmd{diff} コマンドと同じ形式の unified 差分を、 foozy@708: システムの \command{diff} コマンドにより生成します。 foozy@708: foozy@708: \interaction{extdiff.extdiff} foozy@708: foozy@708: 組み込みの \hgcmd{diff} コマンドの結果出力と厳密には一致しません\footnote{ foozy@708: 訳注: どの部分を指して「一致しない」と言っているのか?}が、 foozy@708: 同じオプションを指定してもシステム\footnote{訳注: foozy@708: ここで言う「system」とは? XXXXX}ごとに foozy@708: (システムの)\command{diff} コマンドの出力が異なるからです。 foozy@708: foozy@708: 上記の出力結果に ``\texttt{making snapshot}'' foozy@708: 行が含まれていることからも察することができますが、 foozy@708: \hgxcmd{extdiff}{extdiff} foozy@708: コマンドはソースツリーに関するスナップショットを2つ作成します。 foozy@708: 1つ目のスナップショットはソースのリビジョンのもので、 foozy@708: 2つ目は作業領域ディレクトリにおける対象リビジョンのものです\footnote{訳注: foozy@708: 作業領域ディレクトリの「親リビジョン」と「現行状態」}。 foozy@708: \hgxcmd{extdiff}{extdiff} foozy@708: コマンドはこれらのスナップショットを一時ディレクトリに作成し、 foozy@708: これらのディレクトリ名を引数にして外部の差分表示ツールを起動し、 foozy@708: その後一時ディレクトリを削除します。 foozy@708: 実行効率上、 foozy@708: 2つのリビジョンの間で差分のあるディレクトリ・ foozy@708: ファイルのスナップショットだけが作成されます。 foozy@708: foozy@708: スナップショットディレクトリの名前は、 foozy@708: 元となるリポジトリのベース名と同じ名前を持ちます。 foozy@708: \dirname{/quux/bar/foo} というリポジトリの場合、 foozy@708: 個々のスナップショットのディレクトリ(ベース)名は \dirname{foo} となります。 foozy@708: 対応するチェンジセットIDがある場合、 foozy@708: スナップショットのディレクトリ名にはチェンジセットIDが付与されます。 foozy@708: \texttt{a631aca1083f} 版に対するスナップショットのディレクトリ名は foozy@708: \dirname{foo.a631aca1083f} となります。 foozy@708: 作業領域ディレクトリの現行状態に対するスナップショットは、 foozy@708: チェンジセットIDが付与されませんので、 foozy@708: この例では単に \dirname{foo} という名前になります。 foozy@708: 実際の挙動を見るために、 foozy@708: 再度前出の \hgxcmd{extdiff}{extdiff} の実行例を見てみましょう。 foozy@708: 差分出力のヘッダ部に、 foozy@708: スナップショットディレクトリの名前が埋め込まれているのに気付くことでしょう。 foozy@708: foozy@708: \hgxcmd{extdiff}{extdiff} コマンドには、 foozy@708: 2つの重要なオプションがあります。 foozy@708: \hgxopt{extdiff}{extdiff}{-p} オプションは、 foozy@708: システムの \command{diff} foozy@708: コマンドの代替として使用される差分表示プログラムを指定します。 foozy@708: \hgxopt{extdiff}{extdiff}{-o} オプションは、 foozy@708: \hgxcmd{extdiff}{extdiff} foozy@708: が外部の差分表示プログラム起動時に指定するオプション foozy@708: (デフォルトでは ``\texttt{-Npru}'' が指定され、 foozy@708: \command{diff} を使用する場合にのみ意味を持ちます) foozy@708: を指定します。 foozy@708: それ以外の点では、 foozy@708: \hgxcmd{extdiff}{extdiff} コマンドは foozy@708: 組み込みの \hgcmd{diff} コマンドと同様に振舞いますので、 foozy@708: オプション名やオプション指定の文法、 foozy@708: 比較対象リビジョンを指定する引数、 foozy@708: 比較したいファイル名の指定などは、 foozy@708: 組み込みの \hgcmd{diff} と同じように指定できます。 foozy@708: foozy@708: 実行例として、 foozy@708: (通常の \hgcmd{diff} による)unified 差分の代わりに、 foozy@708: システム標準の \command{diff} コマンドによる context 差分 foozy@708: (\cmdopt{diff}{-c} オプション使用)を、 foozy@708: デフォルトの3行ではなく5行の context 行 foozy@708: (\cmdopt{diff}{-C} オプションでの \texttt{5} 指定) foozy@708: で表示する方法を示します。 foozy@708: foozy@708: \interaction{extdiff.extdiff-ctx} foozy@708: foozy@708: グラフィカルな差分ツールの起動は非常に簡単です。 foozy@708: \command{kdiff3} 起動の例を示します。 foozy@708: foozy@708: \begin{codesample2} foozy@708: hg extdiff -p kdiff3 -o '' foozy@708: \end{codesample2} foozy@708: foozy@708: 利用する差分表示コマンドがディレクトリ指定を扱えない場合でも、 foozy@708: 簡単なスクリプトを使うことでその問題を解決できます。 foozy@708: そのようなスクリプトによる foozy@708: \hgext{mq} イクステンションと foozy@708: \command{interdiff} コマンドの連携例は、 foozy@708: \ref{mq-collab:tips:interdiff}~節を参照してください。 foozy@708: foozy@708: \subsection{Defining command aliases} foozy@708: foozy@708: \hgxcmd{extdiff}{extdiff} コマンドや利用する差分表示コマンドの、 foozy@708: 両方のオプションを覚えておくのは面倒ですので、 foozy@708: \hgext{extdiff} イクステンションは、 foozy@708: 使用する差分表示コマンドを正しいオプションで起動する foozy@708: \emph{新しい}コマンドを定義できるようになっています。 foozy@708: foozy@708: 新しいコマンド定義のために必要なのは、 foozy@708: \hgrc ファイルを編集し、 foozy@708: \rcsection{extdiff} という名前のセクションを追加するだけです。 foozy@708: このセクションでは、 foozy@708: 複数のコマンドを定義することができます。 foozy@708: 以下に \texttt{kdiff3} コマンドを追加する例を示します。 foozy@708: 一旦定義してしまえば、 foozy@708: ``\texttt{hg kdiff3}''と入力するだけで foozy@708: \hgext{extdiff} イクステンションが foozy@708: \command{kdiff3} を起動します。 foozy@708: foozy@708: \begin{codesample2} foozy@708: [extdiff] foozy@708: cmd.kdiff3 = foozy@708: \end{codesample2} foozy@708: foozy@708: 定義の右辺を上記例のように空にした場合、 foozy@708: \hgext{extdiff} イクステンションは、 foozy@708: 定義したコマンドの名前を実行すべき外部プログラムの名前と見なします。 foozy@708: しかし、これらの名前が一致している必要はありません。 foozy@708: 以下の例では、 foozy@708: \command{kdiff3} を実行するコマンドを foozy@708: ``\texttt{hg wibble}'' という名前で定義しています。 foozy@708: foozy@708: \begin{codesample2} foozy@708: [extdiff] foozy@708: cmd.wibble = kdiff3 foozy@708: \end{codesample2} foozy@708: foozy@708: 差分表示プログラム起動の際のデフォルトオプションも指定することができます。 foozy@708: ``\texttt{opts.}'' 接頭辞に続いて、 foozy@708: オプションを適用したいコマンド名を記述してください。 foozy@708: 以下の例では、 foozy@708: \command{vim} エディタの \texttt{DirDiff} 拡張を実行する foozy@708: ``\texttt{hg vimdiff}'' コマンドを定義しています。 foozy@708: foozy@708: \begin{codesample2} foozy@708: [extdiff] foozy@708: cmd.vimdiff = vim foozy@708: opts.vimdiff = -f '+next' '+execute "DirDiff" argv(0) argv(1)' foozy@708: \end{codesample2} foozy@708: foozy@708: \section{Cherrypicking changes with the \hgext{transplant} extension} foozy@708: \label{sec:hgext:transplant} foozy@708: foozy@708: ※ Brendan とチャットでの話し合いが必要 foozy@708: foozy@708: \section{Send changes via email with the \hgext{patchbomb} extension} foozy@708: \label{sec:hgext:patchbomb} foozy@708: foozy@708: 多くのプロジェクトでは、 foozy@708: 共有リポジトリに最終成果をコミットする前に、 foozy@708: 変更内容をメーリングリストに投稿して査読や論評を行う foozy@708: ``変更レビュー''の文化を持っています。 foozy@708: リポジトリへのアクセス権を持たない人々からの変更依頼を適用する、 foozy@708: 門番の役割を果たす人々がいるプロジェクトもあります。 foozy@708: foozy@708: Mercurial の \hgext{patchbomb} イクステンションを利用することで、 foozy@708: レビューや提案のための電子メールによる変更送信が容易になります。 foozy@708: このイクステンションの名前は、 foozy@708: 変更がパッチ形式で整形され、 foozy@708: 1チェンジセット毎に1つの電子メールで送信されることに由来しています。 foozy@708: 電子メールによる一連の変更の送信が、 foozy@708: 受信者のメールボックスにとって``爆撃''(bombing) foozy@708: のようであることから、``patchbomb''と呼ばれています。 foozy@708: foozy@708: \hgext{patchbomb} イクステンションの基本的な設定記述は、 foozy@708: いつものように \hgrc への1行か2行程度の記述だけです。 foozy@708: foozy@708: \begin{codesample2} foozy@708: [extensions] foozy@708: patchbomb = foozy@708: \end{codesample2} foozy@708: foozy@708: 一旦イクステンションを有効にしたならば、 foozy@708: \hgxcmd{patchbomb}{email} という新たなコマンドが利用可能になります。 foozy@708: foozy@708: \hgxcmd{patchbomb}{email} コマンドの安全且つ最善の実行手順は、 foozy@708: \emph{必ず} \hgxopt{patchbomb}{email}{-n} foozy@708: オプションを付けて一旦実行してみることです。 foozy@708: \hgxopt{patchbomb}{email}{-n} オプション付きの実行は、 foozy@708: 実際の電子メール送信は行わずに、 foozy@708: 送信\emph{されるであろう}内容を表示します。 foozy@708: 変更内容にざっと目を通して、 foozy@708: 送信内容が適切であることを確認したならば、 foozy@708: \hgxopt{patchbomb}{email}{-n} foozy@708: オプション抜きで再度 foozy@708: \hgxcmd{patchbomb}{email} コマンドを実行してください。 foozy@708: foozy@708: \hgxcmd{patchbomb}{email} コマンドは、 foozy@708: 他の Mercurial コマンドと同様のリビジョン指定が可能です。 foozy@708: 例えば以下の実行例では、 foozy@708: リビジョン 7 から \texttt{tip} までの全てのリビジョン foozy@708: (リビジョン 7 および \texttt{tip} も含みます)が送信されます。 foozy@708: foozy@708: \begin{codesample2} foozy@708: hg email -n 7:tip foozy@708: \end{codesample2} foozy@708: foozy@708: 比較対象の\emph{リポジトリ}を指定することもできます。 foozy@708: リビジョン指定無しでリポジトリを指定した場合、 foozy@708: \hgxcmd{patchbomb}{email} コマンドは、 foozy@708: 遠隔リポジトリに存在しないローカルリポジトリの全てのリビジョンを送信します。 foozy@708: リビジョンないし(\hgxopt{patchbomb}{email}{-b} オプションによる) foozy@708: ブランチ名を追加指定することで、 foozy@708: 送信されるリビジョンを制限することができます。 foozy@708: foozy@708: 送信先アドレスを指定しない foozy@708: \hgxcmd{patchbomb}{email} 実行は完璧に安全で、 foozy@708: その場合には \hgxcmd{patchbomb}{email} は対話的に入力を求めてきます foozy@708: (Linux や Unix ライクなシステムを利用している場合、 foozy@708: これらのヘッダ値入力の際には、 foozy@708: \texttt{readline} 様式の編集機能が利用可能です)。 foozy@708: foozy@708: 単一のリビジョンだけを送信する場合、 foozy@708: \hgxcmd{patchbomb}{email} コマンドの基底動作では、 foozy@708: コミットメッセージの最初の1行を送信する電子メールのサブジェクトに利用します。 foozy@708: foozy@708: 複数のリビジョンを送信する場合、 foozy@708: \hgxcmd{patchbomb}{email} コマンドはチェンジセット毎に電子メールを送信します。 foozy@708: この場合、 foozy@708: 送信しようとする一連の変更の目的を記述した前置きの電子メールを、 foozy@708: 一連のメール送信の先触れとして送信します。 foozy@708: foozy@708: \subsection{Changing the behaviour of patchbombs} foozy@708: foozy@708: 電子メールによる変更内容送信の形式が、 foozy@708: 全てのプロジェクトで厳密に同じわけでは無いことから、 foozy@708: \hgext{patchbomb} イクステンションは、 foozy@708: コマンド行でのオプション指定による幾つかの適合処理を実施します。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item コマンド行での \hgxopt{patchbomb}{email}{-s} オプションにより、 foozy@708: 前置きメッセージのサブジェクトを指定できます。 foozy@708: このオプションには、 foozy@708: サブジェクトとして使用するテキストを指定します。 foozy@708: foozy@708: \item \hgxopt{patchbomb}{email}{-f} オプションにより、 foozy@708: 電子メールの送信元アドレスを変更できます。 foozy@708: このオプションには、 foozy@708: 送信元アドレスとして使用する電子メールアドレスを指定します。 foozy@708: foozy@708: \item 基底動作では、電子メールごとに unified 差分( foozy@708: 形式の詳細に関しては \ref{sec:mq:patch}~節を参照してください) foozy@708: を送信します。 foozy@708: \hgxopt{patchbomb}{email}{-b} オプションを指定することで、 foozy@708: バイナリバンドル形式での送信を選択できます。 foozy@708: foozy@708: \item unified 差分の通常の出力\footnote{訳注: foozy@708: 「Mercurial における通常の出力」の意味? foozy@708: それとも「patchbomb における通常の出力」の意味? foozy@708: }はメタデータヘッダから始まります。 foozy@708: \hgxopt{patchbomb}{email}{--plain} オプションを指定することで、 foozy@708: これらを省略した簡素な形式の差分を送信することができます。 foozy@708: foozy@708: \item 差分部分は通常、 foozy@708: パッチの説明部分と同じ MIME パートに``並べて''送信されます。 foozy@708: メールの最初の MIME パートからしか引用できないメールツールもあるため、 foozy@708: 最も多くの読み手にとって、 foozy@708: 一番容易に差分を引用して返信できるのがこの形式です。 foozy@708: 説明部分と差分部分を別々の MIME パートとして送信したい場合は、 foozy@708: \hgxopt{patchbomb}{email}{-a} オプションを指定してください。 foozy@708: foozy@708: \item \hgxopt{patchbomb}{email}{-m} オプションを指定することで、 foozy@708: 電子メールでの送信の替わりに、 foozy@708: \texttt{mbox} 形式のメールフォルダへの書き込みを行うことができます。 foozy@708: このオプションには、書き込み先ファイル名を指定します。 foozy@708: foozy@708: \item 各パッチおよび前置きメッセージに対して、 foozy@708: \command{diffstat} 形式の要約を付与したい場合は、 foozy@708: \hgxopt{patchbomb}{email}{-d} オプションを指定してください。 foozy@708: \command{diffstat} コマンドは、 foozy@708: パッチ適用先ファイル名と、 foozy@708: 影響を受ける行数、 foozy@708: および各ファイル毎の変更量を表すヒストグラムを一覧表示します。 foozy@708: メールの読み手は、 foozy@708: この情報からパッチの複雑度に関する質的な一覧性を得ることができます。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: %%% Local Variables: foozy@708: %%% mode: latex foozy@708: %%% TeX-master: "00book" foozy@708: %%% End: