我正在尝试编写一个Perl子例程,它返回一个文件数组,这些文件已经被修改并从$previous_date到now提交到Perforce存储库。子程序如下所示:
sub p4_files {
my ($previous_date) = @_;
my $files = "//depot/project/design/...rtl.sv"
my $p4cmd = "p4 files -e $files\@$previous_date,\@now";
my @filelist = `$p4cmd`;
chomp @filelist;
return @filelist;
}如果在给定日期之间提交了文件,则子例程将按预期工作。但是,没有进行任何新的更改,执行p4 files命令将返回一条消息:
prompt% p4 files -e //depot/project/design/...rtl.sv\@25/05/2017,\@now
prompt% //depot/project/design/...rtl.sv\@25/05/2017,\@now - no revision(s) after that date.我应该如何在Perl脚本中处理这个问题?遇到这种情况时,我想退出脚本。
发布于 2017-05-25 07:49:24
如果数组没有填充,什么也不做。
my @filelist = `$p4cmd`;
good_bye() unless @filelist; # Say goodbye and exit.
chomp @filelist;要抑制消息,只需将命令的stderr重定向到bitbucket:
my $p4cmd = "p4 files -e $files\@$previous_date,\@now 2> /dev/null";发布于 2017-05-25 07:36:39
不幸的是,p4返回退出代码0,不管它是否找到了一些文件,或者它是否返回“在那个日期之后没有修改”消息。这意味着您必须解析输出。
最简单的解决方案可能是退出脚本if $filelist[0] =~ / - no revision\(s\) after that date\./。缺点是我们不知道这个信息有多“稳定”。Perforce的未来版本会准确地发出这条消息吗?或者它们是否有可能重言?
另一个选项是使用-s开关:my $p4cmd = "p4 -s files -e $files\@$previous_date,\@now";。这会导致p4在输出的每一行之前都加上“严重性”。如果找到一个文件,行将以info:开头,而“在该日期之后没有修改”将以error:开头。在我看来,这是比较稳定的:退出if grep /^error:/, @filelist。注意最后一行;当您使用-s开关时,您将得到一条带有退出代码的额外行。
另一种选择是使用P4Perl。在这种情况下,您将得到作为结构化数据的结果,这将避免解析。这可以说是最优雅的,但您首先需要P4Perl模块。
发布于 2017-05-25 17:08:17
我建议使用-F标志来驯服输出:
my $p4cmd = "p4 -F %depotFile% files -e $files\@$previous_date,\@now";然后进行以下操作:
my @filelist = `$p4cmd`;
good_bye() unless @filelist; # Say goodbye and exit.如果没有包含@filelist字段的输出行,则%depotFile%将为空,而且调用方现在不需要尝试从标准p4 files输出中解析depot路径。
如果您想进一步按摩p4 files输出,请查看p4 -e files (args),以便您可以插入到-F中的不同字段是什么。
https://stackoverflow.com/questions/44174400
复制相似问题