Как получить различия всех файлов в ожидающем списке изменений Perforce? - PullRequest
36 голосов
/ 13 июля 2009

Я хочу получить различия в файлах из определенного ожидающего списка изменений. Я хотел бы сделать это:

p4 diff -c 999

Может ли кто-нибудь помочь мне собрать магию csh, чтобы это произошло?

Может быть, взять вывод p4 opened -c 999 и передать его в p4 diff?

Ответы [ 8 ]

24 голосов
/ 08 ноября 2012

Отложите изменения в ожидающем списке изменений, затем выполните

p4 describe -S -du 999
18 голосов
/ 13 июля 2009

Самый простой способ - это p4v или p4win, но это не то, о чем вы спрашивали.

Попробуйте это:

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

Вам, конечно же, нужно убедиться, что в подчиненной оболочке есть путь p4, а $ P4CLIENT и т. Д. Настроены.

11 голосов
/ 07 сентября 2012

Решение

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

Объяснение

p4 -x дает вам xargs подобную способность без необходимости использования xargs. От p4 help utils:

Флаг -x указывает p4 читать аргументы, по одному на строку, из указанный файл. Если вы укажете «-», стандартный ввод будет считан.

Таким образом, вы можете просто "взять вывод p4 open -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. И обратиться к психиатру.

8 голосов
/ 13 октября 2011

р4 описать 999 | grep '#' | cut -d "#" -f1 | cut -d "" -f2 | xargs p4 diff

6 голосов
/ 05 ноября 2010

Вы можете использовать скрипт оболочки следующим образом:

#!/bin/sh

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

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

позвоните по номеру списка изменений, и вы получите патч в стандартный вывод.

1 голос
/ 09 июня 2018

Для однострочника, который работает из оболочки Windows cmd, попробуйте это:

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

Чтобы сделать это в командном файле, вам нужно использовать %%F вместо %F.

Обратите внимание, что некоторые из приведенных выше решений будут работать под Windows, если вы установили пакет утилит, подобный Unix, такой как cygwin или unixutils , но этот однострочный не имеет внешнего зависимостей.

1 голос
/ 21 мая 2011

Я использовал такой же подход, как и Марк, но я использовал Perl вместо Awk и функцию оболочки (в zsh):

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

Обратите внимание, что вы также можете указать путь к файлу, помимо имени / номера списка изменений:

p4dc default | less
p4dc default ... | less
0 голосов
/ 02 апреля 2010

Вышеприведенный ответ отвечает на ваш вопрос, но, если плитка читается как вывод каталога из списка изменений, на нее можно ответить следующим образом:

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, в котором используется версия "have", если он был извлечен, в противном случае используется последняя версия.

это было протестировано с GNU Awk 3.1.3

...