php操作SVN

<?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;
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值