2010-10-07 11 views
7

Kiedy wykonuję polecenie svn commit i pozwolę mojemu redaktorowi svn odebrać to, KOCHAM dla edytora svn, aby pokazać różnicę plików, które zmieniły się zamiast tylko listy plików. Naprawdę pomaga pobiegać pamięć podczas pisania szczegółowych wiadomości zatwierdzania. Jakieś pomysły, jak to osiągnąć?Niech polecenie SVN również wydrukuje różnicę

+0

Z TortoiseSVN (i wieloma innymi) możesz dwukrotnie kliknąć dowolny plik na tej liście, aby zobaczyć różnicę. Możesz także wybrać wiele i kliknąć prawym przyciskiem myszy. – JoshD

+1

Mówię o linii komend na terminalu, w którym ustawiłem właściwość SVN_EDITOR i albo wskażę to na vim, albo na textmate, które automatycznie podświetlają składnię dla commit lub diff, zależnie od tego, do którego go doprowadzę. – dstarh

+0

@Josh mogę łatwo svn diff | Mate i zobacz różnicę wszystkiego, co się zmieniło, ale kiedy piszę svn commit i mate lub vim ładuje, aktualnie pokazuje listę plików przez status svn, naprawdę chciałbym zobaczyć poniżej dane wyjściowe svn diff – dstarh

Odpowiedz

6

Wygląda na to, że skrypt działa tutaj.

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

potrzebne, aby dokonać kilku zmian.Będę wklej cały skrypt tutaj

utworzyć plik, nazwa to svn w tym przypadku to umieścić w ~/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 

a także utworzyć plik o nazwie ~/bin/svn-diff-editor

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

dla OSX musiałem dodać „-t tmp” do mktmp i skrypt oryg miał $ VISUAL których nie miałem i miał $ SVN_EDITOR ustawić zamiast raz zmieniłem ostatnią linię sVN-diff -spodziewał się, że zadziałało.

+0

Powinienem zauważyć, że oba pliki muszą być chmod + x'd i ~/bin powinny być pierwszymi na twojej ścieżce ... lub po prostu umieścić to gdziekolwiek, co wyprzedza prawdziwy svn na twojej drodze – dstarh

1

napisać skrypt

zajęłoby trochę pracy, ale można napisać skrypt do przodu jako swojej SVN_EDITOR. Gdy svn wywołuje twój SVN_EDITOR, przekazuje nazwę wygenerowanego przez svn tymczasowego pliku komentarza zawierającego listę podsumowującą zaatakowane pliki, które mają zostać zatwierdzone.

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.

Niewykluczone, można napisać skrypt, który przyjmuje parametr nazwa_pliku że:

  1. otwiera plik wskazywany przez ostatni Arg (svn tymczasowy plik komentarz)
  2. analizuje to dla plików, które mają zostać zatwierdzone:
  3. uruchamia svn diff na każdym zmodyfikowanym (nie binarnym) pliku i dołącza di Wyjście ff z powrotem do końca svn tymczasowego komentarza pliku
  4. wywołuje twój prawdziwy redaktor na zmodyfikowanym svn tymczasowego komentarza pliku

Upewnij się, że skrypt zwraca kod powrotu zwrócony przez prawdziwego edytora lub 0, aby wskazać sukces . Następnie ustaw swój SVN_EDITOR env var, tak aby wskazywał na skrypt.

Być może ktoś napisał już taki skrypt, ale nie mogłem go znaleźć (zwłaszcza, że ​​nie wskazałeś systemu operacyjnego). Istnieje również duża szansa, że ​​ten skrypt wygeneruje wyjątkowo duży plik.

Alternative - napisać makro

Myślę, że lepszym rozwiązaniem byłoby wykorzystanie programowalny edytor i zaprogramować makro, które odczytać nazwę pliku (ów) z jakiejś wybranej linii (ów), a następnie uruchomić SVN diff w pliku (ach) - umieszczenie wyników w buforze lub dołączenie go do bieżącego bufora. Następnie można selektywnie podświetlić pliki z tymczasowego pliku komentarza svn i uruchomić plik SVN diff tylko na plikach kluczy, których potrzebujesz. Brzmi jak praca dla elisp!

Niestety nie mam gotowego kodu dla ciebie. Jeśli zrobisz któryś z nich, byłoby interesujące, aby wrócić i opublikować skrypt/makro tutaj jako odpowiedź.

+0

. : //push.cx/2007/seeing-subversion-diffs-for-commit-messages, ale nie wygląda na to, że działa na osx – dstarh

+1

Kłaniam się twoim znakomitym umiejętnościom wyszukiwania. –

+0

jeśli tylko to by działało:/ – dstarh

0

napisałem prosty skrypt i ustawić SVN_EDITOR na swojej drodze:

#!/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} 

pamiętać, że patrzy tylko na zmodyfikowanej (M) i zastąpić pliki (R) i zakłada EDITOR jest ustawiony. Prawdopodobnie nie powinien próbować różnicować plików binarnych.

+0

ciekawe rozwiązanie. Bardzo podoba mi się wyjście diff, które SVN ma domyślnie, i to jest to, czego chciałem - zwykłe wyjście commit pokazuje listę plików i status, ale svn diff da ci odpowiedni układ diff bez konieczności wywoływania svn diff na każdym pliku osobno. – dstarh

0

Nie mogłem znaleźć odpowiedzi, której chciałbym użyć. dstarh Odpowiedź jest prawie na miejscu. Ale to dla mnie zbyt nachalne. Co jeśli są argumenty przed commit? Ponadto bezpieczniej jest usunąć plik tymczasowy za pomocą pułapki. I proszę paranoikiem ludowej, ja uciekam CMD Redaktor:

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 Zabrakło mi ten błąd:

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' 

Można rozważyć dodanie ng dos2unix polecenie lub coś, co zostało zrobione w komentarzu.

UPD Dodatkowo możesz skip malformed UTF-8 characters, albo svn zawiedzie:

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 a czasami dos2unix może leczyć diff wyjście jako binarny:

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' 

Użytkownik może chcę wymusić nawrócenie.

Powiązane problemy