(Subversion)svn blameとcsplitで各レビジョンの修正関数を把握する

9-2.バージョン管理

レポジトリには以下のレビジョンがコミットされているとします。

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$ 

コメント

タイトルとURLをコピーしました