どの関数が変更になったか(svn)

今回も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$ 

One response to “どの関数が変更になったか(svn)

  1. Pingback: アセンブラレベルで変更差分を見る(gcc,svn) | コマンドの達人

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA