`

php操作SVN

    博客分类:
  • 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;
  }
}
分享到:
评论

相关推荐

    linux系统下svn服务器操作命令

    Linux 系统下 SVN 服务器操作命令 本资源总结了 Linux 系统下 SVN 服务器操作命令的详细信息,涵盖了初学者可以使用的 Ubuntu 系统下的基本命令,希望对大家有帮助。 一、基本命令 1. 将文件 checkout 到本地目录...

    使用PHP进行Apache+SVN的权限管理

    这个模块使得Apache能够支持SVN,让开发者可以通过Web浏览器进行版本控制操作。安装完毕后,你需要在Apache的配置文件(如httpd.conf或sites-available目录下的站点配置文件)中启用该模块,并配置SVN仓库的路径。 ...

    windows 安装配置apache_mysql_php_tomcat_svn

    ### Windows环境下Apache、MySQL、PHP、Tomcat及SVN的安装与配置 #### 一、概述 本文档旨在提供一个Windows环境下安装与配置Apache、MySQL、PHP、Tomcat及SVN的基本步骤,以便搭建出一个集成开发环境。通过本文档...

    svn服务器管理页面

    `svnmanger`是一个基于Web的SVN服务管理工具,它允许管理员通过浏览器界面执行各种操作,如创建、删除、管理用户账户,控制权限,以及对SVN仓库进行配置。"已汉化版"意味着这个工具已经被翻译成中文,对中国用户来说...

    svn linux下命令详解

    例如:svn add test.php(添加 test.php 文件),svn add *.php(添加当前目录下所有的 php 文件)。 3. 将改动的文件提交到版本库 svn commit 命令用于将改动的文件提交到版本库。该命令的基本语法为:svn commit...

    thinkphp的svn客户端类

    ThinkPHP框架提供了一个内置的 SVN 客户端类,使得开发者可以方便地在PHP环境中实现SVN操作。这个类库允许我们执行如版本库的检查、更新、提交、差异比较等常见SVN命令。 `thinkphp的svn客户端类` 是一个专门为...

    SVN目录下.svn文件批量删除

    7. **后续操作**:删除`.svn`后,如果你还需要继续使用SVN,你需要重新将目录加入到SVN控制之下,这通常通过`svn add`和`svn commit`命令完成。 总之,SVN_Deleter提供了一个便捷的方法来批量删除`.svn`目录,这...

    在zend中用svn拉取工程

    ### 在Zend中使用SVN拉取工程的知识点详解 #### SVN简介 版本控制系统(Version Control System,VCS)是软件开发中不可或缺的一部分,它能够帮助开发者管理代码版本、追踪变更历史以及协同工作等。Subversion(SVN...

    linix fedora svn命令大全

    Linux Fedora下的Subversion(简称svn)是一个版本控制系统,用于跟踪文件和目录的...在实际工作中,根据团队的需求和工作流程,可能会有更复杂的用法,比如解决冲突、分支管理等,但这些基本命令构成了svn操作的基础。

    SVNManager配置详细说明文档

    该软件基于 SVN 核心,结合 Apache 和 PHP,提供了一个完整的 SVN 管理解决方案。 在本文档中,我们将介绍 SVNManager 的配置详细说明,包括安装环境、软件需求、安装过程、配置说明等方面的内容。 首先,让我们...

    linux下svn简明教程

    使用`svn delete`、`svn del`或`svn rm`删除文件,并提交删除操作: ``` svn delete test.php svn ci -m "delete test file" ``` 8. **Log(日志查看)**: `svn log`查看文件或目录的修改历史记录: ``` ...

    SVN常用操作命令

    ### SVN常用操作命令详解 #### 1、将文件CHECKOUT到本地目录 - **命令**: `svn checkout &lt;路径&gt;` (其中 `&lt;路径&gt;` 是服务器上的目录) - **示例**: `svn checkout svn://192.168.1.1/pro/domain` - **简写**: `svn co...

    linux下的 svn命令

    通过svn命令,用户可以实现对代码库的多种操作,包括检出、添加、提交、更新、查看状态、删除、查看日志、比较差异、合并版本等。以下是对这些常见svn命令的详细解释: 1. **检出(Checkout)**: `svn checkout` 或 `...

    ubuntu SVN命令大全

    - 删除操作必须通过 `svn commit` 提交才能生效。 #### 八、Log (日志) **命令格式**: ``` svn log [文件或目录] ``` **示例**: ``` svn log test.php ``` **功能说明**: - `svn log` 命令用于显示文件或目录...

    svnmanager

    【svnmanager】是一款用于管理Subversion(SVN)仓库的Web界面工具,它使得SVN的管理和操作变得更加直观和便捷。在本文中,我们将详细探讨如何搭建和配置svnmanager服务器,以及解决在过程中可能遇到的一些常见问题...

    svn项目共享部署文件

    在实际操作中,团队通常会创建一个svn仓库,然后为每个开发人员分配读写权限。他们可以使用svn客户端(如TortoiseSVN)来克隆仓库,进行本地开发,然后将更改提交回仓库。当需要部署项目时,可以从svn仓库中拉取最新...

Global site tag (gtag.js) - Google Analytics