没有提交新文件时在 Perl 中处理 Perforce 消息
Handling Perforce message in Perl when there are no new files submitted
我正在尝试编写一个 Perl 子例程,该子例程 returns 从 $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
命令returns一条消息:
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 脚本中处理这个问题?遇到这种情况我想退出脚本
不幸的是,p4
returns 退出代码 0,无论它是否找到某些文件或 returns "no revision(s) after that date" 消息。这意味着您必须解析输出。
最简单的解决方案可能是退出脚本 if $filelist[0] =~ / - no revision\(s\) after that date\./
。缺点是我们不知道 "stable" 该消息是怎样的。 Perforce 的未来版本是否会准确地发出此消息,或者他们是否可能改写?
另一种选择是使用 -s
开关:my $p4cmd = "p4 -s files -e $files\@$previous_date,\@now";
。这导致 p4
在每行输出之前添加 "severity" 。如果找到文件,该行将以 info:
开头,而 "no revision(s) after that date" 将以 error:
开头。这对我来说看起来更稳定一些:exit if grep /^error:/, @filelist
。注意最后一行;当您使用 -s
开关时,您会得到一个带有退出代码的额外行。
还有一个选择是使用 P4Perl。在那种情况下,您将获得结构化数据的结果,这将避免解析。这可以说是最优雅的,但您首先需要 P4Perl 模块。
如果数组未填充,则什么也不做。
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";
我建议使用 -F
标志来控制输出:
my $p4cmd = "p4 -F %depotFile% files -e $files\@$previous_date,\@now";
然后继续:
my @filelist = `$p4cmd`;
good_bye() unless @filelist; # Say goodbye and exit.
如果没有包含 %depotFile%
字段的输出行,@filelist
将为空,现在您的调用者不需要尝试从标准 p4 files
输出。
如果您想进一步修改 p4 files
输出,请查看 p4 -e files (args)
以便您了解可以插入 -F
的不同字段。
我正在尝试编写一个 Perl 子例程,该子例程 returns 从 $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
命令returns一条消息:
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 脚本中处理这个问题?遇到这种情况我想退出脚本
不幸的是,p4
returns 退出代码 0,无论它是否找到某些文件或 returns "no revision(s) after that date" 消息。这意味着您必须解析输出。
最简单的解决方案可能是退出脚本 if $filelist[0] =~ / - no revision\(s\) after that date\./
。缺点是我们不知道 "stable" 该消息是怎样的。 Perforce 的未来版本是否会准确地发出此消息,或者他们是否可能改写?
另一种选择是使用 -s
开关:my $p4cmd = "p4 -s files -e $files\@$previous_date,\@now";
。这导致 p4
在每行输出之前添加 "severity" 。如果找到文件,该行将以 info:
开头,而 "no revision(s) after that date" 将以 error:
开头。这对我来说看起来更稳定一些:exit if grep /^error:/, @filelist
。注意最后一行;当您使用 -s
开关时,您会得到一个带有退出代码的额外行。
还有一个选择是使用 P4Perl。在那种情况下,您将获得结构化数据的结果,这将避免解析。这可以说是最优雅的,但您首先需要 P4Perl 模块。
如果数组未填充,则什么也不做。
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";
我建议使用 -F
标志来控制输出:
my $p4cmd = "p4 -F %depotFile% files -e $files\@$previous_date,\@now";
然后继续:
my @filelist = `$p4cmd`;
good_bye() unless @filelist; # Say goodbye and exit.
如果没有包含 %depotFile%
字段的输出行,@filelist
将为空,现在您的调用者不需要尝试从标准 p4 files
输出。
如果您想进一步修改 p4 files
输出,请查看 p4 -e files (args)
以便您了解可以插入 -F
的不同字段。