首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在没有提交新文件的情况下处理Perl中的Perforce消息

在没有提交新文件的情况下处理Perl中的Perforce消息
EN

Stack Overflow用户
提问于 2017-05-25 07:08:55
回答 3查看 105关注 0票数 0

我正在尝试编写一个Perl子例程,它返回一个文件数组,这些文件已经被修改并从$previous_datenow提交到Perforce存储库。子程序如下所示:

代码语言:javascript
运行
复制
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命令将返回一条消息:

代码语言:javascript
运行
复制
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脚本中处理这个问题?遇到这种情况时,我想退出脚本。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-25 07:49:24

如果数组没有填充,什么也不做。

代码语言:javascript
运行
复制
my @filelist = `$p4cmd`;
good_bye() unless @filelist;  # Say goodbye and exit.

chomp @filelist;

要抑制消息,只需将命令的stderr重定向到bitbucket:

代码语言:javascript
运行
复制
my $p4cmd = "p4 files -e $files\@$previous_date,\@now 2> /dev/null";
票数 0
EN

Stack Overflow用户

发布于 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模块。

票数 1
EN

Stack Overflow用户

发布于 2017-05-25 17:08:17

我建议使用-F标志来驯服输出:

代码语言:javascript
运行
复制
my $p4cmd = "p4 -F %depotFile% files -e $files\@$previous_date,\@now";

然后进行以下操作:

代码语言:javascript
运行
复制
my @filelist = `$p4cmd`;
good_bye() unless @filelist;  # Say goodbye and exit.

如果没有包含@filelist字段的输出行,则%depotFile%将为空,而且调用方现在不需要尝试从标准p4 files输出中解析depot路径。

如果您想进一步按摩p4 files输出,请查看p4 -e files (args),以便您可以插入到-F中的不同字段是什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44174400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档