TopWindowsパッチ > 2006年2月
2006年2月17日

パッチをあてる(その3:patchコマンドの-pオプションについて)

February 17,2006 11:51 PM
Tag:[, ]
Permalink

パッチをあてる」シリーズの第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オプションについて
Comments [0] | Trackbacks [0]
2006年2月 9日

パッチをあてる(その2:パッチを作る)

February 9,2006 11:58 PM
Tag:[, ]
Permalink

パッチをあてる(その1:適用方法)の続きで(随分間があきましたが)、今回はパッチを作る方法をご紹介します。

パッチとはプログラムを修正するための差分、あるいは差分が記述されたファイルを指します。パッチを作るためには変更前のファイルと変更後のファイルを比較して、その差分を抽出します。比較するためには diff コマンドを利用します。

ここではその1の3.1項と同じ、下記のパッチを作ってみることにします。

--- Util.pm.bak Fri Jan 06 14:19:44 2006
+++ 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>";
         }

作業ディレクトリは前回と同様、C:¥work とします。その1で作ったファイル類は全て削除しておいてください。

1.diff コマンドの準備

パッチの作成にあたっては diff コマンドを使用します。Linux ではデフォルトで用意されているようですが、Windows では用意されていません。
ということで、diff コマンドをソフトウェア工房αから入手します。

プログラミング・ツール(移植ソフト)に表示されている、

diff272w.zip
をクリックし、解凍した中にある
diff.exe

をPCの任意のディレクトリに配置します(他にファイルが色々入ってますが今回は使いません)。C:¥WINDOWS 配下または C:¥WINDOWS¥system32 配下に配置できれば、後述するMS-DOSコマンドプロンプトからの起動でパスを指定せずに実行することができます。
配置できない場合はとりあえず C:¥ 配下においてください。

2.ファイルのバックアップ

修正するファイルとなる、lib/MT/Util.pm をコピーして Util.pm.bak というファイル名で保存してください。なお修正前のファイル名が Util.pm.bak、修正後のファイル名が Util.pm となります。これは修正後のファイルを正規のファイルとして使用するためです。いずれも C:¥work 配下に配置してください。

3.ファイルの修正

任意のエディタで work 配下に配置した Util.pm を開き、404 行目の

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)@) {

に修正します。

4.diff 実行

次に MS-DOS コマンドプロンプトを開き、

C:¥>cd work

で、work ディレクトリへ移動し、diffコマンド

C:¥work>diff -u Util.pm.bak Util.pm

を実行します。Cドライブ直下に diff.exe を置いている場合は、

C:¥work>C:¥diff -u Util.pm.bak Util.pm

とします。
2つのファイルには、先程修正した差分がありますので、画面に

--- Util.pm.bak Fri Jan 06 14:19:44 2006
+++ 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>";
         }

が表示されます。これがパッチとなります。diff コマンドの後の "-u" を省略すると差分の行だけが表示されます。

これをマウスコピーして任意のエディタで新しいファイルを開き、ペースト&保存しても良いのですが、

C:¥work>diff -u Util.pm.bak Util.pm > patch.txt

を実行すれば work 配下に patch.txt というファイル名で直接保存することができます。これがパッチファイルとなり、その1の3.1項で作ったパッチファイルと同じものになります。

他のファイルでも同様に差分を表示することができますので、色々とお試しください。

Comments [0] | Trackbacks [0]
Now loading...
Recent Entries
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2021年
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3