この記事はACCESS Advent Calendar 2016 5日目の記事です。
背景
私が扱うunified形式のパッチファイルは、適用対象のソースコードとパッチファイルの内容との間で、行位置がずれていたりパッチファイル内の周辺部分のコードが変更されていたりすることが多い。
そのようなパッチファイルを patch -pN <hoge.patch
で適用すると、パッチが当たるファイルとパッチファイルの内容とに違いがあった場合に、元ファイルがコピーされて "(元ファイル名).orig" のファイル名でバックアップファイルが作成される。
しかし、gitやsvnなどのバージョンコントロールの管理下のファイルに対しては、このバックアップファイルの作成が邪魔に思えていた。バージョンコントロール管理下にあるので元コードに戻すのは簡単だし、バックアップファイルを削除するという手間が発生するし。
ということで、バックアップファイルを作らない方法が欲しかった。
なお、 git apply --reject hoge.patch
は長ったらしくてタイプが面倒で、使わずにいる。
説明
gnu patchには no-backup-if-mismatch というオプションがあり、
http://www.gnu.org/software/diffutils/manual/html_node/patch-Options.html
バックアップファイルの作成をしないでいてくれる。
便利化
「カレントディレクトリがgitリポジトリ内なら no-backup-if-mismatch オプションを付けてpatchコマンドを呼ぶ」を勝手にやってもらう。
以下の記述を.bashrcあたりに書く。
patch() {
local additional_patch_options=""
if which git >/dev/null && git rev-parse 2>/dev/null; then
additional_patch_options="--no-backup-if-mismatch"
fi
$(which patch) "$additional_patch_options" "$@"
}
あとはこれまでどおりpatchコマンドを使えばよい。
カレントディレクトリがgit管理下かどうかの判断には http://memo.sugyan.com/entry/20120323/1332507609 を参照した。
カレントディレクトリがsvn管理下かどうかの判断方法がさくっと分からなかったので、svnのフォローは省略。
svn info
のexit statusを見るのがいい?
備考
--no-backup-if-mismatch はgnu patchで対応しているオプションのようなので、gnu版でないpatchコマンドでは--no-backup-if-mismatchが対応してなかったりバックアップファイル生成の挙動が異なったりするかもしれない。
例えばFreeBSDのpatchコマンドでは--no-backup-if-mismatchに対応してないらしい。
https://github.com/drush-ops/drush/issues/1502