Получение сообщения журнала из svnlook через пакет Windows
Я пытаюсь подготовить зацепку после фиксации для моего хранилища SVN. Поэтому мне нужно сообщение журнала от последнего коммита, который я получаю с командой svnlook log -r %REV% %REPOS%
, Заполняя фрагмент соответствующими параметрами, я получаю следующее многострочное лог-сообщение:
This
is
my
transaction.
Пока это хорошо работает. Теперь я положил это в файл.bat:
@ECHO OFF
REM just for testing purpose...
SET REPOS=C:\repo
SET REV=40
FOR /F %%i in ('svnlook log -r %REV% %REPOS%') do SET VAR=%%i
ECHO %VAR%
Когда я выполняю скрипт только в последней строке transaction.
повторяется. Цикл for - это фрагмент, из которого я думал, что он будет читать вывод svnlook в %var%
,
Мой подход заключается в получении сообщения журнала в переменной, которую я передаю в другой exe-файл в качестве параметра. Но это не сработает. Я не знаю, как правильно использовать цикл.
Сообщение журнала должно быть передано другому exe-файлу в качестве параметра.
Я изменил скрипт следующим образом (@thx PA.)
@ECHO OFF
setlocal enabledelayedexpansion
SET REPOS=C:\repo
SET REV=40
SET MSG=
FOR /F %%i in ('svnlook log -r %REV% %REPOS%') do SET VAR=!VAR! %%i
ECHO !VAR!
Выход сейчас This is my transaction.
Но разрыва строки больше нет, но мне нужна для дальнейшей обработки.
3 ответа
Если вы хотите также разрывы строк, вы можете добавить их при объединении строк.
@ECHO OFF
setlocal enabledelayedexpansion
set LF=^
rem ** The two empty lines are NECESSARY
SET REPOS=C:\Users\CH.ROSESOFT\Downloads\t3\repo
SET REV=40
SET MSG=
FOR /F %%i in ('svnlook log -r %REV% %REPOS%') do (
SET "VAR=!VAR!!LF!%%i"
SET "PAR=!PAR!^^!LF!!LF!%%i"
)
ECHO !VAR!
myProgram.exe !par!
Если я правильно понимаю ваш вопрос, вам нужно объединить вывод команды svnlook в одну переменную (что-то вроде VAR = VAR & %%i)
В BAT вы получаете доступ к содержимому переменной, записывая переменную, заключенную в %
приметы. И вы объединяете, просто склеивая их. SET X=%A%
, SET Y=%A%%B%
, Так что в вашем случае вы должны изменить SET
назначение на что-то вроде SET VAR=%VAR% %%i
,
Однако это не сработает. Поскольку назначение находится внутри FOR
цикл, он должен быть переоценен на каждой итерации. Вам необходимо включить отложенное расширение. Читать HELP SET
для дополнительной информации.
Что-то похожее на это,
@ECHO OFF
setlocal enabledelayedexpansion
...
SET VAR=
FOR /F %%i in ('solook log -r %REV% %REPOS%') do SET VAR=!VAR! %%i
ECHO !VAR!
Без разделителей некоторые слова будут отсутствовать
вот мой сценарий предварительной фиксации, который я только что закончил писать
если вы установите debug в 1, он будет постоянно терпеть неудачу, и вы увидите сообщения с некоторым выводом var
@echo off
set DEBUG=0
:::::::::::::::::::::::::: Dont touch this part :::::::::::::
setlocal enabledelayedexpansion
set space=
set LF=^
rem ** The two empty lines are NECESSARY
:::::::::::::::::::::::::: Dont touch above :::::::::::::
set REPOS=%1
set TXN=%2
::: Get the author ::::::::::::::::::::::::::::::::::
set author=
For /F %%I in ('svnlook author %REPOS% -t %TXN%') Do Set author=!author!%%I
::: Get the message ::::::::::::::::::::::::::::::::::
set message=
For /F "delims=" %%I in ('svnlook log %1 -t %2') Do Set message=!message!%%I%space%
:: Make sure that author is not blank or guest - if readonly accounts are enabled and something goes wrong
echo %author% | FindStr [a-zA-Z0-9] >nul
IF %ERRORLEVEL% NEQ 0 GOTO AUTHOR_NOT_OK
echo %author% | FindStr \C:guest >nul
IF %ERRORLEVEL% EQU 0 GOTO AUTHOR_NOT_OK
:: %ERRORLEVEL% = 1 at this point means its no error!
:: Make sure that the log message contains some text.
echo "%message%" | FindStr [a-zA-Z0-9] >nul
IF %ERRORLEVEL% NEQ 0 GOTO COMMENT_NOT_OK
:: Make sure that the log message contains ACR
echo "%message%" | FindStr /I /C:acr >nul
IF %ERRORLEVEL% NEQ 0 GOTO COMMENT_NOT_OK
GOTO OK
:COMMENT_NOT_OK
echo COMMENT_NOT_OK 1>&2
echo "D:\SYSAPPS\HATS\ci\repositories\repo\java\hooks\pre-commit.bat 1>&2
echo Your commit has been blocked because you didn't provide adequate log message 1>&2
echo Please write a log message describing the purpose of your changes and 1>&2
echo then try committing again. -- Thank you 1>&2
echo e.g. 1>&2
echo ACR: 12345 1>&2
echo fixed blah blah blah 1>&2
if %DEBUG% EQU 1 GOTO EXITDEBUG
exit 1
:AUTHOR_NOT_OK
echo AUTHOR_NOT_OK 1>&2
:OK
if %DEBUG% EQU 1 GOTO EXITDEBUG
exit 0
:EXITDEBUG
echo == EXITDEBUG == 1>&2
echo ---- %AUTHOR% %message% ---- 1>&2
echo txn %TXN% repos %REPOS% 1>&2
echo changedpath 1>&2
svnlook changed %REPOS% -t %TXN% 1>&2
echo ERRORLEVEL %ERRORLEVEL% 1>&2
echo "D:\SYSAPPS\HATS\ci\repositories\repo\java\hooks\pre-commit.bat" 1>&2
exit 1