【问题标题】:Formatting Clearcase cleartool find output格式化 Clearcase cleartool 查找输出
【发布时间】:2013-07-09 05:02:18
【问题描述】:

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

$ 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' 无济于事。

【问题讨论】:

    标签: find clearcase cleartool


    【解决方案1】:

    这种奇怪的格式称为 extended path name
    作为explained here,结果如下:

    \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 指定了其确切的版本树位置。

    这允许访问在您正在执行cleartool find(自a view is a requirement for a find)的视图中不可见的版本(即由视图的配置规范选择)。


    也试试-nxname 选项:

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

    (但这只会删除最后的@@


    fmt_ccase 有一些方法可以格式化它,但你也可以尝试(如in here):

    -exec "echo %CLEARCASE_PN%"
    

    (这里不行,因为找到的版本没有可用的“路径名”:视图没有直接选择它,所以该版本不可见,%CLEARCASE_PN%设置为@ 987654336@,扩展路径名)。

    检查叶子名称返回的内容:

    -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
    

    您可以在usr/lib/perl5/vendor_perl/5.6.1/ClearCase/Vob/CanonPath.pm 中找到sources in those rpm

    实现并不简单,但它是可行的:非常小的提取:

    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);
    }
    

    【讨论】:

    • 第一个命令返回相同的扩展路径名,并将版本信息附加到中间目录。第二个命令返回文件名,没有路径。我只需要每个元素的操作系统路径名。我不明白为什么这么难。
    • @ThomasMcLeod 这“太难了”,因为 find -all 将查看所有 vobs 的所有历史记录,这意味着从视图中看不到/无法访问结果(因此扩展路径名,实际上可以从任何动态视图访问)。 “可访问”意味着如果您执行“类型\simple\path\result”,它将返回“未找到”。这些结果在视图中不直接可见。我已经编辑了答案以添加更多信息。
    • 感谢您的详细回答。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2013-07-16
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多