2

当我发出以下命令时,在动态“默认视图”的上下文中:

$ cd Dir_A/Dir_B

$ ct find . -all -nvi -type f -ele 'brtype(my_branch)' -print

对于每一行,我都会得到如下所示的奇怪输出:

/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Branch_B/n1/Dir_C/main/Branch_C/n2/Dir_D/main/Branch_D/n3/Filename@@

如何让 find 命令简单地打印标准操作系统路径名,而不需要每个目录的所有中间版本信息?

我试过-exec 'ct des -fmt'无济于事。

4

1 回答 1

3

这种奇怪的格式称为扩展路径名
如此处所述,结果如下:

\proj_vob\foo.c@@\main\bugfix\4

实际上称为版本扩展路径名

在你的情况下:

/vobs/vob_name/Dir_A/Dir_B@@/main/Branch_A/Dir_C/[...]/n3/Filename@@

是一个vob 扩展路径名

它引用在视图中不再可见的元素(文件或目录)(因为它们已被 rmnamed 删除)。

您可以使用元素的版本 ID 访问任何版本的元素,该版本 ID 指定了其确切的版本树位置。

这允许访问在您正在执行 a 的视图中不可见的版本(即由视图的配置规范选择)cleartool find(因为视图是 find 的要求)。


也试试这个-nxname选项:

ct find . -all -nvi -nxname -type f -ele "brtype(my_branch)" -print

(但这只会删除 final @@


fmt_ccase有一些方法来格式化它,但你也可以尝试(如在这里):

-exec "echo %CLEARCASE_PN%"

(在这里它不起作用,因为找到的版本没有可用的“路径名”:视图没有直接选择它,因此该版本不可见,并%CLEARCASE_PN%设置为%CLEARCASE_XPN%扩展路径名)。

还要检查 Leaf 名称返回的内容:

-exec "cleartool  descr -fmt \"%Ln\" \"%CLEARCASE_XPN%\""

但这只会返回文件名,而不是它的路径。


如果您需要一个简单的路径(它不代表“实际”路径,因为这些元素在视图中并非全部可见),您需要处理每一行以便删除/main/.../n1,只留下Dir_C\dir_D\element.

这是一个应该这样做的库:ClearCase-Tools

 $explicitPath = '/vobTag/users/.@@/main/1/llf/main/12/install/main/1/README/main/2';
 $canonPath = ClearCase::Vob::CanonPath->parse( $explicitPath );
 $canonPath = $cpathObj->parse( $explicitPath );

在此示例中,其中$canonPath将包含以下字符串:

 /vobTag/users/llf/install/README

您可以在这些 rpm 中找到源代码,在usr/lib/perl5/vendor_perl/5.6.1/ClearCase/Vob/CanonPath.pm.

实现并非微不足道,但它是可行的:非常小的提取物:

push @branches, "main";
while (@leaves && !(($leaves[0] =~ "^[0-9]+\$") || ($leaves[0] =~ "^CHECKEDOUT\.[0-9]+\$"))) {
  $leaf = shift(@leaves);
  push @branches, $leaf if defined($leaf);
  $self->dpr("dump(3) $leaf")     if defined($leaf);
}
于 2013-07-11T04:04:05.573 回答