2010-10-07 2 views
7

Когда я делаю svn commit и позволю редактору svn забрать его, я бы ЛЮБЛЮ для редактора svn, чтобы показать diff файлов, которые были изменены, а не только список файлов. Действительно помогает пробегать память при написании подробных сообщений фиксации. Любые идеи о том, как это сделать?Сделать SVN Commit также распечатать diff

+0

С помощью TortoiseSVN (и многих других) вы можете дважды щелкнуть по любому файлу в этом списке, чтобы увидеть diff. Вы также можете выбрать несколько и щелкнуть правой кнопкой мыши. – JoshD

+1

Я говорю о командной строке на терминале, где я установил свойство SVN_EDITOR, и я либо указываю, что на vim или textmate, которые выполняют автоматическую подсветку синтаксиса для фиксации или разницы, в зависимости от того, к какому я ее подключаю. – dstarh

+0

@ Josh я могу легко svn diff | mate и увидеть разницу в чем-либо, что изменилось, но когда я набираю svn commit и mate или vim загружает, он в настоящее время просто показывает список файлов через svn status, мне бы очень понравилось ниже, чтобы увидеть вывод svn diff – dstarh

ответ

6

Похож, сценарий здесь работает в конце концов.

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

необходимо, чтобы сделать несколько изменений.Я вставить весь скрипт здесь

создать файл, назовите его СВН в данном случае это положить в ~/бен

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

, а также создать файл с именем ~/bin/СВН-Diff-редактор

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

для OSX я должен был добавить «-t TMP» в mktmp и сценарий ориг имел $ VISUAL, которые у меня не было, и пришлось $ SVN_EDITOR установить вместо этого, когда я изменил последнюю строку СВН-дифф что он сработал.

+0

Я должен отметить, что оба файла должны быть chmod + x'd, а ~/bin должен быть первым в вашем пути ... или просто поместите это где-нибудь, что впереди real svn на вашем пути – dstarh

1

написать скрипт

Потребовалось бы какую-то работу, но вы могли бы написать сценарий к переднему концу, как ваш SVN_EDITOR. Когда svn вызывает ваш SVN_EDITOR, он передает имя файла временных комментариев, созданного svn, содержащего сводный список затронутых файлов, которые должны быть зафиксированы.

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.

В принципе, вы можете написать скрипт, который принимает параметр имя файла, который:

  1. открывает файл, указанный в последнем арг (СВН временный комментарий файл)
  2. анализирует его для файлов, которые необходимо совершить
  3. запускает svn diff на каждый измененный (небинный) файл и добавляет di и далее выход назад в конец временного комментария файла Svn
  4. вызывает ваш реальный редактор на модифицированный СВН временного комментария файл

Убедитесь, что ваш скрипт возвращает код возврата, возвращаемый вашего реальный редактор или 0, чтобы указать успех , Затем установите SVN_EDITOR env var, чтобы указать на ваш скрипт.

Возможно, кто-то уже написал такой скрипт, но я не смог его найти (особенно, поскольку вы не указали ОС). Также есть хороший шанс, что этот скрипт может генерировать чрезвычайно большой файл.

Альтернатива - написать макрос

Я думаю, что лучшей альтернативой было бы использовать программируемый редактор и запрограммировать макрос, который прочитал имя файла (ов) из некоторой выбранной линии (ов), а затем запустить SVN диф на файл (ы) - помещая результаты в буфер или добавляя его в текущий буфер. Затем вы можете выборочно выделять файлы из файла временных комментариев svn и запускать SVN diff только на нужные файлы ключей. Звучит как работа для elisp!

Извините, у меня нет готового кода для вас. Если вы сделаете это, было бы интересно посмотреть, как вернуться и опубликовать свой сценарий/макрос здесь в качестве ответа.

+0

Просто нашел http : //push.cx/2007/seeing-subversion-diffs-for-commit-messages, но он не работает на osx – dstarh

+1

Я склоняюсь к вашим превосходным навыкам поиска. –

+0

Если бы это сработало бы:/ – dstarh

0

Я написал простой скрипт и установить SVN_EDITOR на своем пути:

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

Заметьте, что это выглядит только для модифицированных (M) и замененные файлы (R) и принимает EDITOR установлен. Вероятно, не следует пытаться использовать двоичные файлы.

+0

интересное решение. Мне действительно нравится вывод diff, который по умолчанию имеет SVN, и это то, что я хотел - обычный вывод commit выводит только файлы и статус, но svn diff предоставит вам правильную макет diff без необходимости называть svn diff для каждого файла отдельно. – dstarh

0

Я не мог найти ответ, который мне понравился. Ответ dstarh почти есть. Но это слишком навязчиво для меня. Что делать, если есть аргументы до commit? Кроме того, безопаснее удалять временный файл с помощью ловушки. И в угоду параноидального народ, я избежать редактора ЦМД:

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 Я столкнулся с этой ошибкой:

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' 

Можно добавить addi ng dos2unix команду или что-то подобное в комментарии.

UPD Кроме того, вы можете skip malformed UTF-8 characters, иначе SVN не удастся:

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 И иногда dos2unix может относиться diff выход как двоичный:

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' 

Вы можете хотите принудительно преобразовать.