shell_exec('svn commit filename', $output);
Переменная $output после shell_exec содержит STDOUT. Но там нет всех необходимых данных, например строки 'commited revision'. И нет описания ошибки, почему команда не выполнилась.
|
shell_exec('svn commit filename', $output); Переменная $output после shell_exec содержит STDOUT. Но там нет всех необходимых данных, например строки 'commited revision'. И нет описания ошибки, почему команда не выполнилась.
|
|||
|
|
Описание ошибки, возможно, может быть в STDERR. Для этого, если использовать shell_exec, можно перенаправить вывод STDERR в STDOUT. Для этого надо добавить " 2>&1" в конец команды. Например: shell_exec('svn commit -m "commit message" 2>&1', $output); После этого проверять $output. Нет гарантий, что это будет 100% работать. Разные команды бросают свой вывод по-разному. Альтернативным вариантом c хэндлингом ошибок процесса является использование proc_open и обработкой потоков мануально. Пример: $desc = [ 1 => ['pipe', 'w'], // STDOUT 2 => ['pipe', 'w'], // STDERR ]; $proc = proc_open(sprintf( self::SVN_PATH . ' commit %s %s -m %s', $this->getCliCredentials(), implode(' ', $toCommit), escapeshellarg($msg) ), $desc, $pipes); if (is_resource($proc)) { if ($out = stream_get_contents($pipes[1])) { file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' out: ' . print_r($out, true) . PHP_EOL, FILE_APPEND | LOCK_EX); } fclose($pipes[1]); if ($err = stream_get_contents($pipes[2])) { file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' err: ' . print_r($err, true) . PHP_EOL, FILE_APPEND | LOCK_EX); } fclose($pipes[2]); // You can also check the process exit status // 0 means success, otherwise error. $exit_status = proc_close($proc); file_put_contents('/tmp/svn-err', date('[Y-m-d H:i:s] ') . ' exit status: ' . print_r($exit_status, true) . PHP_EOL, FILE_APPEND | LOCK_EX); }
|
|||
|