rcsを使う(その11)


アニメ『ハイスコアガール』

今期一は他のアニメと思ってましたが、終盤になってこれが一番と思えてきました。
いやあ、ほんと、おもしろいっす。
ゲームでつながる二人の関係は、小、中、高校まで続きます。ハルオはゲーム狂いなので、クラスの高嶺の花である晶のことは、ゲームが強い変なやつぐらいにしか思ってなかったのに、いつの間にか心の中にいます。でもハルオはゲームキチなので、それが何なのか分からない。だから距離が近づいたと思ったら遠のいたり、見てて心揺さぶられます。晶は無口なのに、いや、無口だからこそ、時折の涙や暴力がやたらと可愛いし、頭にゲームしかないハルオがやたらモテるので嫉妬したり、しかしハルオは女子たちを対戦ゲームのライバルだと思ってる。もう青春過ぎてきゅんとなります。
青春を感じるのは、私がゲーム好きだったらかってのもあるかもしれません。ストリートファイター2は、実はハマってません。1の殴打操作が良かったので、ボタンの指先操作ってのに邪道を覚えたので、あえてやらなかったです。バーチャファイター1は、もう張り付いたようにやってました。独身だったので、ゲームセンターで給料全部使える、ぐらいの勢いで鉄山靠繰り出してました。
VF2が登場した頃は、本当にハマりすぎてたので、お金も続かず、高いゲーセンから、1プレイ50円でバーチャファイターがやれる、安いゲーセンを見つけて通いましたが、やはり安いところは対戦待ちする人が多かったです。
勝ち進んでいる対戦台の向こうのお兄さんは、アキラ使いで鉄山靠を見事に決めていて、お兄さんのファッションも(鉢巻ではなくバンダナでしたが)アキラみたいだったのが印象的でした。

さて、続きです。
前回作ったis_higher関数、とても分かりにくいです。

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";
}

なので、このような関数に変えました。有効レビジョンかどうかをyes、noで返します。

sub is_valid_revision{
        my($from, $rev, $to) = @_;

        my($from1,$from2) = split /\./,$from;
        my($rev1,$rev2) = split /\./,$rev;
        my($to1,$to2) = split /\./,$to;

        return "no" if ($from1 > $rev1);
        return "no" if ($to1 < $rev1);

        return "no" if ($from2 > $rev2);
        return "no" if ($to2 < $rev2);

        return "yes";
}

使い方は、
is_valid_revision(FROM-REV, REV, TO-REV)

これを組み込んだ全ソースです。

takk@deb9:~/tmp$ cat -n my-rcs.pl
     1  @target_rev = ();
     2  foreach(@ARGV){
     3          if(/-r(\d+\.\d+):(\d+\.\d+)\b/){
     4                  $from=$1; $to=$2;
     5                  next;
     6          }
     7          if(/-r(\d+\.\d+(?:\,\d+\.\d+)*)\b/){
     8                  @target_rev = split /,/,$1;
     9                  next;
    10          }
    11  }
    12
    13  $working_file = $ARGV[0];
    14  $rcs_file = "./RCS/$working_file,v";
    15  $n=$#target_rev+1;
    16  open(IN,"<$rcs_file");
    17  while(<IN>){
    18          chomp;
    19          if(/^head\t(\d+\.\d+);/){
    20                  $head = $1;
    21                  next;
    22          }
    23          if(/^locks; (\w+);/){
    24                  $locks = $1;
    25                  next;
    26          }
    27          if(/^(\d+\.\d+)$/){
    28                  $rev = $1;
    29                  next;
    30          }
    31          if(/^(date\t\d\d\d\d\..*)$/){
    32                  $date = $1;
    33                  $hist{$rev} .= ":SEP:" . $date;
    34                  $total_revision++;
    35                  next;
    36          }
    37          if(/^log$/){
    38                  $sts = "log-start";
    39                  next;
    40          }
    41          if($sts eq "log-start"){
    42                  if(/^\@/){
    43                          s/^\@//;
    44                          $hist{$rev} .= ":SEP:" . $_;
    45                          $sts = "log";
    46                  }
    47                  next;
    48          }
    49          if($sts eq "log"){
    50                  if(/\@$/){
    51                          s/\@$//;
    52                          $hist{$rev} .= $_ . ":SEP:";
    53                          $sts = "";
    54                          next;
    55                  }
    56                  $hist{$rev} .= $_;
    57          }
    58  }
    59  close(IN);
    60
    61  @all = sort {$b <=> $a} keys %hist;
    62  print <<EOL;
    63
    64  RCS file: $rcs_file
    65  Working file: $working_file
    66  head: $head
    67  branch:
    68  locks: $locks
    69  access list:
    70  symbolic names:
    71  keyword substitution:
    72  total revisions: $total_revision;       selected revisions: $n
    73  description:
    74
    75  EOL
    76  foreach(@all){
    77          my $rev = $_;
    78
    79          my $aa= is_valid_revision($from,$rev,$to);
    80          next if($aa eq "no");
    81
    82  #       foreach(@target_rev){
    83  #       next unless(/$rev/);
    84          my $line = $hist{$rev};
    85          my ($tmp,$date,$log) = split /:SEP:/,$line;
    86
    87          print "----------------------------\n";
    88
    89          print"revision $rev\n";
    90          print"$date\n";
    91          print"$log\n";
    92  #       }
    93  }
    94  print"=============================================================================\n";
    95
    96
    97  sub is_valid_revision{
    98          my($from, $rev, $to) = @_;
    99
   100          my($from1,$from2) = split /\./,$from;
   101          my($rev1,$rev2) = split /\./,$rev;
   102          my($to1,$to2) = split /\./,$to;
   103
   104          return "no" if ($from1 > $rev1);
   105          return "no" if ($to1 < $rev1);
   106
   107          return "no" if ($from2 > $rev2);
   108          return "no" if ($to2 < $rev2);
   109
   110          return "yes";
   111  }
takk@deb9:~/tmp$

実行してみます。

takk@deb9:~/tmp$ perl my-rcs.pl test.c -r1.2:1.3

RCS file: ./RCS/test.c,v
Working file: test.c
head: 1.10
branch:
locks: strict
access list:
symbolic names:
keyword substitution:
total revisions: 10;    selected revisions: 0
description:

----------------------------
revision 1.3
date    2018.09.13.11.00.44;    author takk;    state Exp;
TEST
----------------------------
revision 1.2
date    2018.09.12.11.58.02;    author takk;    state Exp;
2nd Check in
=============================================================================
takk@deb9:~/tmp$

Leave a Reply

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

CAPTCHA