У меня есть .bat, а внутри .bat я хотел бы выполнить специальный код, если в репозитории svn есть какие-то изменения (например, скомпилировать).





Вы хотите, чтобы это было реактивным? Или по запросу?
Для реактивного см. хуки. Сценарий должен быть назван в соответствии с его назначением: pre-commit.bat, post-commit.bat. Скрипты называются: [скрипт] [путь-репо] [номер-ревизии]
По запросу:
Пример:
svn st "C:\path\to\working\directory\" >> C:\path\to\working\project.log
Каждый раз, когда вы запускаете BAT, он добавляет вывод улулrong> в project.log. При необходимости отрегулируйте.
Я не хочу записывать статус в файл журнала :) Мне нужен код .bat, который делает что-то вроде: if (svn_changed ()) do this else do that
Для Win 2000 и более поздних версий это назначит последнюю строку вывода из команды svn status переменной svnOut, а затем проверит, содержит ли переменная что-нибудь:
@echo off
set svnOut=
set svnDir=C:Your\path\to\svn\dir\to\check
for /F "tokens=*" %%I in ('svn status %svnDir%') do set svnOut=%%I
if "%svnOut%"= = "" (
echo No changes
) else (
echo Changed files!
)
Почему есть такая строчка
set svnOut=
вы должны выяснить сами. ;-)
Большое Вам спасибо. Это прекрасно, я проверю это как можно скорее.
На самом деле это не работает. Например, svn status возвращает строку с:? файлы M files2, которые являются локальной модификацией, или файлы, которых нет в репозитории. Я хочу видеть «Измененные файлы» только при некоторых изменениях в репозитории.
Я опубликовал ответ с измененной версией
Тогда я не уверен, что понимаю, что вы хотите здесь сделать ... Вы хотите выполнить обновление svn, и если что-то изменилось в репозитории svn server, вы хотите выполнить сборку с новым кодом? Или если что-то было изменено локально, вы хотите восстановить? Если 1: А как насчет конфликтов?
Хорошо, решение, которое я нашел с помощью Tooony:
set vHEAD = 0
set vBASE = 0
set svnDir=<path to local svn directory>
for /F "tokens=1,2" %%I in ('svn info -r HEAD %svnDir%') do if "%%I"= = "Revision:" set vHEAD=%%J
for /F "tokens=1,2" %%I in ('svn info -r BASE %svnDir%') do if "%%I"= = "Revision:" set vBASE=%%J
if "%vBASE%"= = "%vHEAD%" (
echo No changes
) else (
echo Changed files!
)
Пусть ваш .bat выполнит svnversion (если вы используете Subversion) или SvnWCRev.exe (если вы используете TortoiseSVN) на самом верхнем уровне вашей рабочей копии.
Оба выходят, если ваша рабочая копия была изменена.
svnversion добавляет к своему выводу букву «M».
SvnWCRev.exe напечатает строку текста о том, что WC был изменен.
Эта версия основана на @ tooony, но проверяет наличие обновлений на сервере, а не на клиенте.
@echo off
set svnOut=
rem Check svn server status of current working directory repository and see if first or second token is an *
for /F "tokens=1" %%I in ('svn status --show-updates') do if "%%I"= = "*" set svnOut=%%I
rem echo "%svnOut%"
if "%svnOut%"= = "" (
echo No changes
) else (
echo Changed files!
)
Это по запросу. Я знаю команду svn (их легко найти где угодно). Вопрос в том, как использовать это в скрипте .bat.