Подтвердить что ты не робот

Как получить разницу между всеми файлами в ожидающем списке изменений Perforce?

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

p4 diff -c 999

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

Возможно, вывести вывод p4 opened -c 999 и передать его на p4 diff?

4b9b3361

Ответ 1

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

Попробуйте следующее:

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

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

Ответ 2

Поместите изменения в ожидающий список изменений, затем запустите

p4 describe -S -du 999

Ответ 3

Решение

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 [email protected]
//depot/new-example#1 - add change 999 (text) by [email protected]

Но мы можем запустить это с помощью простого sed -e 's/#.*//', чтобы отключить все, начиная с # и далее, чтобы оставить только пути:

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

который затем может быть потреблен со стандартного ввода и подается на p4 diff благодаря p4 -x -.

Если у вас есть # в именах любых файлов, вам нужно будет более умно с помощью команды sed. И см. Психиатр.

Ответ 4

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

Ответ 5

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

#!/bin/sh

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

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

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

Ответ 6

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

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

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

p4dc default | less
p4dc default ... | less

Ответ 7

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

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