レポジトリには以下のレビジョンがコミットされているとします。
takk@deb8:~/a/work$ ls func_00.c func_02.c func_04.c func_06.c func_08.c main.c func_01.c func_03.c func_05.c func_07.c func_09.c proto.h takk@deb8:~/a/work$ svn log | cut -b-22 | pr -4tJl1 ---------------------- r6 | takk | 2017-02-17 sample ---------------------- r5 | takk | 2017-02-17 sample ---------------------- r4 | takk | 2017-02-16 sample log ---------------------- r3 | takk | 2017-02-15 second ---------------------- r2 | takk | 2017-02-15 sample modified ---------------------- r1 | takk | 2017-02-15 first ---------------------- takk@deb8:~/a/work$
svn blameはソースコード内で各レビジョンで修正された行がわかる便利なコマンドです。
takk@deb8:~/a/work$ svn blame func_04.c | head 1 takk #include "proto.h" 1 takk void func_041(void) 1 takk { 6 takk func_043(); 1 takk } 1 takk 1 takk void func_042(void) 1 takk { 6 takk /* func_043(); */ 1 takk } takk@deb8:~/a/work$
各行の左側にレビジョン番号とユーザ名が表示されています。上では、レビジョン1とレビジョン6の修正行が表示されています。
全ソースから指定レビジョンでの変更行を抽出できます。
takk@deb8:~/a/work$ svn blame *.c | grep -v ' 1 ' 2 takk func_050(); 6 takk func_043(); 6 takk /* func_043(); */ 4 takk func_044(); 5 takk func_075(); 3 takk func_094(); 6 takk func_095(); 6 takk /* func_094(); */ takk@deb8:~/a/work$
このsvn blameとcsplitを使って、 各レビジョンでどの関数が修正されたのか調べてみましょう。
まずはtmpディレクトリを作ります。
takk@deb8:~/a/work$ mkdir tmp;cd tmp takk@deb8:~/a/work/tmp$
関数の位置に印を付けてからcsplitで分割します。
takk@deb8:~/a/work/tmp$ svn blame ../*.c | perl -pe 's/^(.{17} \w.*\(.*)$/$1::/' |csplit - '/::$/' {*}
関数毎にファイルを生成したら、後はgrepするだけです。レビジョン2,3,4の修正のある関数を表示しましょう。
takk@deb8:~/a/work/tmp$ grep -l '[234] *takk' xx* | xargs head -999 ==> xx32 <== 1 takk void func_032(void):: 1 takk { 2 takk func_050(); 1 takk } 1 takk ==> xx43 <== 1 takk void func_043(void):: 1 takk { 1 takk func_044(); 4 takk func_044(); 1 takk } 1 takk ==> xx73 <== 1 takk void func_073(void):: 1 takk { 3 takk func_094(); 1 takk } 1 takk takk@deb8:~/a/work/tmp$
コメント