如何在待处理的Perforce更改列表中获取所有文件的差异?

时间:2009-07-13 19:27:05

标签: shell terminal perforce csh

我希望在特定待定更改列表中的文件上获得差异。我希望我能做到这一点:

p4 diff -c 999

有人可以帮助我将一些csh魔法串联起来以实现这一目标吗?

也许取p4 opened -c 999的输出并将其输入p4 diff

9 个答案:

答案 0 :(得分:24)

将待更改列表中的更改搁置,然后运行

p4 describe -S -du 999

答案 1 :(得分:18)

最简单的方法是在p4v或p4win中,但这不是你要问的。

试试这个:

p4 opened -c 999 | awk 'BEGIN { FS = "#" } // { print "p4 diff " $1 }' | csh

当然,您需要确保子shell的路径中包含p4,并且$ P4CLIENT等等都已设置完毕。

答案 2 :(得分:10)

解决方案

p4 opened -c 999 | sed -e 's/#.*//' | p4 -x - diff

解释

p4 -x无需使用xargs即可为您提供xargs能力。来自p4 help utils

  

-x标志指示p4读取参数,每行一个     指定的文件。如果指定' - ',则读取标准输入。

所以你几乎可以“按照p4打开-c 999的输出并将其传递给p4 diff”,如问题所示。一个棘手的部分是p4 opened的输出包含每个打开文件名称后的修订号和说明文字,例如

//depot/example#123 - edit change 999 (text) by day@office
//depot/new-example#1 - add change 999 (text) by day@office

但我们可以通过一个简单的sed -e 's/#.*//'来解决这个问题,从#开始删除所有内容,只留下路径:

//depot/example
//depot/new-example

然后可以通过p4 diff从标准输入中消费并输入p4 -x -

如果您在任何文件的名称中都有#,那么您需要使用sed命令更加聪明。并且看一位精神科医生。

答案 3 :(得分:8)

p4描述999 | grep'#'| cut -d“#” - f1 | cut -d“” - f2 | xargs p4 diff

答案 4 :(得分:6)

您可以像这样使用shell脚本:

#!/bin/sh

list=`p4 opened -c $1 | cut -d# -f1`

for file in $list ;
do
  p4 diff -dwbu $file
done

使用更改列表编号调用它,您将在stdout中获得补丁。

答案 5 :(得分:1)

我使用了与Mark类似的方法,但我使用Perl而不是Awk,以及shell函数(在zsh中):

p4dc() { p4 opened -c $* | perl -ne 's/#.*//; system("p4", "diff", $_)' }

请注意,除了更改列表名称/编号外,您还可以提供文件路径:

p4dc default | less
p4dc default ... | less

答案 6 :(得分:1)

对于可从Windows cmd shell运行的单行程序,请尝试以下方法:

for /f "usebackq delims=#" %F in (`p4 opened -c 999`) do @p4 diff %F

要在批处理文件中执行此操作,您需要使用%%F而不是%F

请注意,如果您安装了类似于unix的实用程序包(例如cygwinunixutils),则上面的某些解决方案可以在Windows下运行,但这种单行程序没有外部依赖关系。

答案 7 :(得分:0)

以上回答了您的问题但是,如果将tile读取为在变更列表上区分目录,则可以使用以下内容进行回答:

p4 filelog ... | awk '
BEGIN {FS="[ /]";tc=999}
/^\/\// {fn=$NF;o=1;if (system("test -w " fn)) h=0; else h=""}
/^\.\.\.\ \#/ {if (h==0) h=$2;
  if ($4<=tc && o==1) {print "p4 diff -db -dw " fn h " " fn $2 " ;#"  $4;o=0}}' \
| sh

这会将目录中的所有文件与变更列表999区分开来,如果已经签出则使用“has”版本,否则它将使用最新版本。

这是用GNU Awk 3.1.3测试的

答案 8 :(得分:0)

对于搁置的更改(更改仍不在仓库中)

p4 opened -c 999 | awk 'BEGIN { FS = "#" } // { print "p4 diff " $1 }' | bash

对于搁置的更改(更改仓库中的内容(p4搁置-c 999)

p4 describe -S -du3 -O 999