web-dev-qa-db-ja.com

保留中のPERFORCEチェンジリストのすべてのファイルの差分を取得するにはどうすればよいですか?

特定の保留中のチェンジリストにあるファイルの差分を取得したい。私はこれを行うことができればいいのに:

p4 diff -c 999

誰かがこれを実現するためにいくつかのcshマジックをつなぎ合わせるのを手伝ってくれる?

たぶんp4 opened -c 999の出力を取得してp4 diffにパイプしますか?

37
ack

最も簡単な方法はp4vまたはp4winですが、それはあなたが求めていたものではありません。

これを試して:

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

もちろん、サブシェルのパスにp4があり、$ P4CLIENTなどがすべて設定されていることを確認する必要があります。

20
Mark

保留中のチェンジリストの変更を保留してから実行します

p4 describe -S -du 999
25
Alexander Bird

解決

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

説明

p4 -xxargs に似ていますが、xargsを使用する必要はありません。 p4 help utilsから:

-xフラグは、指定したファイルから1行に1つずつ引数を読み取るようp4に指示します。 '-'を指定すると、標準入力が読み取られます。

そのため、質問で提案されているように、「p4の出力を-c 999で開いて、p4 diffにパイプする」ことができます。トリッキーな部分の1つは、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コマンドを使用してより賢くする必要があります。そして精神科医に会いなさい。

14
Day

p4は999を記述します| grep '#' |カット-d "#" -f1 |カット-d "" -f2 | xargs p4 diff

8
shadkam islam

次のようなシェルスクリプトを使用できます。

#!/bin/sh

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

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

チェンジリスト番号を付けて呼び出すと、stdoutにパッチが作成されます。

6
voronaam

Windows cmd Shellから機能するワンライナーの場合、これを試してください:

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

これをバッチファイルで行うには、%%Fの代わりに%Fを使用する必要があります。

cygwin または nixutils などのUNIXライクなユーティリティパッケージをインストールしている場合、上記のソリューションの一部はWindowsで機能しますが、このワンライナーには外部の依存関係はありません。 。

1
yoyo

Markと同様のアプローチを使用しましたが、Awkの代わりにPerlとShell関数(zsh内)を使用しました。

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

チェンジリストの名前/番号だけでなく、ファイルパスも指定できることに注意してください。

p4dc default | less
p4dc default ... | less
1
Ken Williams

上記はあなたの質問に答えますが、タイルが変更リストのディレクトリを比較していると読まれた場合、次のように答えることができます:

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に対してディレクトリ内のすべてのファイルが比較されます。そうでない場合は、最新バージョンが使用されます。

これはGNU Awk 3.1.3でテストされました

0
Frobbit