使用Perl脚本更新Clearcase中已签入文件的注释

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

错误:路径名未找到:“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`; 
    }
}

我已经编辑了我的答案,以解决您当前的“路径名未找到”错误。 - VonC
2个回答

2

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

$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在进行扩展。第一个替换将评论字符串中的每个单引号替换为序列'\''。命令中的替换将单引号包装在整个字符串周围。这意味着有一个单引号字符串,每个'\''序列都会停止当前的单引号字符串,输出一个转义的单引号,然后开始一个新的单引号字符串,必要时重复直到评论末尾的单引号。
你说脚本的名字是'appendcomments.pl',但在命令中使用了-replace而不是-append。这是你的决定,但名称与操作不匹配。

我尝试过了,但没有成功。你关于脚本名称的想法是正确的。一旦脚本开始运行,我打算更改它。 - user1792727
好的...喜欢术语“没用”。你所说的“没用”是什么意思?发生了什么事?出现了什么错误信息?由于你正在使用Cygwin,可能会出现我没有预料到的问题。你尝试了两个版本(简单或复杂)中的哪一个?你的命令行是什么? - Jonathan Leffler
与之前相同的错误:路径名未找到:"C:/Views/view1/some_dir/test.c@@/main/dbg_test/1"。 - user1792727
你遇到的问题是把文件名中的反斜杠映射为斜杠吗?它似乎在抱怨文件名而不是注释。 - Jonathan Leffler
我不需要捕获输出。所以我尝试发送系统命令(@cmd = cleartool chevent -c $comment -replace $file)。但是出现了相同的错误".eartool: Error: Pathname not found: "C:Views/view1/some_dir/test.c@@/main/dbg_test/1. 我在想文件路径是否覆盖了某些缓冲区。你有没有注意到错误中省略了'Cleartool'的'Cl'?也许Windows正在对我尝试发送的命令进行某些操作。 - user1792727
显示剩余2条评论

1

就像这个帖子这个帖子中一样,请尝试转义那些引号:

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

说实话,实际问题在于"C:/Views/view1/some_dir/test.c@@/main/dbg_test/1"永远不会存在(无论是否使用Cygwin):ClearCase只能在动态视图(如M:\...)中访问扩展路径,而不能在快照视图(如C:\...)中访问,就像这个例子一样,它使用了一个动态视图。
更准确地说,从"路径名_ccase"来看:
从动态视图来看,您可以将此处描述的路径名形式用作任何需要路径名参数的cleartool命令的参数。
从快照视图来看,您可以使用VOB扩展路径名形式作为那些返回有关元素和版本信息的cleartool命令(例如describelslshistorydiff)的参数。这样的操作不需要MVFS。
但是,您不能使用VOB扩展路径名形式来检出未加载到您的视图中的元素版本。
Windows用户请注意:cleartool区分大小写。在cleartool子命令中,对于MVFS对象的路径名(包括MVFS命名空间中的视图私有文件),必须正确大小写。
  • 使用动态视图
  • 确保路径的大小写正确(在cygwin会话中简单地使用cleartool descr M:/path/to/file@/main/aVersion
  • 然后尝试您的ccperl脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接