2013-02-14 4 views
0

Я хотел бы запустить пакетный файл с помощью post-commit hook в Subversion. Моя проблема заключается в том, что я хочу запустить его один раз для каждого файла, который был зафиксирован, но я не знаю, как получить имена зафиксированных файлов в пределах крюка. Я могу запустить его для каждого файла в папке, однако, когда я вышел из этой тестовой среды и на самом деле использую эту функцию, есть много разных файлов, и это будет очень неэффективно. Есть идеи??Крючки в Subversion

+0

Что именно делает ваш скрипт? – bahrep

+2

Сейчас все, что он делает, это дата обновления моей рабочей копии, однако для использования кода с сторонним программным обеспечением, которое моя компания использует, ему необходимо запустить скрипт, этот скрипт должен запускаться для каждого измененного файла. Я создал пакетный файл, который позволяет запускать его как ... myscript.bat changefile.c из командной строки ... Я хотел бы запустить мой пакетный файл для каждого измененного файла – mgrenier

ответ

0

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

setlocal EnableDelayedExpansion 

rem write a list of the changed files in a text file 
"C:\svnpath\bin\svn.exe" log "C:\repo-path\project" -r %TXN% --verbose > "C:\path\changelist.txt" 

rem write the list of all files into a text file 
cd "C:\repo-path\project" 
dir /b > "C:\path\filelist.txt" 

rem loop through files 
cd "C:\path" 
for /F "delims=" %%i IN (filelist.txt) do (
    rem search for file name in list of changed files, if found run batch file on it 
    find /i "%%i" changelist.txt > nul 

    echo %%i > "C:\path\temp.txt" 

    if not errorlevel 1 (
     cd "C:\repo-path\project" 
     batchfile.bat %%i 
    ) 
) 

rem delete temp files when finished 
del "C:\path\filelist.txt" 
del "C:\path\changelist.txt" 
del "C:\path\changedfiles.txt" 
1

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

+0

, но хорошо знать, что это можно сделать. .. можете ли вы предложить какую-либо помощь в том, как получить измененные файлы? У меня есть скрипт, который делает это для каждого файла в папке сейчас, если вы можете показать мне скрипт для получения исправленного или измененного файла, я бы очень признателен! :) – mgrenier

+0

В сценарии просто вызовите svn-журнал, используя переданную ему ревизию, и вы получите полный список всего, что было изменено в commit. –

+0

Итак, теперь я могу получить имена измененных файлов, мне интересно, могу ли я выводить их в структуру данных, такую ​​как массив, чтобы я мог перебирать их, чтобы вызвать мой пакетный файл для каждого из них? – mgrenier

1

Вы сделали только один маленький ошибка: список файлов в транзакции (на стороне сервера, как крючками, выполненных на сервере) можно получить проще (и без «шума» журнала), чем svn log -v. Это svnlook с субкомандой changed

Образцом для пересмотра в репо (для сделки вы будете использовать -t %TXN%)

>svnlook.exe changed -r 31 Hello 
U trunk/Hello.de.txt 
U trunk/Hello.en.txt 
U trunk/Hello.fr.txt 

Hello является путем к хранилищу корня (не рабочей копии), вывод команды, кажется, частично как вывод svn st, путь к файлам - относительные пути от репо-корня