オリジナルファイルに差分ファイルを適用する
patchfile
を引数に取り、
1 個または複数のオリジナルファイルにこれらの差分を適用し、
パッチの当たったバージョンを生成する。
通常、オリジナルファイルは
パッチの当たったバージョンと置き換わる。
バックアップを作成することもできる (
-b
または
\*=backup
オプションを参照 ) 。
通常、パッチを当てるファイルの名前はパッチファイルから得られる。
ただし、パッチの当たるファイルが 1 個だけの場合、
orginalfile
としてコマンドラインで指定することができる。
実行すると、 patch は差分 (diff) リストの形式を判別する。
ただし、
-c (\*=context),
-e (\*=ed),
-n (\*=normal),
-u (\*=unified)
オプションのどれかが指定された場合、自動判別は行なわれない。
コンテキスト diff (old-style, new-style, unified) および
ノーマル diff は
patch
プログラム自身がパッチを適用する。
いっぽう、
ed
diff はパイプを通じて
ed (1)
エディタに流し込まれるだけである。
patch
は差分の前にあるゴミを読み飛ばし、差分を適用し、
そして後ろにあるゴミを読み飛ばそうとする。
そのため、差分リストを含む記事やメッセージを
patch
に流し込むことができ、それで動作するはずである。
diff 全体が一定量インデントされている場合や、
コンテキスト diff が \s-1CRLF\s0 で終わる行を含んでいる場合、
インターネット RFC 934 で規定されるように
- で始まる行の先頭に
1個または複数個の - が付いている場合には、
これらは考慮される。
コンテキスト diff や
ノーマル diff ( ノーマル diff の場合の適用範囲はやや狭い ) の場合、
patch
はパッチ中の行番号の誤りを検出することができ、
パッチのそれぞれの塊 (hunk) について、正しい位置を見つけようとする。
最初は、hunk に書かれた行番号に
直前の hunk を適用した際のオフセットを加減した位置ではないかと推測する。
もしそれが正しい位置ではない場合、
patch
は hunk 中のコンテキストに一致する行が前後にないかを探す。
まず、
patch
はコンテキストのすべての行が一致する位置を探す。
そのような位置が見つからない場合で、かつコンテキスト diff であり、
かつ fuzz factor (曖昧度合い) の最大値が 1 以上の場合、
コンテキストの最初と最後の行を無視してもう一度探す。
それも失敗し、 fuzz factor の最大値が 2 以上の場合、
コンテキストの最初と最後の 2 行ずつを無視してもう一度探す。
( デフォルトの fuzz factor の最大値は 2 である。 )
patch
は、パッチのその hunk を適用する位置を見つけられない場合、
その hunk を reject (却下) ファイルに書き出す。
通常、 reject ファイルの名前は出力ファイルの後ろに
.rej
を付けたものか、
.rej
を付けるとファイル名が長くなりすぎる場合には
#
を付けたものとなる
( もし
#
1 文字を付けても長くなりすぎる場合には、
ファイル名の最後の文字を
#
に置き換える ) 。
( reject (却下) された hunk は入力されたパッチの形式にかかわらず、
通常のコンテキスト diff の形式で出力される。
入力がノーマル diff の場合、コンテキストの多くは単純に空になる。 )
reject ファイル中の hunk に付けられた行番号はパッチファイルのものとは
異なるかもしれない。
reject ファイル中の行番号は、古いファイルにおける位置ではなく、
patch
が新しいファイルの中で hunk が当たると思うおおよその位置になっている。
それぞれの hunk の処理が終わると、
hunk が失敗したかどうかや、
もし失敗した場合、
patch
が ( 新しいファイルの ) どの行に
その hunk が当たると思ったかが通知される。
hunk が diff に示された行番号と異なる位置に適用された場合は、
そのオフセットが通知される。
大きなオフセットが 1 個だけ通知された場合、
ある hunk が間違った位置に適用された
かもしれない 。
一致する位置を探すために fuzz factor が使われたかどうかも通知されるが、
その場合には少々不審に思ったほうがよい。
\*=verbose
オプションを指定すると、 hunk がぴったり一致した場合にも通知される。
コマンドラインでオリジナルファイル
origfile
が指定されなかった場合、
patch
は diff の前にあるゴミから次のような規則を使って
編集すべきファイルを判別しようとする。
まず、
patch
は候補となるファイル名の順序付きリストを次のようにして作る:
bu
bu
bu
bu
bu
bu
bu
最適な (best)
ものを選ぶために、
patch
はまずパス名の要素が最も少ないものを選び、
その中からベースネームの最も短いものを選び、
さらにその中から最も短いものを選び、
最後に、残った中で最初の名前を選ぶ。
さらに、前のゴミに
Prereq:
という行が含まれる場合、
patch
はその必要条件の行から最初の単語 ( 通常はバージョン番号 ) を取り、
オリジナルファイルにその単語があるかどうかをチェックする。
もしない場合、
patch
は処理する前に確認を求める。
すべての結論は、
ニュースリーダを使っているときには、
次のような感じにすればよいということである:
-b または \*=backup
\*=backup-if-mismatch
\*=no-backup-if-mismatch
-B pref または \*=prefix=pref
pref
というプレフィクスをつける。
例えば、
-B /junk/
とすると、
src/patch/util.c
というファイルに対する簡易バックアップファイルの名前は
/junk/src/patch/util.c
となる。
\*=binary
-c または \*=context
-d dir または \*=directory=dir
dir
に移動する。
-D define または \*=ifdef=define
define
を用いる。
\*=dry-run
-e または \*=ed
-E または \*=remove-empty-files
-f または \*=force
-F num または \*=fuzz=num
-g num または \*=get=num
num
が正であれば、
patch
はリビジョン管理システムからファイルを取得 ( チェックアウト ) する。
0 であれば、
patch
は \s-1RCS\s0, ClearCase, \s-1SCCS\s0 を無視し、ファイルを取得しない。
負であれば、
patch
はファイルを取得するかどうかをユーザに尋ねる。
このオプションのデフォルトの値は、
環境変数
PATCH_GET
が設定されていればその値となる。
そうでない場合、デフォルトの値は
patch
が \s-1POSIX\s0 準拠であれば 0 、そうでなければ負となる。
\*=help
-i patchfile または \*=input=patchfile
patchfile
から読み込む。
patchfile
が
-
の場合は標準入力から読み込み、これがデフォルトである。
-l または \*=ignore-whitespace
-n または \*=normal
-N または \*=forward
-o outfile または \*=output=outfile
outfile
に送る。
-pnum または \*=strip=num
num
個のスラッシュを含む最小のプレフィクスを取り除く。
隣接した 1 個または複数のスラッシュの並びは 1 個のスラッシュとして
数えられる。
このオプションは
パッチを送った人と異なるディレクトリにファイルを格納している場合のために、
パッチファイル中のファイル名の扱いを変更する。
例えば、パッチファイル中のファイル名が
\*=posix
bu
bu
bu
bu
bu
\*=quoting-style= word
word
を使う。
word
は次のどれかでなければならない:
literal
shell
shell-always
c
escape
-r rejectfile または \*=reject-file=rejectfile
rejectfile
に出力する。
-R または \*=reverse
-s または \*=silent または \*=quiet
-t または \*=batch
-T または \*=set-time
-u または \*=unified
-v または \*=version
-V method または \*=version-control=method
method
を使う。
method は
PATCH_VERSION_CONTROL
( または、それがない場合、
VERSION_CONTROL )
環境変数で指定でき、このオプションで上書きされる。
method はバックアップファイルが作られるかどうかには影響せず、
作られるバックアップファイルの名前に影響するだけである。
method
の値は \s-1GNU\s0 Emacs の `version-control' 変数と同様である。
patch
はもっと分かりやすい同義語も理解する。
method
の有効な値は次のとおりである
( 区別が付けば短縮形を用いてもよい ):
existing または nil
numbered または t
F
というファイルに対する番号付きバックアップファイルの名前は
F .~ N ~
のようになる。
N
はバージョン番号である。
simple または never
\*=verbose
-x num または \*=debug=num
-Y pref または \*=basename-prefix=pref
pref
を付ける。
例えば、
-Y .del/
とした場合、
src/patch/util.c
の簡易バックアップファイルの名前は
src/patch/.del/util.c
となる。
-z suffix または \*=suffix=suffix
suffix
を簡易バックアップサフィクスとして使う。
例えば、
-z -
とした場合、
src/patch/util.c
の簡易バックアップファイルの名前は
src/patch/util.c-
となる。
バックアップサフィクスは
SIMPLE_BACKUP_SUFFIX
環境変数で指定することができ、このオプションで上書きされる。
-Z または \*=set-utc
PATCH_GET
POSIXLY_CORRECT
QUOTING_STYLE
SIMPLE_BACKUP_SUFFIX
TMPDIR, TMP, TEMP
VERSION_CONTROL または PATCH_VERSION_CONTROL
$TMPDIR /p**
/dev/tty
new
と
old
はそれぞれ新旧のディレクトリである。
old
と
new
には 1 個もスラッシュがあってはいけない。
diff
コマンドのヘッダに含まれる日時は伝統的な Unix 形式を使って
協定世界時で書かれていなければならない。
そうすれば
パッチを受け取った人が
-Z
または
\*=set-utc
オプションを使うことができる。
次のものは Bourne シェル形式を使ったコマンド例である:
bu
bu
bu
bu
bu
bu
+3 11 -c -d dir -D define -e -l -n -N -o outfile -p num -R -r rejectfile