rcsを使う(その12)


アニメ映画『虐殺器官』(2017)

誰かと見て感想を語り合いたくなる映画。私は最後まで見て、理屈は分からないこともないのだけど、それは神や悪魔の範疇なので、人がやっていいことではないだろうなあと思いつつも、大切な人を守りたいという想いは何者にも勝るってのに感動を覚えました。
映像も迫力あるのだけど、面白いのは会話でしょうか。なので本来は小説も読むべきかも。先に映画を見てしまってネタばれしてると、小説を読もうとはならず、しまったなあと感じました。
近未来的なマシンの動きは見てて楽しいです。中でもコンタクトレンズが最高。ナノレベルのコンピュータが仕込まれているコンタクトレンズ。装着すると、視界がコンピュータのスクリーンのようになり、いろんな情報が映し出されるんです。これを応用すれば、視界に入る人の容姿だって変えられる気がします。きっと全員美女にできます。老若男女、全員美少女です。

さて、私が夢中になってるrcsコマンドの、続きです。

レビジョン範囲指定をしてrcs logコマンドを実行してみます。-rオプションはファイル名の前のパラメータに指定します。

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

一方、自作コマンドの方は、ファイル名を最初に指定します。なぜかというと、$ARGV[0]で取得したパラメータをファイル名としているからです。

takk@deb9:~/tmp$ perl my-rcs.pl test.c -r1.2:1.4 | grep ^rev
revision 1.4
revision 1.3
revision 1.2
takk@deb9:~/tmp$

またrcsコマンドの方に戻ります。
rcs logコマンドの-rオプションよりファイル名より前に指定するとどうなるでしょうか。

takk@deb9:~/tmp$ rcs log test.c -r1.2:1.4 | grep ^rev
log: revision 1.10
revision 1.9
revision 1.8
revision 1.7
revision 1.6
revision 1.5
revision 1.4
revision 1.3
revision 1.2
revision 1.1
-r1.2:1.4 option is ignored after filenames
takk@deb9:~/tmp$

うまく動きませんでしたね。
rcs logコマンドでレビジョンを範囲指定するときは、ファイル名は一番最後に書きます。これはUNIX時代からあるコマンドだとこのならわしで作られるのがほとんどだと思います。

rcsコマンドは-rオプションより後に、ファイル名を指定しなければならないことは分かりました。さて、このファイル名、複数指定はできるでしょうか。あえて同じファイル名test.cを1回指定してみます。

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

同じ出力が2回表示されました。つまり複数ファイルに対応しています。

では、自作コマンドもファイル名を-rオプションの後で指定できるように改造しましょう。複数ファイルも指定できるようにします。

修正前。

takk@deb9:~/tmp$ cat -n my-rcs.pl | head -16
     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");
takk@deb9:~/tmp$

修正後。pushするだけです。

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          push @working_files,$_;
    12  }
    13
    14  foreach(@working_files){
    15  $working_file = $_;
    16  $rcs_file = "./RCS/$working_file,v";
 
 ~省略~

    96  }
    97  print"=============================================================================\n";
    98  }

では確認。

takk@deb9:~/tmp$ perl my-rcs.pl -r1.2:1.4 test.c test.c | grep ^rev
revision 1.4
revision 1.3
revision 1.2
revision 1.4
revision 1.3
revision 1.2
takk@deb9:~/tmp$

自作コマンド、どんどんよくなります。

Leave a Reply

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

CAPTCHA