【问题标题】:Updating comments of checkedin files in Clearcase with Perl Script使用 Perl 脚本在 Clearcase 中更新签入文件的注释
【发布时间】:2012-10-22 14:28:13
【问题描述】:

我想用 Perl 脚本更新 Clearcase 中签入文件的 cmets。
如果我从命令行传递的注释不包含空格,则此脚本可以正常工作。
但是当我使用带空格的 cmets 时,我遇到了错误 -

错误:找不到路径名:“C:/Views/view1/some_dir/test.c@@/main/dbg_test/1

以下是脚本的命令行输入:

>>./appendcomments.pl dbg_test "\"scr1234, Test Scr\""  

这是我的代码。

if ($#ARGV != 1 )
{
    print "usage: addcomments.pl <base branch> <comment>\n";
    print "     For example addcomments.pl rel5.0 \"This is an example\"\n";
    exit;
}

my $base_branch =   $ARGV[0];
my $comment   =     $ARGV[1];

my ($output, @FILE_LIST, $file, $desr);

@FILE_LIST = `cleartool find -avobs -version "version(.../$base_branch/LATEST)" -print`;

FILE: foreach $file (@FILE_LIST) 
{
    $file =~ s/\\/\//g;
    $desr =`cleartool describe -fmt %Nc $file`;

    if ($desr !~ /scr\s*\#*\s*(\d+)/img)
    {
        chomp($file);
        $output = `cleartool chevent -c $comment -replace $file`; 
    }
}

【问题讨论】:

  • 我已编辑我的答案以解决您当前的“Pathname not found”错误。

标签: perl cygwin clearcase


【解决方案1】:

在 cmets 周围使用双引号(假设 cmets 中没有双引号):

$output = `cleartool chevent -c "$comment" -replace $file`; 

如果您必须担心评论文本中出现双引号(或单引号,或两者),那么您需要对变量comment 做一些工作。因此,对于单引号评论,您应该考虑:

$comment =~ s/'/'\\''/g;  # Once, outside the loop

$output = `cleartool chevent -c '$comment' -replace $file`; 

在 shell 脚本中,$comment 周围的单引号会阻止 shell 扩展变量,但这是 Perl 进行的扩展。第一个替换用序列'\'' 替换注释字符串中的每个单引号。命令中的替换将单引号括起来。这意味着有一个单引号字符串,并且每个'\'' 序列都会停止当前的单引号字符串,输出一个转义的单引号,然后开始一个新的单引号字符串,根据需要重复直到最后的单引号的评论。

您说脚本是“appendcmets.pl”,但您在命令中使用-replace 而不是-append。您的决定,但名称与操作不符。

【讨论】:

  • 我试过了,还是不行。你对脚本的名称是正确的。我打算改变它的脚本开始工作。
  • 好吧...喜欢“没用”这个词。 “没有工作”是什么意思。发生了什么?错误信息是什么?由于您使用的是 Cygwin,因此可能会出现我没想到的问题。您尝试了两个版本(简单或复杂)中的哪一个?你的命令行是什么?
  • 与之前相同的错误错误:找不到路径名:“C:/Views/view1/some_dir/test.c@@/main/dbg_test/1
  • 麻烦您将文件名中的反斜杠映射为斜杠吗?它似乎在讨论文件名,而不是 cmets。
  • 乔恩,没错。但是只有当作为参数传入的注释包含空格时,perl 才会抱怨文件名。我试图通过这样转义引号来传递引号: $output = cleartool chevent -c \"$comment"\ -replace \"$file\";我陷入困境。错误:“.eartool:错误:找不到路径名:”C:/Views/view1/some_dir/test.c@@/main/dbg_test/1
【解决方案2】:

如在this threadthis thread 中,请尝试转义这些引号:

$output = `cleartool chevent -c \"$comment\" -replace \"$file\"`; 

话虽如此,实际问题是“C:/Views/view1/some_dir/test.c@@/main/dbg_test/1”将永远不存在(无论是否是cygwin):ClearCase 将访问一个 extended path 仅在动态视图中 (M:\...),而不是快照视图 (C:\...),如本示例中使用动态视图。

更准确地说,来自“pathnames_ccase”:

从动态视图中,您可以使用此处描述的路径名形式作为任何采用路径名的cleartool 命令的参数。
从快照视图中,您可以使用 VOB 扩展路径命名表单作为返回元素和版本信息的cleartool 命令的参数(例如,describelslshistorydiff)。此类操作不需要 MVFS。
但是,您不能使用 VOB 扩展路径名称表单来检查未加载到视图中的元素版本。

Windows 用户注意事项:cleartool 区分大小写。在cleartool 子命令中,MVFS 对象的路径名(包括 MVFS 命名空间中的私有视图文件)必须区分大小写。

所以在与引号打架之前:

  • 使用dynamic view
  • 确保路径的大小写正确(在 cygwin 会话中使用简单的 cleartool descr M:/path/to/file@/main/aVersion
  • 然后试试你的 ccperl 脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2018-02-05
    • 2014-04-02
    • 2010-12-04
    相关资源
    最近更新 更多