まだまだ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のレビジョン範囲指定の機能を作ります。
コメント