PHP:exec(svn commit)没有返回任何不起作用的错误

时间:2010-01-26 22:04:17

标签: php svn exec

目前我正在用php将文件写入目录,我添加了该目录(工作正常),然后当我尝试做一个svn提交它不工作也不返回任何类型的错误代码。有没有人对此有任何想法?

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

我将cd放到目录中(这里的ls工作得很好),之后我做了一个ls确认它仍在目录中。

我也试过了:

svn help

返回所有命令就好了(所以我知道它不是没有找到svn命令的问题。

我已经对文件777进行了编码以确认它可以执行。

编辑代码:

    $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('</pre>');
    }
    exit;

这会产生:

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 个答案:

答案 0 :(得分:4)

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工作副本从其他位置上传到您的服务器?这可以解释这个错误。

如果我从本地存储库中检出工作副本,将其上传到我的远程服务器,然后尝试提交,我会收到同样的错误。

如果是这种情况,您需要在运行PHP脚本的服务器上执行工作副本的“svn checkout”,以便能够提交它。如果该服务器无法与存储库的服务器通信,那么这是另一个问题。

答案 1 :(得分:1)

你能否尝试抛弃错误(阅读Mike的评论)状态。

('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);

答案 2 :(得分:0)

AFAIK,在svn commit之后,如果未提供-m选项,则打开编辑器以输入提交消息。尝试传递-m "Some commit message",也许这会有所帮助。