続きです。
古いChangeLog、例えばChangeLog-9899を見ると、どうやら曜日から始まる日付の書式もあるようです。
takk@deb9:~/src/binutils-2.28/binutils$ sed -ne '/^[SMFWT12]/p' ChangeLog-9899 | shuf | head | sed 's/ .*//' Sat Sep 1999-06-03 Fri Jul 31 10:04:23 1998 Tue Jun 23 14:55:05 1998 1998-07-30 16:25 1999-05-28 Tue Mar 24 19:33:08 1998 Mon Jun 29 17:01:21 1998 Mon Oct 26 14:07:59 1998 1998-07-20 takk@deb9:~/src/binutils-2.28/binutils$
本家grep-changelogでは、書式を混在させたまま表示しているようです。
takk@deb9:~/src/binutils-2.28/binutils$ grep-changelog ChangeLog-9899 | grep '^[SMFWT12]' | shuf | head | sed 's/ .*//' Thu May 14 14:00:56 1998 Thu May 14 14:00:56 1998 Wed Jun 1999-12-26 1999-04-03 Sat Mar 28 17:39:27 1998 Thu Jan 22 16:22:55 1998 1999-04-04 Thu Oct Mon Oct 26 14:07:59 1998 takk@deb9:~/src/binutils-2.28/binutils$
検索しにくいので、自作版では、yyyy-mm-ddの形に変換したいと思います。
変換は外部コマンドを使ってやります。
dateコマンドの-dオプションを使えば、日付フォーマットを自動で解析してくれます。
takk@deb9:~$ cat t.pl open(CMD,"date -d 20180101 |"); @result = <CMD>; close(CMD); print "@result"; takk@deb9:~$ perl t.pl 2018年 1月 1日 月曜日 00:00:00 JST takk@deb9:~$
ChangeLog-9899にある書式は、これと同じですね。
takk@deb9:~$ LANG=C date -d 20180101 Mon Jan 1 00:00:00 JST 2018 takk@deb9:~$
では実験。
takk@deb9:~$ cat t.pl open(CMD,"date -d 'Mon Jan 1 00:00:00 JST 2018' |"); @result = <CMD>; close(CMD); print "@result"; takk@deb9:~$ perl t.pl 2018年 1月 1日 月曜日 00:00:00 JST takk@deb9:~$
上手く解析できました。
これを自作grep-changelogに組み込みます。
31 s/^ \t/\t/;
32 s/^ /\t/;
33
34 if(/^Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun/){
35 /^(.* [12]\d\d\d)/;
36 $d = $1;
37 open(CMD,"date +%F -d '$d' |");
38 @result = <CMD>;
39 close(CMD);
40 $newdate = "@result";
41 chop $newdate;
42 s/^$d/$newdate/;
43 print "::$_\n";
44 }
31行目は、どうやらChangeLog-9899の一部に書式の間違いがあるようなので、合わせるための置換です。
34行目で、先頭に曜日がある日付書式かどうか判定しています。
35行目は、行頭から西暦4桁がある位置までを$1に格納する処理です。
43行目。デバッグ用に表示しています。いずれ外します。
全文です。
takk@deb9:~/src/binutils-2.28/binutils$ cat -n my-grep-changelog.pl
1 $_ = "@ARGV";
2 s/--(\w+-?\w+) /--$1=/g;
3 $author='.+';
4 $text='.+';
5 $from_date='00000000';
6 $to_date ='99999999';
7
8 foreach(split / /){
9 $author=$1 if(/--author=(\S+)/);
10 $text=$1 if(/--text=(\S+)/);
11 $exclude=$1 if(/--exclude=(\S+)/);
12 $from_date=$1.$2.$3 if(/--from-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
13 $to_date=$1.$2.$3 if(/--to-date=(\d\d\d\d)\-(\d\d)\-(\d\d)/);
14 }
15
16 if($from_date > $to_date){
17 exit 1;
18 }
19
20 %log=();
21 opendir(DIR,".");
22 @files = grep { /ChangeLog.*/ } readdir(DIR);
23 closedir(DIR);
24
25 $num = 1;
26 foreach(@files){
27 open(INFILE,"<$_");
28 $id = "";
29 while(<INFILE>){
30 chomp();
31 s/^ \t/\t/;
32 s/^ /\t/;
33
34 if(/^Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun/){
35 /^(.* [12]\d\d\d)/;
36 $d = $1;
37 open(CMD,"date +%F -d '$d' |");
38 @result = <CMD>;
39 close(CMD);
40 $newdate = "@result";
41 chop $newdate;
42 s/^$d/$newdate/;
43 print "::$_\n";
44 }
45 if(/^\d\d\d\d\-\d\d\-\d\d/){
46 $title = "$_";
47 $num=0;
48 $id = $title .':::'. $num++;
49 next;
50 }
51 if(/^ \*/){
52 $id = $title .':::'. $num++;
53 }
54 if(/^ |^ \*|^$/ && $id ne ""){
55 if(/$text/){
56 $log{$id} .= "$_";
57 $found{$id} ++;
58 }
59 next;
60 }
61 last;
62 }
63
64 close(INFILE);
65 }
66
67 foreach(sort keys %log){
68 $id = $_;
69 /^(....).(..).(..)/;
70 $dt = $1.$2.$3;
71 @tmp = split /\t/,$log{$_};
72
73 next if($dt < $from_date);
74 next if($dt > $to_date);
75
76 if($found{$id} > 0){
77 if($id =~ /$author/){
78 print "$id\n";
79 foreach(@tmp){
80 print" $_\n";
81 }
82 print"\n";
83 }
84 }
85 }
takk@deb9:~/src/binutils-2.28/binutils$
かなり行数が増えてしまったのですが、だんだん良くなっています。


コメント