Только активировать сборку коммитов в транк с помощью SVN - PullRequest
4 голосов
/ 20 июля 2009

Я только что установил скрипт post-commit в нашем хранилище subversion, который запускает сборку, запрашивая URL сборки hudson.

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

наш скрипт после фиксации выглядит так:

SET REPOS=%1
SET REV=%2

SET DIR=%REPOS%/hooks
SET PATH=%PATH%;%DIR%
wget http://circus-09:8080/job/UE/build?delay=0sec

Как проверить, что коммит был в транке?

Ответы [ 4 ]

7 голосов
/ 20 июля 2009

Вот небольшой фрагмент кода, который выводит разные сообщения, когда что-то в транке изменилось или ничего не имеет:

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 может использоваться с любым подкаталогом корневого уровня репозитория, а не только с транком. Очень полезно, чтобы обнаружить новые теги или ветви. Также обратите внимание, что функцию можно вызывать любое количество раз.

Примечание: это на самом деле не проверяет, были ли изменены исходные файлы или нет - оно просто проверяет, упоминается ли trunk в списке измененных каталогов ревизий. Возможно, это изменение атрибутов svn некоторых каталогов или файлов.

2 голосов
/ 20 июля 2009

Как говорится в ответе Паулюса, svnlook предоставит вам детали для ревизии, просто нужно немного поработать. Использование библиотеки python pysvn помогает оградить вас от некоторых внутренних вещей, которые могут это сделать, и открывает двери для некоторых более интересных интеграций.

Пример, с которого можно начать:

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
2 голосов
/ 20 июля 2009

Насколько я знаю, нет простого способа сделать это с помощью Subversion: скрипт после фиксации запускается после любой фиксации в хранилище, независимо от того, находится ли он в стволе или в ветви.

Вы можете попытаться определить местоположение измененных файлов (возможно, используя svnlook changed и некоторое регулярное выражение) в вашем скрипте, конечно ..

0 голосов
/ 11 мая 2016

В bash это можно сделать так:

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
...