当前位置:  开发笔记 > 编程语言 > 正文

php操作SVN类

使用PHP完成SVN的操作,包括复制,查看列表,删除,移动,创建目录,查看diff,更新,合并,提交,获取状态,获取commitlog,获取当前版本号操作。在svn1.6.11版本中测试通过。">

使用PHP完成SVN的操作,包括复制,查看列表,删除,移动,创建目录,查看diff,更新,合并,提交,获取状态,获取commit log,获取当前版本号操作。在svn 1.6.11版本中测试通过。

 

/**
*
* 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("
", $output);
if (strpos($output, &#39;non-existent in that revision&#39;)) {
return false;
}

return "
" . $command . "
" . $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 &#39;$comment&#39;";
$output = SvnPeer::runCmd($command);
$output = implode("
", $output);

if (strpos($output, &#39;Committed revision&#39;)) {
return true;
}

return "
" . $command . "
" . $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 &#39;$comment&#39;";
$output = SvnPeer::runCmd($command);
$output = implode(&#39;
&#39;, $output);
if (strpos($output, &#39;Committed revision&#39;)) {
return true;
}

return "
" . $command . "
" . $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 &#39;$comment&#39;";
$output = SvnPeer::runCmd($command);
$output = implode(&#39;
&#39;, $output);

if (strpos($output, &#39;Committed revision&#39;)) {
return true;
}

return "
" . $command . "
" . $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 &#39;$comment&#39;";
$output = SvnPeer::runCmd($command);
$output = implode(&#39;
&#39;, $output);

if (strpos($output, &#39;Committed revision&#39;)) {
return true;
}

return "
" . $command . "
" . $output;
}

static public function diff($pathA, $pathB)
{
$output = SvnPeer::runCmd("svn diff $pathA $pathB");
return implode(&#39;
&#39;, $output);
}

static public function checkout($url, $dir)
{
$command = "cd $dir && svn co $url";
$output = SvnPeer::runCmd($command);
$output = implode(&#39;
&#39;, $output);
if (strstr($output, &#39;Checked out revision&#39;)) {
return true;
}

return "
" . $command . "
" . $output;
}


static public function update($path)
{
$command = "cd $path && svn up";
$output = SvnPeer::runCmd($command);
$output = implode(&#39;
&#39;, $output);

preg_match_all("/[0-9]+/", $output, $ret);
if (!$ret[0][0]){
return "
" . $command . "
" . $output;
}

return $ret[0][0];
}

static public function merge($revision, $url, $dir)
{
$command = "cd $dir && svn merge -r1:$revision $url";
$output = implode(&#39;
&#39;, SvnPeer::runCmd($command));
if (strstr($output, &#39;Text conflicts&#39;)) {
return &#39;Command: &#39; . $command .&#39;
&#39;. $output;
}

return true;
}

static public function commit($dir, $comment)
{
$command = "cd $dir && svn commit -m&#39;$comment&#39;";
$output = implode(&#39;
&#39;, SvnPeer::runCmd($command));

if (strpos($output, &#39;Committed revision&#39;) || 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 (&#39;C&#39; == substr(trim($line), 0, 1) || (&#39;!&#39; == 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(&#39;&#39;, $output);
}

static public function getPathRevision($path)
{
$command = "svn info $path --xml";
$output = SvnPeer::runCmd($command);
$string = implode(&#39;&#39;, $output);
$xml = new SimpleXMLElement($string);
foreach ($xml->entry[0]->attributes() as $key=>$value){
if (&#39;revision&#39; == $key) {
return $value;
}
}
}

static public function getHeadRevision($path)
{
$command = "cd $path && svn up";
$output = SvnPeer::runCmd($command);
$output = implode(&#39;
&#39;, $output);

preg_match_all("/[0-9]+/", $output, $ret);
if (!$ret[0][0]){
return "
" . $command . "
" . $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 = &#39; --username &#39; . SVN_USERNAME . &#39; --password &#39; . SVN_PASSWORD . &#39; --no-auth-cache --non-interactive --config-dir &#39;.SVN_CONFIG_DIR.&#39;.subversion&#39;;
exec($command . $authCommand . " 2>&1", $output);

return $output;
}
}


推荐阅读
author-avatar
我们一起美容瘦身
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有