经测试代码如下:
<?php
/**
* 操作SVN类
*
* @param
* @author 编程之家 jb51.cc jb51.cc
* This class for execute the external program of svn
*
*
*/
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>,'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>','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,$comment)
{
$command = svn mv $src $dst -m '$comment';
$output = SvnPeer::runCmd($command);
$output = implode('<br>','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>','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),1) || ('!' == substr(trim($line),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>',$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;
}
}
/*** 来自编程之家 jb51.cc(jb51.cc) ***/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。