测试树中是否有任何 RCS 控制的文件未签入

测试树中是否有任何 RCS 控制的文件未签入

我有多个遗留代码项目树,它们使用 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

其中“相同未锁定”表示它已签入且只读,通常是所需的状态。

答案2

我使用一个实用程序checkup,我在 20 世纪 80 年代末写的,并将结果通过管道传输到我的目录编辑器中ded,我可以从中运行rcsdiff、解锁或恢复更改。

举例来说,一张屏幕截图显示了一些未签入的文件,以及比上次签入日期更新的文件:

在此输入图像描述

相关内容