Changelog書式の間違い探し(その1)

自家製grep-changelogと、本家grep-changelogの出力に差分がありました。
自家製は、

2008-08-25  Alan Modra  <amodra@bigpond.net.au>
2009-08-22  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
2009-08-28  H.J. Lu  <hongjiu.lu@intel.com>
2010-11-05  Alan Modra  <amodra@gmail.com>

本家は、

2007-07-05  Nick Clifton  <nickc@redhat.com>
2007-02-28  Alan Modra  <amodra@bigpond.net.au>
2007-02-28  Alan Modra  <amodra@bigpond.net.au>
2007-02-27  Alan Modra  <amodra@bigpond.net.au>
2007-02-27  Alan Modra  <amodra@bigpond.net.au>
2007-02-27  Alan Modra  <amodra@bigpond.net.au>
2008-08-25  Alan Modra  <amodra@bigpond.net.au>
2009-08-28  H.J. Lu  <hongjiu.lu@intel.com>
2009-08-22  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
2010-11-05  Alan Modra  <amodra@gmail.com>
2010-11-05  Alan Modra  <amodra@gmail.com>
2010-01-26  Tristan Gingold  <gingold@adacore.com>

ずいぶん異なります。
本家ログを見てみるとすぐに気づきますが、同じ日付のタイトルが存在します。
自家製ではタイトルをIDにしているため、同じIDとみなして連想配列を上書きしてしまいますね。
連番の数字を添えることで、同じタイトルが存在しないように修正します。
$numという変数を追加しました。

     1	$pattern = $ARGV[0];
     2	
     3	%log=();
     4	opendir(DIR,".");
     5	@files = grep { /ChangeLog.*/ } readdir(DIR);
     6	closedir(DIR);
     7	
      	$num = 1;
     8	foreach(@files){
     9		open(INFILE,"<$_");
    10		$id = "";
    11		while(<INFILE>){
    12			chomp();
    13			if(/^\d\d\d\d-\d\d-\d\d/){
    14				$id = "$_";
      				$id .= $num++;
    15				next;

修正後の自家製スクリプトを実行すると、

takk@deb9:~/src/binutils-2.28/binutils$ perl t.pl bin2c | sed -ne '/^2/p'
2008-08-25  Alan Modra  <amodra@bigpond.net.au>1117
2009-08-22  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>69
2009-08-28  H.J. Lu  <hongjiu.lu@intel.com>64
2010-11-05  Alan Modra  <amodra@gmail.com>1453
takk@deb9:~/src/binutils-2.28/binutils$ 

結果は変わりません。まだ何かあるようです。
ログの抽出条件を確認してみます。

    19			if(/^	|^$/ && $id ne ""){
    20				$log{$id} .= "$_";
    21				$found{$id} ++ if(/$pattern/);
    22				next;
    23			}
    24			last;

行頭がタブか、空行の場合に、$foundをインクリメントしてフラグを立ててます。
もしかしたら、この2つ以外の条件に当てはまらないChangelogの書式が存在するのかもしれません。

grepで、行頭がタブではない行を抽出しましょう。vimで眺めて探すことにします。

takk@deb9:~/src/binutils-2.28/binutils$ grep -hv ^$'\t' ChangeLog* | vim -

見つけました。行頭がタブの行はgrepで抽出しないはずなのに、ログ本体があります。

  928 2003-12-29  Nick Clifton  <nickc@redhat.com>
  929 
  930         called 'debug_line_pointer_sizes'.
  931         (num_debug_line_pointer_sizes): New variable.
  932         (display_debug_lines): Extract pointer size from the
  933         debug_line_pointer_sizes array.
  934         (display_debug_loc): Likewise.
  935         (prescan_debug_info): Fill in the debug_line_pointer_sizes
  936         array.

スペースでした。スペース8個が、行頭に入ってます。
この対策に、ChangeLogファイルの読み込み時に、行頭スペース8個をタブに置換する処理を追加します。

     1	$pattern = $ARGV[0];
     2	
     3	%log=();
     4	opendir(DIR,".");
     5	@files = grep { /ChangeLog.*/ } readdir(DIR);
     6	closedir(DIR);
     7	
     8	$num = 1;
     9	foreach(@files){
    10		open(INFILE,"<$_");
    11		$id = "";
    12		while(<INFILE>){
    13			chomp();
      			s/^        /\t/;
    14			if(/^\d\d\d\d-\d\d-\d\d/){
    15				$id = "$_";
    16				$id .= $num++;
    17				next;
    18			}

実行すると、出力されるタイトルが少し増えました。

takk@deb9:~/src/binutils-2.28/binutils$ perl t.pl bin2c | sed -ne '/^2/p'
2007-02-27  Alan Modra  <amodra@bigpond.net.au>1704
2007-02-28  Alan Modra  <amodra@bigpond.net.au>1703
2007-07-05  Nick Clifton  <nickc@redhat.com>1632
2008-08-25  Alan Modra  <amodra@bigpond.net.au>1488
2009-08-22  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>69
2009-08-28  H.J. Lu  <hongjiu.lu@intel.com>64
2010-01-26  Tristan Gingold  <gingold@adacore.com>2170
2010-11-05  Alan Modra  <amodra@gmail.com>2073
takk@deb9:~/src/binutils-2.28/binutils$ 

しかしまだ本家とは異なります。

つづく

コメント

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