没有提交新文件时在 Perl 中处理 Perforce 消息

Handling Perforce message in Perl when there are no new files submitted

我正在尝试编写一个 Perl 子例程,该子例程 returns 从 $previous_datenow 已修改并提交到 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 的不同字段。