php操作SVN版本服务器类代码

 更新时间:2011年11月27日 16:36:17   作者:  
使用PHP完成SVN的操作,包括复制,查看列表,删除,移动,创建目录,查看diff,更新,合并,提交,获取状态,获取commit log,获取当前版本号操作。在svn 1.6.11版本中测试通过
SvnPeer.php
复制代码 代码如下:

<?php
/**
*
* This class for execute the external program of svn
*
* @auth Seven Yang <qineer@gmail.com>
*
*/
class SvnPeer
{
/**
* List directory entries in the repository
*
* @param string a specific project repository path
* @return bool true, if validated successfully, otherwise false
*/
static public function ls($repository)
{
$command = "svn ls " . $repository;
$output = SvnPeer::runCmd($command);
$output = implode("<br>", $output);
if (strpos($output, 'non-existent in that revision')) {
return false;
}
return "<br>" . $command . "<br>" . $output;
}
/**
* Duplicate something in working copy or repository, remembering history
*
* @param $src
* @param $dst
* @param $comment string specify log message
* @return bool true, if copy successfully, otherwise return the error message
*
* @todo comment need addslashes for svn commit
*/
static public function copy($src, $dst, $comment)
{
$command = "svn cp $src $dst -m '$comment'";
$output = SvnPeer::runCmd($command);
$output = implode("<br>", $output);
if (strpos($output, 'Committed revision')) {
return true;
}
return "<br>" . $command . "<br>" . $output;
}
/**
* Remove files and directories from version control
*
* @param $url
* @return bool true, if delete successfully, otherwise return the error message
*
* @todo comment need addslashes for svn commit
*/
static public function delete($url, $comment)
{
$command = "svn del $url -m '$comment'";
$output = SvnPeer::runCmd($command);
$output = implode('<br>', $output);
if (strpos($output, 'Committed revision')) {
return true;
}
return "<br>" . $command . "<br>" . $output;
}
/**
* Move and/or rename something in working copy or repository
*
* @param $src string trunk path
* @param $dst string new branch path
* @param $comment string specify log message
* @return bool true, if move successfully, otherwise return the error message
*
* @todo comment need addslashes for svn commit
*/
static public function move($src, $dst, $comment)
{
$command = "svn mv $src $dst -m '$comment'";
$output = SvnPeer::runCmd($command);
$output = implode('<br>', $output);
if (strpos($output, 'Committed revision')) {
return true;
}
return "<br>" . $command . "<br>" . $output;
}
/**
* Create a new directory under version control
*
* @param $url string
* @param $comment string the svn message
* @return bool true, if create successfully, otherwise return the error message
*
* @todo comment need addslashes for svn commit
*/
static public function mkdir($url, $comment)
{
$command = "svn mkdir $url -m '$comment'";
$output = SvnPeer::runCmd($command);
$output = implode('<br>', $output);
if (strpos($output, 'Committed revision')) {
return true;
}
return "<br>" . $command . "<br>" . $output;
}
static public function diff($pathA, $pathB)
{
$output = SvnPeer::runCmd("svn diff $pathA $pathB");
return implode('<br>', $output);
}
static public function checkout($url, $dir)
{
$command = "cd $dir && svn co $url";
$output = SvnPeer::runCmd($command);
$output = implode('<br>', $output);
if (strstr($output, 'Checked out revision')) {
return true;
}
return "<br>" . $command . "<br>" . $output;
}
static public function update($path)
{
$command = "cd $path && svn up";
$output = SvnPeer::runCmd($command);
$output = implode('<br>', $output);
preg_match_all("/[0-9]+/", $output, $ret);
if (!$ret[0][0]){
return "<br>" . $command . "<br>" . $output;
}
return $ret[0][0];
}
static public function merge($revision, $url, $dir)
{
$command = "cd $dir && svn merge -r1:$revision $url";
$output = implode('<br>', SvnPeer::runCmd($command));
if (strstr($output, 'Text conflicts')) {
return 'Command: ' . $command .'<br>'. $output;
}
return true;
}
static public function commit($dir, $comment)
{
$command = "cd $dir && svn commit -m'$comment'";
$output = implode('<br>', SvnPeer::runCmd($command));
if (strpos($output, 'Committed revision') || empty($output)) {
return true;
}
return $output;
}
static public function getStatus($dir)
{
$command = "cd $dir && svn st";
return SvnPeer::runCmd($command);
}
static public function hasConflict($dir)
{
$output = SvnPeer::getStatus($dir);
foreach ($output as $line){
if ('C' == substr(trim($line), 0, 1) || ('!' == substr(trim($line), 0, 1))){
return true;
}
}
return false;
}
/**
* Show the log messages for a set of path with XML
*
* @param path string
* @return log message string
*/
static public function getLog($path)
{
$command = "svn log $path --xml";
$output = SvnPeer::runCmd($command);
return implode('', $output);
}
static public function getPathRevision($path)
{
$command = "svn info $path --xml";
$output = SvnPeer::runCmd($command);
$string = implode('', $output);
$xml = new SimpleXMLElement($string);
foreach ($xml->entry[0]->attributes() as $key=>$value){
if ('revision' == $key) {
return $value;
}
}
}
static public function getHeadRevision($path)
{
$command = "cd $path && svn up";
$output = SvnPeer::runCmd($command);
$output = implode('<br>', $output);
preg_match_all("/[0-9]+/", $output, $ret);
if (!$ret[0][0]){
return "<br>" . $command . "<br>" . $output;
}
return $ret[0][0];
}
/**
* Run a cmd and return result
*
* @param string command line
* @param boolen true need add the svn authentication
* @return array the contents of the output that svn execute
*/
static protected function runCmd($command)
{
$authCommand = ' --username ' . SVN_USERNAME . ' --password ' . SVN_PASSWORD . ' --no-auth-cache --non-interactive --config-dir '.SVN_CONFIG_DIR.'.subversion';
exec($command . $authCommand . " 2>&1", $output);
return $output;
}
}

相关文章

  • 详解php中curl返回false的解决办法

    详解php中curl返回false的解决办法

    这篇文章主要介绍了php中curl返回false的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • PHP之uniqid()函数用法

    PHP之uniqid()函数用法

    这篇文章主要介绍了PHP中uniqid()函数的用法,包括了函数的基本用法与应用分析,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • php判断GIF图片是否为动画的方法

    php判断GIF图片是否为动画的方法

    这篇文章主要介绍了php判断GIF图片是否为动画的方法,需要的朋友可以参考下
    2014-07-07
  • php测试kafka项目示例

    php测试kafka项目示例

    这篇文章主要介绍了php测试kafka项目,结合实例形式分析了kafka-php项目依赖的安装、配置及测试使用技巧,需要的朋友可以参考下
    2020-02-02
  • PHP中session跨子域的三种实现方法

    PHP中session跨子域的三种实现方法

    做项目的时候跨域问题在cooike及session中我们经常会使用到了,不过php对于子域处理是比较简单的了,小编整理了三个解决方案,下面一起来看看。
    2016-07-07
  • PHP类的自动加载与命名空间用法实例分析

    PHP类的自动加载与命名空间用法实例分析

    这篇文章主要介绍了PHP类的自动加载与命名空间,结合实例形式分析了PHP类的自动加载与命名空间相关概念、原理、用法与操作注意事项,需要的朋友可以参考下
    2020-06-06
  • PHP中根据IP地址判断城市实现城市切换或跳转代码

    PHP中根据IP地址判断城市实现城市切换或跳转代码

    先要获取ip地址相当简单,下面先介绍两种获取IP地址的代码,后面需要利用QQIP库来查找当前IP是属于那个IP段然后得出城市字段并返回
    2012-09-09
  • thinkphp 字母函数详解T/I/N/D/M/A/R/U

    thinkphp 字母函数详解T/I/N/D/M/A/R/U

    下面小编就为大家带来一篇thinkphp 字母函数详解T/I/N/D/M/A/R/U。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • PHP实现的解汉诺塔问题算法示例

    PHP实现的解汉诺塔问题算法示例

    这篇文章主要介绍了PHP实现的解汉诺塔问题算法,简单描述了汉诺塔问题及相应的实现算法,并结合实例形式给出了PHP具体操作技巧,需要的朋友可以参考下
    2018-08-08
  • 洪恩在线成语词典小偷程序php版

    洪恩在线成语词典小偷程序php版

    去年在学习用php做小偷程序时的一个练习之作,希望能给有同样需求的朋友带来些帮助,程序主要流程是获取洪恩在线的成语词典查询结果并在当前页面显示出来(俗称小偷程序),使用语言为php
    2012-04-04

最新评论