今回もsvnコマンドと戯れてみます。
このような実験レポジトリでsvnコマンドを使います。
takk@deb8:~/a/work$ svn info パス: . Working Copy Root Path: /home/takk/a/work URL: file:///home/takk/a/repos Relative URL: ^/ リポジトリのルート: file:///home/takk/a/repos リポジトリ UUID: 3a74390e-897f-40d9-97c3-4158fc9d3bdf リビジョン: 3 ノード種別: ディレクトリ 準備中の処理: 特になし 最終変更者: takk 最終変更リビジョン: 3 最終変更日時: 2017-02-15 20:09:24 +0900 (2017年02月15日 (水)) takk@deb8:~/a/work$
レビジョン1と2の差分を見てみます。
takk@deb8:~/a/work$ svn diff -r1:2 Index: func_03.c =================================================================== --- func_03.c (リビジョン 1) +++ func_03.c (リビジョン 2) @@ -6,7 +6,7 @@ void func_032(void) { - func_033(); + func_050(); } void func_033(void) takk@deb8:~/a/work$
デフォルトのsvn diffはごちゃごちゃして見難いです。
diffコマンドのフォーマットで表示してみましょう。
takk@deb8:~/a/work$ svn diff -r1:2 --diff-cmd /usr/bin/diff -x "--normal" Index: func_03.c =================================================================== 9c9 < func_033(); --- > func_050(); takk@deb8:~/a/work$
ただこれではどの関数が変更になったかわかりません。
関数単位で変更差分を見るにはどうすれば良いでしょうか。
diffコマンドの-yオプションを利用します。
Index: func_03.c =================================================================== #include "proto.h" #include "proto.h" void func_031(void) void func_031(void) { { func_032(); func_032(); } } void func_032(void) void func_032(void) { { func_033(); | func_050(); } } (省略) void func_040(void) void func_040(void) { { func_041(); func_041(); } }
-yオプションはこのように左右にテキストを表示し、差分行を|で表します。
差分行のみ抽出するには、空白6個+|でgrepすれば良いです。
takk@deb8:~/a/work$ svn diff -r1:2 --diff-cmd /usr/bin/diff -x "-y -W80" | grep ' |' func_033(); | func_050(); takk@deb8:~/a/work$
どの関数で変更になったか判定したいのですが、この空白6個+|が出現するのは、関数宣言が現れた後になります。
先に空白6個+|を見つけるため、tacでdiff結果を上下逆転させます。
takk@deb8:~/a/work$ svn diff -r1:2 --diff-cmd /usr/bin/diff -x "-y -W80" | tac | perl -ne '$f=1 if/ {6}\|/; print if $f==1; $f=0 if(/^\w+/);' | tac void func_032(void) void func_032(void) { { func_033(); | func_050(); takk@deb8:~/a/work$
レビジョン1から3までの修正関数を表示してみましょう。
takk@deb8:~/a/work$ ^r1:2^r1:3^ svn diff -r1:3 --diff-cmd /usr/bin/diff -x "-y -W80" | tac | perl -ne '$f=1 if/ {6}\|/; print if $f==1; $f=0 if(/^\w+/);' | tac void func_032(void) void func_032(void) { { func_033(); | func_050(); void func_073(void) void func_073(void) { { func_074(); | func_094(); takk@deb8:~/a/work$
コメント
[…] ← どの関数が変更になったか(SVN) […]