まだまだrcs学習中です。
-r1.1:1.5
と指定した時、
内部で1.1、1.2、1.3、1.4、1.5に展開する処理を改造してみました。
takk@deb9:~/tmp$ cat -n my-rcs.pl | head -20
1 foreach(@ARGV){
2 if(/-r(\d+)\.(\d+):(\d+)\.(\d+)\b/){
3 $b1=$1; $b2=$2;
4 $e1=$3; $e2=$4;
5 print "begin=$b1.$b2\n";
6 print "end=$e1.$e2\n";
7 for($i=$b2; $i <= $e2; $i += 1){
8 print "-->$b1.$i\n";
9 }
10 next;
11 }
12 if(/-r(\d+\.\d+(?:\,\d+\.\d+)*)\b/){
13 @target_rev = split /,/,$1;
14 print "@target_rev\n";
15 next;
16 }
17 }
18
19 exit 0;
20
takk@deb9:~/tmp$
実行してみます。
takk@deb9:~/tmp$ perl my-rcs.pl -r1.1:1.5 begin=1.1 end=1.5 -->1.1 -->1.2 -->1.3 -->1.4 -->1.5 takk@deb9:~/tmp$
一応できました。が、しかし。
上位の桁は何もチェックしていないので、このような指定をしても対応できません。
takk@deb9:~/tmp$ perl my-rcs.pl -r1.1:2.5 begin=1.1 end=2.5 -->1.1 -->1.2 -->1.3 -->1.4 -->1.5 takk@deb9:~/tmp$
本物のrcsコマンドがどうなっているか確認します。
まず、現在のheadレビジョンを確認。
takk@deb9:~/tmp$ rcs log test.c | head RCS file: RCS/test.c,v Working file: test.c head: 1.10 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 10; selected revisions: 10 takk@deb9:~/tmp$
1.10でした。つまりtest.cファイルについては、レビジョンは1.1から1.10までしか存在しません。1.10より大きな数字を指定するとどうなるのでしょうか。1.15を指定してみます。
takk@deb9:~/tmp$ rcs log -r1.10:1.15 test.c RCS file: RCS/test.c,v Working file: test.c head: 1.10 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 10; selected revisions: 1 description: TEST ---------------------------- revision 1.10 date: 2018/09/20 12:09:48; author: takk; state: Exp; lines: +1 -0 HELLO10 ============================================================================= takk@deb9:~/tmp$
なんと、1.10のみ表示されました。存在するレビジョンまでが抽出されるようです。
ということは、2.1とか指定しても同じように、1.10のみ抽出できるはずです。
試してみます。
takk@deb9:~/tmp$ rcs log -r1.10:2.1 test.c RCS file: RCS/test.c,v Working file: test.c head: 1.10 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 10; selected revisions: 1 description: TEST ---------------------------- revision 1.10 date: 2018/09/20 12:09:48; author: takk; state: Exp; lines: +1 -0 HELLO10 ============================================================================= takk@deb9:~/tmp$
やはり1.10のみ抽出されました。
今頃気づきましたが、-rFROM:TOで、範囲指定されたレビジョンを、内部で展開するやり方だと、レビジョンの配列数が膨大になる場合がありますね。
となれば、単純にレビジョンを比較して判定した方がよさそうです。レビジョンの大小を比較する関数を作ります。
takk@deb9:~/tmp$ cat t.pl
$aa=is_higher ("5.10", "7.3"); print "$aa\n";
$aa=is_higher ("5.10", "5.3"); print "$aa\n";
$aa=is_higher ("7.3", "5.7"); print "$aa\n";
exit 0;
sub is_higher{
my($rev_a, $rev_b) = @_;
my($rev_a1,$rev_a2) = split /\./,$rev_a;
my($rev_b1,$rev_b2) = split /\./,$rev_b;
return "yes" if ($rev_a1 > $rev_b1);
return "no" if ($rev_a1 < $rev_b1);
if($rev_a1 == $rev_b1){
return "yes" if ($rev_a2 > $rev_b2);
return "no" if ($rev_a2 < $rev_b2);
}
return "ng";
}
実行してみます。
takk@deb9:~/tmp$ perl t.pl no yes yes takk@deb9:~/tmp$
レビジョンの大小比較がこれで出来そうなので、次回はこれを使って、logのレビジョン範囲指定の機能を作ります。


コメント