rcsを使う(その10)

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

コメント

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