Сделайте SVN Commit и распечатайте различия - PullRequest
8 голосов
/ 07 октября 2010

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

Ответы [ 4 ]

7 голосов
/ 08 октября 2010

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

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

Необходимо внести несколько изменений. Я вставлю весь сценарий сюда

создайте файл, назовите его svn, в этом случае он помещается в ~ / bin

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

ARGS="$@"

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

, а также создайте файл с именем ~ / bin / svn-diff-editor

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

для osx я должен был добавить '-t tmp' в mktmp, и в сценарии orig было $ VISUAL, которого у меня не было, и вместо него был установлен $ SVN_EDITOR, как только я изменил последнюю строку svn-diff-editor на эту это сработало.

1 голос
/ 07 октября 2010

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

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

http://svnbook.red -bean.com / ен / 1.5 / СВН-book.html # svn.advanced.externaleditors * ** 1 010 * 1011

Значением любой из этих опций или переменных является начало командной строки, которая должна быть выполнена оболочкой. Subversion добавляет к этой командной строке пробел и путь к временному файлу для редактирования. Таким образом, для использования с Subversion настроенный или указанный редактор должен поддерживать вызов, в котором его последний параметр командной строки представляет собой файл для редактирования, и он должен иметь возможность сохранить файл на месте и вернуть нулевой код выхода указать на успех.

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

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

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

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

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

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

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

0 голосов
/ 17 июля 2015

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

svn-commit.sh:

#!/usr/bin/env bash
set -eu
tmp=`mktemp` _trap="rm -r "$tmp"; ${_trap:-}" && trap "$_trap" EXIT
svn diff "$@" > "$tmp"
# svn diff "$@" | iconv -f utf-8 -t utf-8 -c > "$tmp"   # skip malformed UTF-8 characters
svn commit "$@" "--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'

Можно рассмотреть добавление команды dos2unix или что-то подобное, как в комментарии.

UPD Дополнительно,Вы можете захотеть пропустить неправильно сформированные символы UTF-8 , иначе 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'

Возможно, вам потребуется принудительное преобразование.

0 голосов
/ 09 февраля 2011

Я написал простой скрипт и установил 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 установлено. Вероятно, не следует пытаться различать двоичные файлы.

...