shell - ¿Cómo obtengo diffs de todos los archivos en una lista de cambios de Perforce pendiente?
terminal csh (8)
Quiero obtener diffs en archivos en una lista de cambios pendiente específica. Ojalá pudiera hacer esto:
p4 diff -c 999
¿Alguien puede ayudarme a unir algo de magia csh para que esto suceda?
Tal vez tomar la salida de p4 opened -c 999
y conectarlo a p4 diff
?
Solución
p4 opened -c 999 | sed -e ''s/#.*//'' | p4 -x - diff
Explicación
p4 -x
te da xargs
como habilidad sin tener que usar xargs
. Desde p4 help utils
:
La bandera -x indica a p4 que lea los argumentos, uno por línea, del archivo especificado. Si especifica ''-'', se lee la entrada estándar.
Así que casi puede simplemente "tomar la salida de p4 abierta -c 999 y canalizarla a p4 diff" como se sugiere en la pregunta. La única parte difícil es que la salida de p4 opened
contiene números de revisión y texto explicativo después del nombre de cada archivo abierto, por ejemplo
//depot/example#123 - edit change 999 (text) by day@office
//depot/new-example#1 - add change 999 (text) by day@office
Pero podemos ejecutar esto a través de un sed -e ''s/#.*//''
para quitar todo del #
adelante para dejar solo las rutas:
//depot/example
//depot/new-example
que luego se puede consumir desde la entrada estándar y alimentar a p4 diff
gracias a p4 -x -
.
Si tiene #
en los nombres de cualquier archivo, entonces necesitará obtener más inteligente con el comando sed
. Y mira a un psiquiatra
Deje de lado los cambios en la lista de cambios pendiente, luego ejecútelos
p4 describe -S -du 999
La forma más fácil es en p4v o p4win, pero eso no es lo que preguntabas.
Prueba esto:
p4 opened -c 999 | awk ''BEGIN { FS = "#" } // { print "p4 diff " $1 }'' | csh
Usted, por supuesto, necesita asegurarse de que el caparazón secundario tenga p4 en su camino, y $ P4CLIENT, etc ... estén todos configurados.
Lo anterior responde su pregunta pero, si se lee como un directorio diferente en una lista de cambios, se puede responder con lo siguiente:
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
Esto diferirá todos los archivos en el directorio contra la lista de cambios 999, utiliza la versión "tener" si se ha revisado, de lo contrario utiliza la última versión.
esto fue probado con GNU Awk 3.1.3
Para un trazador de líneas único que funciona desde el shell cmd de Windows, intente esto:
for /f "usebackq delims=#" %F in (`p4 opened -c 999`) do @p4 diff %F
Para hacer esto en un archivo por lotes, necesita usar %%F
lugar de solo %F
Tenga en cuenta que parte de la solución anterior funcionará en Windows si ha instalado un paquete de utilidades de tipo Unix como cygwin o unixutils , pero este one-liner no tiene dependencias externas.
Puede usar un script de shell como este:
#!/bin/sh
list=`p4 opened -c $1 | cut -d# -f1`
for file in $list ;
do
p4 diff -dwbu $file
done
llámalo con el número de lista de cambios y obtendrás el parche en stdout.
Usé un enfoque similar al de Mark, pero utilicé Perl en lugar de Awk y una función de shell (en zsh):
p4dc() { p4 opened -c $* | perl -ne ''s/#.*//; system("p4", "diff", $_)'' }
Tenga en cuenta que también puede proporcionar una ruta de archivo, además del nombre / número de la lista de cambios:
p4dc default | less
p4dc default ... | less
p4 describe 999 | grep ''#'' | cut -d "#" -f1 | cut -d "" -f2 | xargs p4 diff