我刚刚在我们的 subversion 存储库中设置了一个提交后脚本,它通过请求一个 hudson 构建 URL 来触发构建。
这按预期工作正常,但是现在我只想在提交到主干时触发这个构建。
我们的提交后脚本如下所示:
SET REPOS=%1
SET REV=%2
SET DIR=%REPOS%/hooks
SET PATH=%PATH%;%DIR%
wget http://circus-09:8080/job/UE/build?delay=0sec
如何检查提交是否到主干?
我刚刚在我们的 subversion 存储库中设置了一个提交后脚本,它通过请求一个 hudson 构建 URL 来触发构建。
这按预期工作正常,但是现在我只想在提交到主干时触发这个构建。
我们的提交后脚本如下所示:
SET REPOS=%1
SET REV=%2
SET DIR=%REPOS%/hooks
SET PATH=%PATH%;%DIR%
wget http://circus-09:8080/job/UE/build?delay=0sec
如何检查提交是否到主干?
这是一个快速代码片段,当主干中的某些内容发生更改或没有内容时输出不同的消息:
set repos=%~1
set rev=%~2
call :did_it_change "%repos%" "%rev%" "trunk"
if %ERRORLEVEL%==1 (
echo trunk changed
) else (
echo no changes in trunk
)
exit /B 0
:did_it_change
set repos=%~1
set rev=%~2
set dir=%~3
set found=0
for /F "delims=/" %%p in ('svnlook dirs-changed "%repos%" -r %rev% 2^>NUL') do call :check "%%p" "%dir%"
exit /B %found%
:check
set check_string=%~1
set must_match=%~2
if "$%check_string%" == "$%must_match%" set found=1
exit /B 0
请注意, :did_it_change 函数可以与任何存储库根级别的子目录一起使用,而不仅仅是主干。非常有用,用于检测新标签或分支。另请注意,该函数可以调用任意次数。
注意:这实际上并不检查源文件是否已更改 - 它只是检查修订更改目录列表中是否提到了主干。可能是更改了某些目录或文件的 svn 属性。
据我所知,使用颠覆没有简单的方法:提交后脚本在任何提交到存储库之后运行,无论它是在主干还是在分支中。
当然,您可以尝试svnlook changed
在脚本中确定更改文件的位置(可能使用一些正则表达式)。
正如 Paulius 的回答所说,svnlook 为您提供了修订的详细信息,它只需要一点操作。使用 python pysvn库有助于保护您免受一些内部操作的影响,并为一些更高级的集成打开了大门。
Example to get you started:
import sys;
import urllib;
import svnlook;
#duckpunch to get access to the relative path for the revision
def relativePath(self):
return self.path
baseUrl = sys.argv[1]
repo = sys.argv[2]
revision = sys.argv[3]
l = svnlook.changed(repo, revision);
#TODO this assumes all enries in the commit are against one project, so the first item found is sufficient
#May want to iterate the entries and check for any different paths
out = l[0]
changePath = relativePath(out)
print changePath
#TODO if 'trunk' is found in changePath, trigger build
In bash it can be done this way:
REPOS="$1"
REV="$2"
TXN_NAME="$3"
SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
export LANG=en_US.UTF-8
RES=$($SVNLOOK dirs-changed $REPOS -r $REV)
if [[ $RES == *"trunk"* ]]
then
Call whichever command you want to call when there are changes in trunk
fi