******
パッチ
******

.. module:: patches
	:synopsis: パッチの取り扱いについて

パッチとは
==========

以下のリンクはパッチの本質と歴史を理解し、Mercurial
ではどのように使われているのかを理解するのによい資料です。

* `パッチ管理問題 <https://tortoisehg.bitbucket.io/hgbook/1.4/managing-change-with-mercurial-queues.html#sec:mq:patch-mgmt>`_
* `パッチを理解する <https://tortoisehg.bitbucket.io/hgbook/1.4/managing-change-with-mercurial-queues.html#sec:mq:patch>`_
* `さらにパッチについて <https://tortoisehg.bitbucket.io/hgbook/1.4/managing-change-with-mercurial-queues.html#sec:mq:adv-patch>`_

落とし穴
========

標準的なパッチ形式はバイナリファイルや名前変更、コピー、パーミッションの変更を記述できません。
そのためまず **GIT** 形式のパッチを有効にする必要があります： ::

	[diff]
	git=True

Mercurial 1.5 ではこの振る舞いが改善され、GIT 形式の差分が必要な場合は
ユーザに警告を出すか、自動的に GIT 形式に変更します。詳しくは hgrc
マニュアルの `差分 <https://www.selenic.com/mercurial/hgrc.5.html#diff>`_
のセクションを参照してください。

Mercurial のパッチ処理は改行文字に一貫性のないソースファイルとパッチを
うまく取り扱うことができないため、その解決方法として **patch.eol**
設定がバージョン 1.3 で導入されました： ::

	[patch]
	eol = auto #strict, lf, or crlf

hgeol 拡張機能もこの領域の問題の改善に取り組んでいます。
おそらく Mercurial 1.5 で解決します。詳しくは 詳しくは hgrc
マニュアルの `パッチ <https://www.selenic.com/mercurial/hgrc.5.html#patch>`_
のセクションを参照してください。

実のところパッチの適用というのはそれほど簡単な作業ではありません。
もしソースファイルがパッチ作成時から枝分かれしてしまっていたら、
パッチ適用時に衝突が起こり、.rej という拡張子のファイルが生成されます。
TortoiseHg 1.0 からこれらの除外されたハンクをうまく適用してくれる実験的な
:command:`hgtk mpatch` コマンドが導入されました。このコマンドは Chris Mason
による `mpatch <https://oss.oracle.com/~mason/mpatch/>`_
ツールが元になっています。この mpatch
でも適用できなかったハンクは手動で適用するしかありません。


パッチのエクスポート
====================

チェンジセット
--------------

チェンジセットをパッチとして保存するには、チェンジログビューアで
チェンジセットの右クリックメニューから
:menuselection:`エクスポート --> パッチの作成` を選択してください。
ファイル保存ダイアログが表示されます。

リビジョン範囲
--------------

チェンジログビューアでリビジョンの範囲を選択してください。
始点 (base) となるチェンジセットを左クリックで選択し、次に終点 (target)
のチェンジセットの上で右クリックすると、このリビジョン範囲に対するコマンドを含んだ
右クリックメニューが表示され、パッチの生成・バンドルの保存、メール送信、そして
選択範囲のチェンジセットの変更点を積み重ねた差分を見ることができます。

始点と終点の選択には制限がないため、この操作は非常に強力な機能です。

メール送信
----------

.. figure:: figures/email.png
	:alt: メール送信ダイアログ

	メール送信ダイアログ

単独のチェンジセットを送るにはチェンジログビューアで
チェンジセットの右クリックメニューを使用してください:
:menuselection:`エクスポート --> メールで送信...` 。
選択するとメール送信ダイアログが開きます。

リビジョン範囲をまとめて送る場合はリビジョン範囲の右クリックメニューから
:menuselection:`この範囲をメールで送信...`
を選択してください。

最後に、選択中のリモートリポジトリにすべてのチェンジセットを送るために同期ツールバーの
:guilabel:`メール送信` ボタンを使うこともできます。

.. note::
	パッチをメールで送信するには事前に
	`SMTP <https://www.selenic.com/mercurial/hgrc.5.html#smtp>`_
	の設定が必要です。

チェンジセットのつまみ食い
--------------------------

チェンジログビューアでリビジョン範囲の右クリックメニューの
:menuselection:`選択中のリビジョンとの差分`
を使用してください。始点から終点までのすべてのリビジョンにおける変更点を
積み重ねた差分がステータスダイアログに表示されます。

ステータスダイアログではコミットツールと同じようにファイルおよびハンク選択機能を
使うことができ、最終的な結果は :guilabel:`プレビュー` タブで見ることができます。
:guilabel:`名前を付けて保存` ボタンを押せば選択されている変更点をパッチファイルとして保存できます。

より手軽な方法としてはハンク選択画面で必要なハンクをハイライト (選択ではない)
してから CTRL-C すればクリップボードに差分をコピーできます。

.. note::
	選択する順番を逆にすると、生成されるパッチの順番も逆になります。


パッチのインポート
==================

.. figure:: figures/import.png
	:alt: インポートダイアログ

	インポートダイアログ

インポートダイアログはログビューアの同期バーまたはメニューから、
もしくはコマンドラインから :command:`hgtk import` で開くことができます。
このダイアログはファイルマネージャからのファイルおよびディレクトリの
ドラッグ＆ドロップ操作に対応しています。:guilabel:`選択` ボタンの右隣ににある
ドロップダウンメニューには、パッチを含むディレクトリを選択するための
:guilabel:`ディレクトリの選択...` メニューと、クリップボートから取り込む
:guilabel:`クリップボートからインポート` メニューがあります。

リポジトリに直接インポートするか、MQ にインポートするか選択できます。

.. note::
	パッチのインポートを正しく行うには作業ディレクトリがクリーン
	でなければなりません。インポートする前に未コミットの変更点をコミット、
	元に戻す、またはシェルフしてください。

.. warning::
	コミットメッセージのないパッチをインポートすると Mercurial
	はエディタを起動して入力を促します。そのため ui.editor 設定値として
	GUI エディタが設定されている必要があります。


MQ (パッチキュー)
=================

.. figure:: figures/patchqueue.png
	:alt: MQ パネル

	ログビューアの MQ パネル

リポジトリで MQ 拡張機能が有効化されていると、ログビューアとコミットツールで
MQ パネルが利用可能になります。MQ パネルでは qpush、qpop、qrename、qfinish
を含むほとんどのパッチ操作を行えます。MQ パネルを使う前に MQ
拡張機能について学んでおくことをお勧めします。

.. vim: noet ts=4
