複数のユーザーによるバージョン管理にRCSを使用しているレガシーコードのプロジェクトツリーが複数あります。ツリーを歩き、ファイルがチェックアウトされているかどうかをテストできるようにしたいと思います(したがって、ツリーを配布更新用にパッケージ化する準備ができていません)。
たとえば、次のテストツリーがあります:tree -p .
.
├── [-r--r--r--] file1
├── [drwxrwxr-x] RCS
│ └── [-r--r--r--] file1,v
├── [drwxrwxr-x] subdir1
│ ├── [drwxrwxr-x] RCS
│ │ └── [-r--r--r--] sfile1,v
│ └── [-rw-r--r--] sfile1
└── [drwxrwxr-x] subdir2
├── [drwxrwxr-x] RCS
│ └── [-r--r--r--] sfile2,v
└── [-r--r--r--] sfile2
5 directories, 6 files
sfile1
以外のすべてのファイルがそれぞれのRCSディレクトリにチェックインされます。 sfile1
がチェックアウトされ、変更されました。
rlog subdir1/sfile1
(適切にチェックアウトされたファイル)は以下を返します。
RCS file: subdir1/RCS/sfile1,v
Working file: subdir1/sfile1
head: 1.1
branch:
locks: strict
torfey: 1.1
access list:
symbolic names:
keyword substitution: kv
total revisions: 1; selected revisions: 1
description:
----------------------------
revision 1.1 locked by: torfey;
date: 2016/07/20 13:09:34; author: torfey; state: Exp;
Initial revision
=============================================================================
一方、rlog subdir2/sfile2
(適切にチェックインされたファイル)は次を返します。
RCS file: subdir2/RCS/sfile2,v
Working file: subdir2/sfile2
head: 1.1
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 1; selected revisions: 1
description:
----------------------------
revision 1.1
date: 2016/07/20 13:10:04; author: torfey; state: Exp;
Initial revision
=============================================================================
したがって、私が望むコマンドは、ディレクトリ引数を指定して、RCSの一部であるそのディレクトリの下のすべてのファイルを検索し、チェックインされていないファイルの名前を返します(理想的には、検出可能な他の状態があり、悪い、ロックされていないがチェックインされたバージョンとは異なるなど、それも報告してください。)
test_rcs_tree .
上記の単純なケースでは、次のようになります。
./subdir1/sfile1 checked-out
私が苦労しているのは、私がすべての検索で見逃している、すでにこれを行っている何かがあるかどうかです。
Rcs 5.7、gnu awk 3.1.7、gnu make 3.81、bash4.1.2を搭載したRHEL6.7で実行しています。
従来のrcsステータススクリプトがあります。
#!/bin/bash
find ${@:-.} -type f |
sed '\;/RCS/;d' |
while read file
do msg=
if [ -z "$(rlog -R "$file" 2>/dev/null)" ]
then msg="$msg no RCS"
else if co -q -kk -p "$file" | cmp -s - "$file" ||
co -q -p "$file" | cmp -s - "$file"
then msg="$msg same"
else msg="$msg differs"
fi
if [ -z "$(rlog -L -R "$file")" ]
then msg="$msg not locked"
else msg="$msg locked"
user=$(rlog -h "$file" |
awk '/locks:/{ getline;
sub(":"," "); print $1 }')
if [ -n "$user" ]
then msg="$msg by $user"
fi
fi
fi
if [ -w "$file" ]
then msg="$msg writeable"
fi
echo "$file: $msg"
done
1つまたは複数のディレクトリを指定すると、次のような出力が生成されます。
whenerror: same not locked
kshrc: same not locked writeable
mylua.lua: no RCS writeable
subshell: differs locked by meuh writeable
mshrc: differs locked by meuh
ここで、「同じロックされていない」とは、チェックインされ、読み取り専用で、通常は目的の状態であることを意味します。