シェルフ
========

.. module:: shelve.dialog
	:synopsis: シェルフ・シェルフから戻す操作をするためのダイアログ

.. warning::
	win32text 拡張機能はハンク選択で問題を引き起こす可能性があります。この問題は
	Mercurial 1.3 と TortoiseHg 0.8 において解決されましたが、適切な設定が
	必要です。詳しくは
	`issue #82 <https://bitbucket.org/tortoisehg/thg/issue/82/>`_
	をご覧ください。

このダイアログは作業ディレクトリにおける変更点のうち、必要な部分のみを選択して *シェルフ*
(一時的に別の場所に保管しておく) するために使います。シェルフした変更点は特別なパッチとして
リポジトリに格納され、いつでもその変更点を作業ディレクトリに戻すことができます。

.. figure:: figures/shelve.png
	:alt: シェルフダイアログ

	シェルフダイアログ

ツールバーボタンを左から順に見ていきます：

	:guilabel:`シェルフ`
		チェックされたファイルの選択されたハンクをシェルフします。
	:guilabel:`シェルフから戻す`
		シェルフされた変更点を作業ディレクトリに戻します。
	:guilabel:`差分`
		チェックの入っているファイルの GUI 差分を表示します。
	:guilabel:`元に戻す`
		チェックされているファイルを変更を加える前の状態に戻します。
		その変更がマージの場合はどちらの親リビジョンに戻すか選択できます。
	:guilabel:`追加`
		チェックされている不明ファイル '?' または無視ファイル 'I' を追加します。
	:guilabel:`移動`
		チェックされているファイルを指定されたディレクトリに移動します。
	:guilabel:`削除`
		チェックされているファイルを削除します。
	:guilabel:`破棄`
		チェックされている管理済みファイルを破棄します。
	:guilabel:`再読み込み`
		作業ディレクトリの状態を再読み込みします。
		再読み込み後もチェックボックスの選択状態は保たれます。

ファイル一覧には4つの列があります：

	1)	各種操作のためにそのファイルが選択されているかどうかを示すチェックボックス。
		ツールバーボタンによる操作はチェックされているファイルにのみ行なわれます。
		部分選択状態のファイルについては特殊なチェック状態となります。
		この列のヘッダを使えばすべてのファイルをチェックしたりチェックを外したりできます。
	2)	:guilabel:`状態` 列には Mercurial の status コマンドで使用されている
		ファイル状態を示す 'MARD?IC' のうちの1つが表示されます。
	3)	:guilabel:`マージ` 列はそのファイルのマージ状態を示しており、Mercurial の
		resolve コマンドで使用されている ' RU' のうちどれか1つが表示されます。
	4)	リポジトリルートを基準としたファイルパスが表示されます。

ファイル一覧の下に並んだチェックボックスは
{M:変更, A:追加, R:削除, !:削除, ?:不明, C:クリーン, I:無視}
のファイル状態ごとにファイル一覧に表示するかどうかを設定できます。
このチェックボックスはコミットツールからファイルまたはディレクトリを指定された場合には
無効になります。


タブ
----

シェルフツールの差分表示パネルには4つのタブがあります：

	1) テキスト差分 - 選択されているファイルの差分が表示されます
	2) ハンク選択 - 選択されているファイルのハンク選択状態を変更できます
	3) シェルフプレビュー - すべての選択されている変更点が表示されます。このプレビュー
		に表示されている内容が作業ディレクトリから取り除かれてシェルフに格納されます。
	4) シェルフ内容 - シェルフに格納されている内容が表示されます


変更点をシェルフする
--------------------

このダイアログはコミットツールのように TortoiseHg のハンク選択機能を採用しており、
シェルフに移動したいファイルおよび変更点をユーザが選択できます。シェルフボタンを
押すと、選択された変更点が作業ディレクトリから削除され、パッチファイルとして保存されます。
既にシェルフされた変更点が存在する場合はその変更点と置き換えるか、もしくは新しい変更点を
それにマージするか尋ねられます。シェルフに変更点があるときのみシェルフから戻すボタンが
有効になります。


シェルフした変更点を戻す
------------------------

シェルフから戻すボタンが押されると、シェルフした変更点が作業ディレクトリに再適用されます。

.. note::
	シェルフから戻した後、シェルフツールを再読み込みすると、シェルフから戻された変更点は
	作業ディレクトリへの変更として表示されます。

record/commit とはどう違うのか？
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

シェルフされた変更点はそれが戻されるまで実際に作業ディレクトリから取り除かれます。
これはシェルフされている状態でもプロジェクトをビルドしたり、テストを実行したり
できることを意味しています。コミットされた変更点が有効かどうか試すことができるので、
ビルド時に変更点を選択するより安全と言えます。

変更点をシェルフすることは完成した作業結果からデバッグ用コードを取り除くこどで動作に
影響がないか確かめるのに便利です。

注意：シェルフされた変更点は作業ディレクトリの内容を基準としたパッチに保管されます。
そのためもしシェルフ後の変更と衝突を起こした場合、そのパッチがキレイに再適用できる
という保証はありません。

MQ とはどう違うのか？
^^^^^^^^^^^^^^^^^^^^^

シェルフはチェンジセットに変換されない単一の無名 MQ パッチと見なすことができます。

しかしシェルフツールは MQ でパッチを管理していても便利に使えます。
シェルフは MQ のパッチから変更点の一部を取得し、それらを別の MQ パッチ
(または完全に新しいパッチ) に再適用できます。

例えば：
	1)	分割したいパッチに変更をプッシュする
	2)	シェルフツールを開く (最上位のパッチがハンク選択可能になる)
	3)	そのパッチに残したいハンクの選択を解除して、 :guilabel:`シェルフ` ボタンを押す
	4)	コマンドラインから :command:`hg qrefresh` するかコミットツールの
		:guilabel:`QRefresh` ボタンで最上位のパッチを更新する
	5)	:command:`qpush` または :command:`qpop` してシェルフした変更を適用したい
		パッチに移動する
	6)	シェルフツールを開いて :guilabel:`シェルフから戻す` ボタンを押す
	7)	最上位のパッチを更新する (手順4に戻る)

追加、削除、名前変更されたファイルをシェルフすることはできませんが、
MQ ならそれが可能です。

attic 拡張機能とはどう違うのか？
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

attic 拡張機能はシェルフ機能の上位版です。具体的には attic は独立した複数の名前付き
*シェルフ* を保持することができます。


キーボードショートカット
------------------------

:guilabel:`Ctrl-C`
	差分表示パネルで現在ハイライト (選択ではない) されているハンクをクリップボードに
	コピーします。コピーしたハンクをテキストエディタに貼り付ければ、作業ディレクトリに
	おける変更点から任意のパッチを作り出すのに使えます。

クリップボードにコピーされたハンクは差分ヘッダが付加されるため、クリップボードの内容は
常に有効なパッチとして利用できます。


オプション設定
--------------

* :menuselection:`TortoiseHg --> 差分を画面下部に表示`
* :menuselection:`TortoiseHg --> タブ文字の幅`
* :menuselection:`TortoiseHg --> 最大差分サイズ`


コマンドラインからの実行
------------------------

シェルフツールはコマンドラインから起動することもできます： ::

	hgtk shelve

	aliases: unshelve

	shelve/unshelve tool

	use "hgtk -v help shelve" to show global options

TortoiseHg のシェルフ機能を Mercurial のコマンドラインから使うには、
Mercurial.ini ファイルで以下のように拡張機能を有効化してください： ::

	[extensions]
	tortoisehg.util.hgshelve=

これにより Mercurial に :command:`shelve` および :command:`unshelve`
コマンドが追加されます。

.. vim: noet ts=4
