複数ユーザーのバージョン管理に 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、bash 4.1.2を含むRHEL 6.7で動作しています。
答え1
従来の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
ディレクトリまたはファイルを指定すると、次の出力が生成されます。
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
「同一のロック解除」はチェックインされており、読み取り専用であることを意味し、これは通常望ましい状態です。