2010-10-07 10 views
7

Quando eseguo svn commit e lascia che il mio editor svn lo prenda Mi piacerebbe che l'editor svn mostri il diff dei file che sono cambiati invece della sola lista di file. Aiuta davvero a fare jogging nella memoria durante la scrittura di messaggi di commit dettagliati. Qualche idea su come realizzare?Make SVN Commit stampa anche il diff

+0

Con TortoiseSVN (e molti altri) è possibile fare doppio clic su qualsiasi file in tale elenco per vedere una diff. Puoi anche selezionare più e fare clic con il pulsante destro del mouse su diff. – JoshD

+1

sto parlando con la riga di comando su un terminale in cui ho impostato la proprietà SVN_EDITOR e indico sia a vim che a textmate che fanno l'evidenziazione automatica della sintassi per il commit o diff a seconda di quale i pipe a esso. – dstarh

+0

@Josh posso facilmente svn diff | accoppiarsi e vedere il diff di tutto ciò che è cambiato ma quando scrivo svn commit e mate o vim carica attualmente mostra solo un elenco di file tramite lo stato di svn, mi piacerebbe molto di seguito per vedere l'output di svn diff – dstarh

risposta

6

Sembra che lo script qui funzioni, dopo tutto.

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

necessari per fare un paio di modifiche.Io incollare l'intero script qui

creare un file, il nome è svn in questo caso è messo in ~/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 

e anche creare un file chiamato ~/bin/svn-diff-editore

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

per OSX ho dovuto aggiungere il '-t tmp' per mktmp e lo script orig avuto $ visivo che non ho avuto e aveva $ SVN_EDITOR impostato, invece, una volta che ho cambiato l'ultima linea di svn-diff -editor a che ha funzionato.

+0

Devo notare che entrambi i file devono essere chmod + x'd e ~/bin dovrebbero essere i primi nel tuo percorso ... o semplicemente metterlo ovunque sia prima del svn reale nel tuo percorso – dstarh

1

scrivere uno script

Ci vorrebbe un po 'di lavoro, ma si potrebbe scrivere uno script per front end come SVN_EDITOR. Quando svn richiama SVN_EDITOR, passa il nome di un file di commento temporaneo svn generato contenente l'elenco di riepilogo dei file interessati da eseguire.

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.

In teoria, si potrebbe scrivere uno script di shell che prende un parametro di nome di file che:

  1. apre il file indicato dall'ultimo arg (lo svn commento file temporaneo)
  2. lo analizza per i file da impegnare
  3. esegue svn diff su ogni file modificato (non binario) e aggiunge i di uscita ff di nuovo alla fine del file commento temporanea svn
  4. invoca il tuo vero editor sul file commento svn temporanei modificato

Assicurati che il tuo script restituisce il codice di ritorno restituito dal tuo vero editore o 0 per indicare il successo . Quindi imposta SVN_EDITOR env var in modo che punti al tuo script.

Forse qualcuno ha già scritto un tale script, ma non sono riuscito a trovarne uno (soprattutto dal momento che non hai indicato un sistema operativo). C'è anche una buona possibilità che questo script possa generare un file estremamente grande.

Alternativa - scrivere una macro

penso che una migliore alternativa sarebbe quella di utilizzare un editor programmabile e programmare una macro che leggere il nome del file (s) da qualche linea selezionata (s) e quindi eseguire svn diff sul file (s) - mettendo i risultati in un buffer o accodandolo al buffer corrente. È quindi possibile evidenziare selettivamente i file dal file di commento temporaneo svn ed eseguire SVN diff sui soli file chiave necessari. Sembra un lavoro per l'elisp!

Spiacente, non ho un codice pronto per voi. Se fai una di queste cose, sarebbe interessante vedere tornare e pubblicare il tuo script/macro qui come risposta.

+0

Trovato http : //push.cx/2007/seeing-subversion-diffs-for-commit-messages ma sembra che non funzioni su osx – dstarh

+1

Mi inchino alle tue capacità di ricerca superiori. –

+0

se solo funzionasse:/ – dstarh

0

ho scritto un semplice script e impostare SVN_EDITOR al suo percorso:

#!/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 che sembra solo per modificato (M) e file sostituiti (R) e assume EDITOR è impostato. Probabilmente non dovrebbe provare a diffare i file binari.

+0

soluzione interessante. Mi piace molto l'output diff di default di SVN che è quello che volevo - il solito output di commit elenca solo i file e lo stato, ma svn diff ti fornirà il corretto layout di diff senza dover chiamare svn diff su ogni file separatamente. – dstarh

0

Non sono riuscito a trovare una risposta che mi sembrava di usare. La risposta di dstarh è quasi arrivata. Ma è troppo invadente per me. Cosa succede se ci sono argomenti prima di commit? Inoltre, è più sicuro eliminare il file temporaneo con una trap. E per compiacere la gente paranoica, scappo l'editor di cmd:

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 Ho eseguito in questo errore:

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' 

Si potrebbe considerare addi ng dos2unix comando o qualcosa come fatto nel commento.

UPD Inoltre, si consiglia di skip malformed UTF-8 characters, altrimenti svn fallirà:

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 E di tanto in tanto dos2unix potrebbe trattare diff uscita in formato 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' 

Si può vuoi forzare la conversione.

Problemi correlati