Subversion Hook не будет запускать 'svn update' при запуске автоматически, но будет запускаться из командной строки bash - PullRequest
1 голос
/ 21 декабря 2010

Я создал ловушку Subversion, которая выполняет различные функции, включая отправку электронных писем и обновление рабочей копии на сервере. Когда это запускается из Bash Propt, он работает отлично. При запуске через TortoiseSVN или Netbeans при фиксации, электронные письма и т. Д. Отправляются, но обновление не выполняется, также не появляются ошибки Это php-файл, и я использую метод backtick для запуска команд bash. Другие команды bash запускаются для составления электронных писем, так что это не проблема.

Вот строка, которая должна запустить обновление и записать результат. $ location извлекается из базы данных местоположений рабочей копии.

$update_output = `/usr/local/bin/svn update /home/$location >> update.log`;

Спасибо

Джеймс

Редактировать, более полный сценарий:

#!/usr/local/bin/php
<?
$REPOS = $argv[1];
$REV = $argv[2];

$output[] = `/usr/local/bin/svnlook dirs-changed -r $REV $REPOS`;

foreach($output as $line)
{
        preg_match("$([^/]+)$", $line, $array);
        $projects[] = $array[0];
}

$projects = array_unique($projects);

$mysqli = new mysqli('localhost', 'svn_user', 'pringles', 'svn_maindb');

if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

foreach($projects as $project)
{
        $query = "SELECT * FROM Project WHERE name = '$project' LIMIT 1";
        $result = $mysqli->query($query);
        $row = $result->fetch_assoc();
        $proj_id = $row['id'];
        $location = $row['location'];
        if(!empty($location))
        {
                $update_output = `/usr/local/bin/svn update /home/$location >> update.log`;
        }

        /* The below line only works when the script is run by hand */
        $test = `/usr/bin/lessecho test >> /home/svn/repo/hooks/update.log`;


        /* Grab user from DB and call send_email for user */
}

function send_email($REPOS, $REV, $programmer, $email)
{
        $author = `/usr/local/bin/svnlook author -r $REV $REPOS`;
        $message .= "Project Committed By $author
        Comments:
        ";
        $message .= `/usr/local/bin/svnlook log -r $REV $REPOS`;
        $message .= "
        ===========List of Changes========

        U = Updated
        A = Added
        D = Deleted

        ";
        $message .= `/usr/local/bin/svnlook changed -r $REV $REPOS`;

        /* Compose and Send Email */
}

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

Я предполагаю, что под "SVN ловушкой" вы подразумеваете скрипт ловушки хранилища , который выполняется сервером. Обратите внимание на следующее предупреждение в книге SVN:

В целях безопасности Subversion репозиторий выполняет подключаемые программы с пустая среда, то есть нет переменные окружения установлены вообще, даже не $ PATH (или% PATH%, ниже Windows). Из-за этого многие администраторы сбиты с толку, когда их программа hook работает нормально вручную, но не работает при запуске Subversion. Не забудьте явно установить любой необходимые переменные среды в ваша программа ловушек и / или использовать абсолют пути к программам.

В этом случае отсутствие $ PATH означает, что вы должны вызывать svn с его полным путем, например /usr/bin/svn.

edit : так как svn update по-прежнему не работает даже с полным путем, я бы попытался записать вывод ошибки так:

$update_output = `/usr/local/bin/svn update /home/$location 2>>/var/tmp/update-error.log`;

edit2 : как показывает вывод ошибки svn update, это проблема с правами доступа. Узнайте, от какого пользователя выполняется сценарий (например, путем выполнения whoami > /var/tmp/whoami-output в сценарии), и убедитесь, что этому пользователю разрешено манипулировать рабочими копиями, которые вы пытаетесь обновить.

1 голос
/ 16 мая 2012

У меня была такая же проблема, исправлена ​​следующим образом:

   #add apache user to group of target svn folder (project folder):
   usermod -a -G [group_of_current_target_svn_folder] [apache_user, e.g. dhapache]

   #change owner of target svn folder:
   D=/home/pfu5er/public_html/dev2
   chown -R [apache_user, e.g. dhapache] $D
1 голос
/ 21 декабря 2010

root 4231 0.0 0.0 61180 748 pts / 0 S + 17:09 0:00 grep svnserve

Это потому, что я запустил его как root?Однако, если он работает от имени пользователя root, проблемы с разрешениями не должно быть?

...