2010-10-07 17 views
7

Cuando lo hago svn commit y dejo que mi editor svn lo recoja ME ENCANTARÍA que el editor svn muestre la diferencia de los archivos que han cambiado en lugar de solo la lista de archivos. Realmente ayuda a trotar la memoria al escribir mensajes detallados de compromiso. ¿Alguna idea sobre cómo lograrlo?Make SVN Commit también imprime el diff

+0

Con TortoiseSVN (y muchos otros) puede hacer doble clic en cualquier archivo de esa lista para ver una diferencia. También puede seleccionar múltiples y hacer clic derecho en diff. – JoshD

+1

estoy hablando de línea de comando en un terminal donde he establecido la propiedad SVN_EDITOR y apunto a vim o textmate que hacen resaltado de sintaxis automática para el commit o diff, dependiendo de qué canalice. – dstarh

+0

@Josh puedo fácilmente svn diff | mate y vea la diferencia de cualquier cosa que haya cambiado, pero cuando escribo svn commit y mate o vim lo carga, actualmente solo muestra una lista de archivos a través del estado svn, realmente me gustaría ver debajo el resultado de svn diff – dstarh

Respuesta

6

Parece que el script aquí funciona después de todo.

De - http://push.cx/2007/seeing-subversion-diffs-for-commit-messages

necesario hacer algunos cambios.Voy a pegar todo el guión aquí

crear un archivo, el nombre de svn en este caso se trata de poner en ~/bin

#!/bin/sh 
REALSVN=/usr/bin/svn 

ARGS="[email protected]" 

if [ "$1" = "commit" -o "$1" = "ci" ]; then 
    shift # pop off $1 for diff 
    TEMPLATE=`mktemp -t tmp` 
    $REALSVN diff "[email protected]" > "$TEMPLATE" 
    $REALSVN $ARGS --editor-cmd="~/bin/svn-diff-editor '$TEMPLATE'" 
else 
    $REALSVN $ARGS 
fi 

y también crear un archivo llamado ~/bin/SVN-diff-editor

echo >> "$2" 
cat "$1" >> "$2" 
rm "$1" 
$SVN_EDITOR "$2" 

para OSX he tenido que añadir la '-t tmp' a mktmp y el guión tenía orig $ visual que no tenía y tenía $ SVN_EDITOR establecido, en vez, una vez que cambié la última línea de sVN-diff -editor a eso funcionó.

+0

, debo tener en cuenta que ambos archivos deben ser chmod + x'd y ~/bin debe ser el primero en su camino ... o simplemente poner esto en cualquier lugar que esté delante del svn real en tu camino – dstarh

1

escribir un guión

Haría falta algo de trabajo, pero se podría escribir un script para usuario como su SVN_EDITOR. Cuando svn invoca su SVN_EDITOR, pasa el nombre de un archivo de comentario temporal generado por svn que contiene la lista de resumen de los archivos afectados a comprometer.

http://svnbook.red-bean.com/en/1.5/svn-book.html#svn.advanced.externaleditors

The value of any of these options or variables is the beginning of a command line to be executed by the shell. Subversion appends to that command line a space and the pathname of a temporary file to be edited. So, to be used with Subversion, the configured or specified editor needs to support an invocation in which its last command-line parameter is a file to be edited, and it should be able to save the file in place and return a zero exit code to indicate success.

Posiblemente, se podría escribir un script que toma un parámetro de nombre de archivo que:

  1. abre el archivo indicado por el último arg (el SVN archivo de comentarios temporal)
  2. lo analiza para que se confirmen los archivos
  3. ejecuta svn diff en cada archivo modificado (no binario) y agrega los archivos salida del FF de nuevo al final del archivo de comentarios temporal SVN
  4. invoca su verdadero editor en el archivo de comentarios SVN temporal modificado

Asegúrese de que el script devuelve el código de retorno devuelto por su editor real o 0 para indicar el éxito . Luego configure su env de SVN_EDITOR para que apunte a su script.

Tal vez alguien ya haya escrito una secuencia de comandos, pero no pude encontrar ninguna (especialmente porque no indicó un sistema operativo). También hay una gran posibilidad de que este script pueda generar un archivo extremadamente grande.

Alternativa - escribir una macro

creo que una mejor alternativa sería utilizar un editor programable y programar una macro que lee un nombre de archivo (s) a partir de una cierta línea (s) seleccionado y luego ejecutar SVN diff en el (los) archivo (s) - colocando los resultados en un búfer o añadiéndolo al búfer en uso. A continuación, puede resaltar selectivamente los archivos del archivo de comentario temporal svn y ejecutar diff SVN solo en los archivos clave que necesita. ¡Suena como un trabajo para elisp!

Lo siento, no tengo un código ya hecho para usted. Si haces cualquiera de estos, sería interesante volver y publicar tu script/macro aquí como respuesta.

+0

He encontrado http : //push.cx/2007/seeing-subversion-diffs-for-commit-messages pero parece que no funciona en osx – dstarh

+1

Me inclino por tus habilidades superiores de búsqueda. –

+0

si solo funcionara:/ – dstarh

0

Escribí un guión simple y establecer SVN_EDITOR a su paso:

#!/bin/bash 

tmpFile="${!#}" 

# Append changes in committed files to tmpFile 
echo >> ${tmpFile} 
grep '^[MR]' ${tmpFile} | awk '{print $2}' | \ 
    xargs -n 1 --no-run-if-empty svn diff >> ${tmpFile} 

# Run editor 
exec ${EDITOR} ${tmpFile} 

Nota que sólo busca modificado (M) y archivos reemplazados (R) y asume EDITOR se establece. Probablemente no debería intentar diferir archivos binarios.

+0

solución interesante. Me gusta mucho la salida de diff que SVN tiene de forma predeterminada, que es lo que quería: la salida de confirmación habitual solo enumera los archivos y el estado, pero svn diff le proporcionará el diseño de diff adecuado sin tener que llamar a svn diff en cada archivo por separado. – dstarh

0

No he podido encontrar una respuesta que me haya gustado usar. La respuesta de dstarh está casi allí. Pero es demasiado intrusivo para mí. ¿Qué pasa si hay argumentos antes de commit? Además, es más seguro eliminar el archivo temporal con una trampa. Y agradar a la gente paranoica, me escape de las cmd editor:

svn-commit.sh:

#!/usr/bin/env bash 
set -eu 
tmp=`mktemp` _trap="rm -r "$tmp"; ${_trap:-}" && trap "$_trap" EXIT 
svn diff "[email protected]" > "$tmp" 
# svn diff "[email protected]" | iconv -f utf-8 -t utf-8 -c > "$tmp" # skip malformed UTF-8 characters 
svn commit "[email protected]" "--editor-cmd=svn-editor.sh $(printf %q "$tmp")" 

svn-editor.sh:

#!/usr/bin/env bash 
set -eu 
diff_f=$1 
commit_msg_f=$2 
# dos2unix "$diff_f" # if svn repo has files with different line-ending styles 
# dos2unix -f "$diff_f" # to make it always treat diff output as text 
echo >> "$commit_msg_f" 

cat "$diff_f" >> "$commit_msg_f" 
"$EDITOR" "$commit_msg_f" 

UPD me he encontrado con este error:

svn: E135000: Commit failed (details follow): 
svn: E135000: Error normalizing edited contents to internal format 
svn: E135000: Inconsistent line ending style 
svn: E135000: Your commit message was left in a temporary file: 
svn: E135000: '.../svn-commit.tmp' 

Se podría considerar addi ng dos2unix comando o algo como se hace en el comentario.

UPD Además, es posible que desee skip malformed UTF-8 characters, o de lo contrario SVN fallará:

svn: E000022: Commit failed (details follow): 
svn: E000022: Error normalizing edited contents to internal format 
svn: E000022: Valid UTF-8 data 
(hex: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2b 0a 2b) 
followed by invalid UTF-8 sequence 
(hex: a4 20 3d 20) 
svn: E000022: Your commit message was left in a temporary file: 
svn: E000022: '.../svn-commit.tmp' 

UPD Y de vez en cuando dos2unix podría tratar diff salida como binario:

dos2unix: Binary symbol 0x00 found at line 742308 
dos2unix: Skipping binary file /tmp/tmp.UCNcubZZlX 
svn: E135000: Commit failed (details follow): 
svn: E135000: Error normalizing edited contents to internal format 
svn: E135000: Inconsistent line ending style 
svn: E135000: Your commit message was left in a temporary file: 
svn: E135000: '.../svn-commit.tmp' 

Usted puede querer forzar la conversión

Cuestiones relacionadas