我有多个遗留代码项目树,它们使用 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
我正在努力解决的是,是否有一些东西已经做到了这一点,而我在所有搜索中都错过了。
我正在 RHEL 6.7 上运行,其中包含 rcs 5.7、gnu awk 3.1.7、gnu make 3.81、bash 4.1.2
答案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
其中“相同未锁定”表示它已签入且只读,通常是所需的状态。