PHP: exec (svn commit) не возвращает никаких ошибок и не работает - PullRequest
2 голосов
/ 27 января 2010

В настоящее время я записываю файлы с php в каталог, добавляю этот каталог (работает нормально), затем, когда я пытаюсь сделать svn commit, он не работает и не возвращает никаких кодов ошибок. У кого-нибудь есть идеи по этому поводу?

$tmp = exec('cd '.$this->build_locations[$this->type].'; svn commit --username user --password pw; ls', $output);

Я делаю компакт-диск в каталог (здесь работал нормально ls), потом делаю ls, чтобы подтвердить, что он все еще находится в каталоге.

Я также пробовал:

svn help

, который возвращает мне все команды просто отлично (так что я знаю, что проблема не в том, чтобы не найти команду svn.

Я chmoded файл 777, чтобы подтвердить, что он может выполняться.

Отредактированный код:

<code>    $output = array();
    $tmp1 = exec("cd ".$this->build_locations[$this->type].";");
    $tmp = exec("svn commit ".$this->build_locations[$this->type].$this->app_id." --username user --password password -m 'test' --non-interactive --trust-server-cert --quiet 2>&1;", $output, $error);
    if($error){
        echo('<pre>');
        print_r($output);
        echo('
'); } выход;

Это производит:

Array

    [0] => could not lookup DNS configuration info service: (ipc/send) invalid destination port
    [1] => svn: Commit failed (details follow):
    [2] => svn: Unknown hostname 'my.host'

Ответы [ 3 ]

4 голосов
/ 27 января 2010

Ошибки командной строки SVN переходят в stderr, а не в stdout, поэтому вы их не видите. Вам нужно перенаправить stderr в stdout, а затем print_r($output), чтобы определить причину ошибки.

exec('svn commit <stuff> 2>&1', $output, $returnStatus);
if ( $returnStatus )
{
    print_r($output);
}

Пример вывода:

Array
(
    [0] => svn: Commit failed (details follow):
    [1] => svn: '/path/to/<stuff>' is not under version control
)

Это не идеально, потому что он смешивает stderr с stdout, когда это было бы ненужным, но я не знаю другого способа получить желаемый результат в этом случае. Если кто-то другой, пожалуйста, прокомментируйте.

Примечание: Третий параметр exec (...) - это возвращаемое состояние , а не сообщение об ошибке, поэтому вам нужно настроить код соответственно и для этого.

Если вывод ошибки после внесения изменения 2>&1 не поможет устранить основную причину вашей проблемы, пожалуйста, опубликуйте новый вывод здесь.

Изменить после новой информации:

Вы загрузили эту рабочую копию SVN на свой сервер откуда-то еще? Это объясняет эту ошибку.

Если я извлекаю рабочую копию из локального репозитория, загружаю ее на свой удаленный сервер и затем пытаюсь зафиксировать, я получаю ту же ошибку.

Если это так, вам необходимо выполнить «svn checkout» рабочей копии на сервере, на котором выполняется PHP-скрипт , чтобы иметь возможность зафиксировать его. Если этот сервер не может связаться с сервером хранилища, тогда это совсем другая проблема.

1 голос
/ 27 января 2010

Можете ли вы попробовать выбросить ошибки (прочитайте комментарий Майка).

('cd '.$this->build_locations[$this->type].'; svn commit --username user --password pw; ls', $output, $error);
if($error){
   print_r($error);
}

Я бы предложил разбить вышеперечисленное на 3 отдельные команды для отладки.

Кроме того, если пользователи могут манипулировать $ this-type, то ваш код уязвим, поскольку они могут передавать что-то вроде: .; cat /etc/passwd, которое становится

$tmp = exec('cd .; cat /etc/passwd; svn commit --username user --password pw; ls', $output);
0 голосов
/ 27 января 2010

AFAIK, после svn commit, если опция -m не указана, открывается редактор для ввода сообщения фиксации. Попробуйте передать -m "Some commit message", может быть, это поможет.

...