rcs-rオプションのバリエーション


アニメ『黒神 The Animation』(2009)

上からは再生はできないです。youtubeから視聴できます。
この世には自分と同じ顔の人間が3人いて、遭遇するとなんらかの理由でどちらかが消滅してしまうっていう設定で、1話がすごくショッキングな展開でした。まさかその人は主役とつるんでいく役だから死なないよねーって人が、容赦なくドッペルゲンガー(ライナー?)に出会ってしまうし。この子はこのアニメを通して、重要な役割を担うに違いない、って思ってたのに無残なことになってたり。ホラーかと思いました。でもバトルアニメです。バトルものはショッキングな導入部は要らないような気もする、というかこれはこれで別の作品として見てみたい。(まあホラーは好きではないですが)
さて肝心のバトルはどうでしょうか。まだ見始めたばかりなので、ゆっくり視聴していこうと思います。

さてコマンド学習です。
古いものを学習することが、新しいものをそのまま学ぶよりも、新しいものを知るのに近道かもしれない、と思ってるので、ずっと古き良きツールrcsを学習しています。以前FORTRANを学習してた時もそうでしたが、いつも新しい発見があります。
今回も-rオプション。rcsの-r指定ってどこまでのバリエーションを許容しているのでしょうか。
確認してみます。

takk@deb9:~/tmp$ rcs log -r1.2,1.4 test2.c | grep ^rev
revision 1.4
revision 1.2
takk@deb9:~/tmp$

1.2と1.4が選択されました。あたり前ですね。

次は範囲指定。

takk@deb9:~/tmp$ rcs log -r1.6:1.9 test2.c | grep ^rev
revision 1.9
revision 1.8
revision 1.7
revision 1.6
takk@deb9:~/tmp$

1.6~1.9までが選択されました。

では次。個別指定と範囲指定両方を組み合わせると、

takk@deb9:~/tmp$ rcs log -r1.2,1.4 -r1.6:1.9 test2.c | grep ^rev
revision 1.9
revision 1.8
revision 1.7
revision 1.6
revision 1.4
revision 1.2
takk@deb9:~/tmp$

なんと! 両方対応してます。rcsコマンド、こんなに柔軟に指定できるんですね。

ではもっと-rオプションを増やしていきます。

takk@deb9:~/tmp$ rcs log -r1.2,1.4 -r1.6:1.9 -r1.20 -r1.30 test2.c | grep ^rev
revision 1.30
revision 1.20
revision 1.9
revision 1.8
revision 1.7
revision 1.6
revision 1.4
revision 1.2
takk@deb9:~/tmp$

なんとこれも全部指定できました。
rcsコマンドでここまで柔軟にレビジョン指定できるってことは、cvsやsubversion、gitなどrcsよりも後に生まれたバージョン管理ツールたちは、rcsよりも柔軟性があるってことに他なりません。

では、自作のrcsコマンドmy-rcs.plも対応したいと思います。
複数の範囲指定のみできるように改造します。

3,4行目を修正。-rFROM:TOで指定したレビジョンを@rangesに格納していきます。

takk@deb9:~/tmp$ cat -n my-rcs.pl
     1  @target_rev = ();
     2  foreach(@ARGV){
     3          if(/-r(\d+\.\d+:\d+\.\d+)\b/){
     4                  push @ranges, $1;
     5                  next;
     6          }
     7          if(/-r(\d+\.\d+(?:\,\d+\.\d+)*)\b/){
     8                  @target_rev = split /,/,$1;
     9                  next;
    10          }
    11          push @working_files,$_;
    12  }

そして、81行目~86行目の処理。ここで複数の範囲指定オプションと比較する処理をします。

    78  foreach(@all){
    79          my $rev = $_;
    80
    81          foreach(@ranges){
    82          my($from, $to) = split /:/,$_;
    83          goto label if("yes" eq is_valid_revision($from,$rev,$to));
    84          }
    85          next;
    86  label:
    87          print "hit\n";
    88          my $line = $hist{$rev};
    89          my ($tmp,$date,$log) = split /:SEP:/,$line;
    90
    91          print "----------------------------\n";
    92
    93          print"revision $rev\n";
    94          print"$date\n";
    95          print"$log\n";
    96  }
    97  print"=============================================================================\n";
    98  }

使ってみましょう。

takk@deb9:~/tmp$ perl my-rcs.pl -r1.1:1.3 -r1.20:1.25 test2.c | grep ^rev
revision 1.3
revision 1.25
revision 1.24
revision 1.23
revision 1.22
revision 1.21
revision 1.20
revision 1.2
revision 1.1
takk@deb9:~/tmp$

並べ替えがうまくいってないですが、 いい感じです。

Leave a Reply

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

CAPTCHA