web-dev-qa-db-fra.com

Comment puis-je obtenir des diffses de tous les fichiers d'un changeliste de performance en attente?

Je veux obtenir Diffs sur des fichiers dans un changeliste en attente spécifique. J'aimerais pouvoir faire ceci:

p4 diff -c 999

Quelqu'un peut-il m'aider à ficeler ensemble une magie de CSH pour que cela se produise?

Peut-être prendre la sortie de p4 opened -c 999 et le tuyau à p4 diff?

37
ack

Le moyen le plus simple est en P4V ou P4Win, mais ce n'est pas ce que vous demandiez.

Essaye ça:

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

Bien sûr, vous devez vous assurer que la sous-shell a P4 sur son chemin, et $ p4Client, etc ... sont tous mis en place.

20
Mark

Suspendre les changements dans la Changeelist en attente, puis courez

p4 describe -S -du 999
25
Alexander Bird

Solution

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

Explication

p4 -x Vous donne xargs Like Capacité sans avoir à utiliser xargs. De p4 help utils:

Le drapeau -X indique à P4 de lire des arguments, une par ligne, du fichier spécifié. Si vous spécifiez '-', la saisie standard est lue.

Vous pouvez donc presque simplement "prendre la sortie de P4 ouvert -c 999 et la pipe à P4 DIFF" comme suggéré dans la question. La partie délicate est que la sortie de p4 opened Contient des numéros de révision et un texte explicatif après le nom de chaque fichier ouvert par ex.

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

Mais nous pouvons exécuter cela via un simple sed -e 's/#.*//' Pour éteindre tout à partir du # À partir des chemins:

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

ce qui peut ensuite être consommé à partir d'une entrée standard et ademé à p4 diff grâce à p4 -x -.

Si vous avez # Dans les noms de tous les fichiers, vous devrez devenir plus intelligent avec la commande sed. Et voir un psychiatre.

14
Day

p4 Décrivez 999 | Grep '#' | Cut -D "#" -F1 | coupe -d "" -f2 | Xargs P4 Difff

8
shadkam islam

Vous pouvez utiliser Shell Script comme celui-ci:

#!/bin/sh

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

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

appelez-le avec le numéro de Changeelist et vous obtiendrez un correctif dans stdout.

6
voronaam

Pour une doublure qui fonctionne de Windows CMD Shell, essayez ceci:

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

Pour ce faire dans un fichier de commandes, vous devez utiliser %%F au lieu de juste %F.

Notez que certaines de la solution ci-dessus fonctionneront sous Windows si vous avez installé un package utilitaires de type UNIX tel que CYGWIN ou nixutils , mais cette doublure n'a aucune dépendance externe. .

1
yoyo

J'ai utilisé une approche similaire comme marque, mais j'ai utilisé Perl au lieu d'AWK, et une fonction shell (dans ZSH):

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

Notez que vous pouvez également fournir un chemin de fichier, en plus du nom/numéro de Changelist:

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

Ce qui précède répond à votre question, mais si la tuile est lue comme un répertoire d'un répertoire sur une liste de modifications, il est possible de répondre avec ce qui suit:

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

Cela diffèrera tous les fichiers du répertoire contre le Changeelist 999 qu'il utilise la version "avoir" si elle est vérifiée sinon elle utilise la dernière version.

cela a été testé avec GNU AWK 3.1.3

0
Frobbit