パッチをあてる(その3:patchコマンドの-pオプションについて)
「パッチをあてる」シリーズの第3回です。
サイトを検索すると、patch コマンド実行時に
C:¥work>patch -p0 < patch.txt
と青色の "-p0" を付与しているサンプルが一般的のようですが、この -pnumber というオプションの意味を調査・実験してみました。
このオプションはパッチファイルに記述されたディレクトリを無視する階層を示すものです。例えばパッチファイルの1?2行目の青色部分が
--- lib/MT/Util.pm.bak Fri Jan 06 14:19:44 2006
+++ lib/MT/Util.pm Fri Jan 06 14:20:48 2006
@@ -401,7 +401,7 @@
$str ||= '';
my @paras = split /\r?\n\r?\n/, $str;
for my $p (@paras) {
- if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|fieldset|select|blockquote|address|div|hr)@) {
+ if ($p !~ m@^</?(?:h1|h2|h3|h4|h5|h6|menu|dir|p|pre|center|form|fieldset|select|address|div|hr)@) {
$p =~ s!\r?\n!<br />\n!g;
$p = "<p>$p</p>";
}
と、ディレクトリが記述されており、パッチをあてる対象のファイル(ここでは Util.pm)がカレントディレクトリに配置されている場合、パッチをあてるコマンドは
C:¥work>patch -p2 < patch.txt
と "-p2" を設定します。
解説すると、上記の例は「パッチファイルに記述されたディレクトリを2階層分無視して、カレントディレクトリ(の Util.pm)にパッチをあてよ」という指定をしている訳です。
つまり、最初の "-p0" というオプションは「ディレクトリを無視しない」という意味になります。上記のパッチファイルを Movable Type のいわゆる CGIPath に配置し、"-p0" を付与して patch コマンドを実行すると正常に行われる、という訳です。
逆にパッチで記述されたディレクトリに該当ファイルが存在しない状態で "-p0" オプションを付与してコマンドを実行すると、
C:¥work>patch -p0 < patch.txt
can't find file to patch at input line 3
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|--- lib/MT/Util.pm.bak Fri Feb 17 23:19:44 2006
|+++ lib/MT/Util.pm Fri Feb 17 23:20:48 2006
--------------------------
File to patch:
というメッセージが表示されますのでご注意ください。
また、-p オプションを付与しない場合、パッチファイルに記述されているディレクトリが全て無視されてファイル名だけが対象となりました。したがってカレントディレクトリにファイルを置いている場合は -p オプションを付与する必要がないということになります。
パッチファイルにディレクトリの指定がないのに、"-p2" とかつけて実行すると下記のようなメッセージが出力されます。
C:¥work>patch -p2 < patch.txt
missing header for unified diff at line 3 of patch
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- Util.pm.bak Fri Feb 17 23:19:44 2006
|+++ Util.pm Fri Feb 17 23:20:48 2006
--------------------------
File to patch:
上記の内容を整理すると、patch コマンドにおける -p オプションの適用方法は下記のようになります。
パッチをあてるファイル | |||
---|---|---|---|
カレントディレクトリにある | パッチファイルに記述された ディレクトリにある | ||
パッチファイル | ディレクトリ 記述あり | -pnumber または不要 (numberは無視する階層数) | -p0 |
ディレクトリ 記述なし | 不要 (-p0をつけても問題なし) | ー |
-pnumber オプションの代わりに --strip=number でも同じ効果があります。
C:¥work>patch --strip=0 < patch.txt
こちらの方が直感的に分かりやすそうです。
その1:適用方法 |
その2:パッチを作る |
その3:patchコマンドの-pオプションについて |
- Windowsのバッチ起動でコマンドプロンプトを自動的に閉じない方法
- パッチをあてる(その2:パッチを作る)
- パッチをあてる(その1:適用方法)