2008-12-01

Install websvn-2.0 for old subversion

服务器上的svn版本很低(1.1.4),为了稳定性就一直没动过。为了比对代码方便,以前还配过websvn-1.6.2。今天心血来潮突然想换个新版本的websvn-2.0,因为这个安装并不麻烦,就是赔几个路径,开关几个选项(websvn/include/config.php)。当我简单处理之后,界面是出来了,奇怪的是文件列表和文件内容出不来,更不要说diff的结果了。已开始以为是下载的包有问题,重下了一次,问题依旧。看来问题在别处。或许配置文件里面有机关,仔仔细细地读了config.php,也没发现异常,都是一些选项开关,不会影响到内容的。奇怪!只好看代码了,为了简单,从列举目录开始(listing.php)。流程比较清楚,递归调用showDirFiles收集文件信息,最后通过模板显示出来。击出echo大法,在应该有内容的array之后查看其内容,结果很让人吃惊:都是0!也就是说获取目录列表肯定出错了。又研究了一番代码,当前目录列表内容是从

$contents = $svnrep->dirContents($path, $rev);

过来的,dirContents是include/svnlook.php中SVNRespository的一个成员函数,跟踪进去,里面有干活的一句:

$output = runCommand($config->svn." list ".$this->repConfig->svnParams().quote($path)."@$rev", true);

再次祭出echo大法,奇怪奇怪,这个命令的执行结果居然为空!不应该啊,把命令行拷贝出来在server的term里执行,果然出错:

$ svn --non-interactive --config-dir /tmp list 'file:///xxxxxxx/'@59
svn: Unable to open an ra_local session to URL
svn: Unable to open repository 'file:///xxxxx/@59'
svn: Berkeley DB error while opening environment for filesystem /var/svnroot/cprfs/db:
Permission denied

命令行应该是对的,我还特意在本地执行了一次,正常。怪哉怪哉,随手svn help list了一下,没想到看到:

# server
$ svn help list
list (ls): List directory entries in the repository.
usage: list [TARGET...]


# local
$ svn help list
list (ls): List directory entries in the repository.
usage: list [TARGET[@REV]...]

问题原来在这里!服务器上的svn版本太旧,list命令不支持@REV的格式!回到svnlook.php中,将上面列出的语句改为:

$output = runCommand($config->svn." list ".$this->repConfig->svnParams().quote($path)." -r $rev", true);

测试通过!

好了,将svnlook.php中所有的@$rev的都给替换成-r $rev,websvn-2.0就跑起来了,界面漂亮了不少。

没有评论: