Scripting perforce中目录/文件的当前签出版本

Scripting perforce中目录/文件的当前签出版本,scripting,automation,perforce,Scripting,Automation,Perforce,我正试图为一个保存在perforce中的项目自动化一些构建。我想提取当前变更列表编号作为标记构建版本的一种方式 此命令: p4 changes -s submitted ... | head -1 p4 changes -m 1 @name_of_your_client_here 非常接近我所需要的,除非我没有从perforce签出最新版本。上面的命令(似乎)显示所有变更列表,而不仅仅是我签出中的变更列表 是否有方法获取最近同步到变更列表的变更列表编号 注意:我来自更多的CVS/git背

我正试图为一个保存在perforce中的项目自动化一些构建。我想提取当前变更列表编号作为标记构建版本的一种方式

此命令:

p4 changes -s submitted  ...  | head -1
p4 changes -m 1 @name_of_your_client_here
非常接近我所需要的,除非我没有从perforce签出最新版本。上面的命令(似乎)显示所有变更列表,而不仅仅是我签出中的变更列表

是否有方法获取最近同步到变更列表的变更列表编号


注意:我来自更多的CVS/git背景,因此我的术语可能不适用。

我认为以下内容可以满足您的要求:

p4 fstat -T headChange ... | cut -d' ' -f3 | sort -nr | head -1

p4 fstat
非常好,因为它不仅需要一个过滤器(通过
-F
选项),还需要一个字段选择参数(使用
-T
选项)。

您需要的是文件的“haveRev”:

rev = `p4 fstat -T haveRev <filename>|cut -d' ' -f3`
rev=`p4 fstat-T haveRev | cut-d'-f3`
然后你可以像这样查找changenumber:

p4 filelog <filename>|grep $rev|cut -d' ' -f4
p4文件日志| grep$rev | cut-d'-f4

请注意,我使用了签出树的特定文件。

要查找客户端上的最新变更列表,请使用以下命令:

p4 changes -s submitted  ...  | head -1
p4 changes -m 1 @name_of_your_client_here

客户端名称可以像标签一样使用。

尝试运行“p4 cstat…”。这将告诉您,对于影响“…”中文件集的每个变更列表,您是否拥有该变更列表、是否需要该变更列表,或者是否将其部分同步。

我同意“p4 cstat”方法

我像这样使用它:p4 cstat | p4-version.awk 以下是哪个脚本:

 #! /usr/bin/awk -f

 # The input format is:
 # ... change 654056
 # ... status have|need|partial


 # So what we do:
 # find the first "need" or "partial"

 # and we might add +N as the number of other changes we have

 # Major is never 0. Hence End is set only once, to a non-zero.

 # Note: it's assumed that 0 is not a valid P4 changelist.
 # so  0+1-1 means: no entire changelist (i.e. the initial one)
 # has been (entirely) synced.

 # major is the last p4 CL processed
 # end   is the last CL, up to which _fully_ synced.
 # plus/minus  additional/missing CLs.

 BEGIN {end=0; contiguous=1; plus=0; minus=0}

 /^... change ([0-9])+/ {
         change=$3;
 };


 # we have 2 states: 1/ until now all have -- contiguous=1
 #                   2/ already something not "have"

 # (end=0) state 1

 /^... status have/ {
         if (!contiguous)
                  plus++;
         else
           end=change;
 };


 /^... status (partial|need)/ {
         minus++;
         if (contiguous) {
                 contiguous = 0;
         };
 }


 END {
         if (!contiguous)
                 printf "%d+%d-%d\n", end, plus, minus;
         else
                 printf "%d\n", end;
 }

虽然我不确定它是否适用于这个问题,但我想展示一个解决方案,让您可以将最新的变更列表升级到您已同步的变更列表,而不留任何间隙(即,您可以在客户端上同步新的变更列表,而不同步一些旧的变更列表,例如,如果您自己提交了变更,而之前没有同步其他人提交的一些变更)

使用以下命令,可以列出所有未同步到客户端的更改:

p4 changes ..."#>have" 
如果您提取该列表的最后一个变更列表并减去1,则您将得到变更列表编号,您已将所有内容同步到该编号,且没有间隔:

echo $((`p4 changes ..."#>have" | tail -1 | awk '{print $2}'`-1))

这似乎提供了与p4 changes-s submitted相同的版本,即:可用的最新版本,而不是当前签出的版本。我一定是误读了问题,我必须在进入办公室后检查此问题。
p4 help fstat
列出了可用的属性。对输出有疑问:您有“printf”%d+%d\n“,end,plus;”,加号是什么?否则,太棒了!谢谢分享。我更新了代码--version+plus-plus意味着你从开始一直同步到“version”,另外你还有其他“plus”更改集同步,而“plus”没有(完全)同步已同步--因此丢失。可能您没有比已同步到客户端的最新更改列表更早的已同步更改列表。例如,如果您提交了新更改,但之前没有同步客户端。您应该在方法中提及这一点。嗯,是的。我也说过,但这不是问题所在。