zoukankan      html  css  js  c++  java
  • PHP编写的SVN类

    <?php
    /**
     * SVN 外部命令 类
     *
     * @author rubekid
     *
     * @todo comment need addslashes for svn commit
     *
     */
    
    class SvnUtils {
    
        /**
         *
         * svn 账号
         */
        const SVN_USERNAME = "robot";
    
        /**
         * svn 密码
         */
        const SVN_PASSWORD = "robot2013";
    
        /**
         * 配置文件目录   (任意指定一个临时目录,解决svn: warning: Can't open file '/root/.subversion/servers': Permission denied)
         */
        const SVN_CONFIG_DIR = "/var/tmp/";
    
    
        /**
         * svn list
         *
         * @param $repository string
         * @return boolean
         *
         */
        public static function ls($repository) {
            $command = "sudo svn ls " . $repository;
            $output = self::runCmd ( $command );
            $output = implode ( "<br />", $output );
            if (strpos ( $output, 'non-existent in that revision' )) {
                return false;
            }
            return "<br />" . $command . "<br />" . $output;
        }
    
        /**
         * svn copy
         *
         * @param $src string
         * @param $dst string
         * @param $comment string
         * @return boolean
         *
         */
        public static function copy($src, $dst, $comment) {
            $command = "sudo svn cp $src $dst -m '$comment'";
            $output = self::runCmd ( $command );
            $output = implode ( "<br />", $output );
            if (strpos ( $output, 'Committed revision' )) {
                return true;
            }
            return "<br />" . $command . "<br />" . $output;
        }
    
        /**
         * svn delete
         *
         * @param $url string
         * @param $comment string
         * @return boolean
         *
         */
        public static function delete($url, $comment) {
            $command = "sudo svn del $url -m '$comment'";
            $output = self::runCmd ( $command );
            $output = implode ( '<br />', $output );
            if (strpos ( $output, 'Committed revision' )) {
                return true;
            }
            return "<br />" . $command . "<br />" . $output;
        }
    
        /**
         * svn move
         *
         * @param $src string
         * @param $dst string
         * @param $comment string
         * @return boolean
         */
        public static function move($src, $dst, $comment) {
            $command = "sudo svn mv $src $dst -m '$comment'";
            $output = self::runCmd ( $command );
            $output = implode ( '<br />', $output );
            if (strpos ( $output, 'Committed revision' )) {
                return true;
            }
            return "<br />" . $command . "<br />" . $output;
        }
    
        /**
         * svn mkdir
         *
         * @param $url string
         * @param $comment string
         * @return boolean
         */
        public static function mkdir($url, $comment) {
            $command = "sudo svn mkdir $url -m '$comment'";
            $output = self::runCmd ( $command );
            $output = implode ( '<br />', $output );
            if (strpos ( $output, 'Committed revision' )) {
                return true;
            }
            return "<br />" . $command . "<br />" . $output;
        }
    
        /**
         * svn diff
         * @param $pathA string
         * @param $pathB string
         * @return string
         */
        public static function diff($pathA, $pathB) {
            $output = self::runCmd ( "sudo svn diff $pathA $pathB" );
            return implode ( '<br />', $output );
        }
    
        /**
         * svn checkout
         * @param $url string
         * @param $dir string
         * @return boolean
         */
        public static function checkout($url, $dir) {
            $command = "cd $dir && sudo svn co $url";
            $output = self::runCmd ( $command );
            $output = implode ( '<br />', $output );
            if (strstr ( $output, 'Checked out revision' )) {
                return true;
            }
            return "<br />" . $command . "<br />" . $output;
        }
    
        /**
         * svn update
         * @param $path string
         */
        public static function update($path) {
            $command = "cd $path && sudo svn up";
            $output = self::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];
        }
    
        /**
         * svn merge
         *
         * @param $revision string
         * @param $url string
         * @param $dir string
         *
         * @return boolean
         */
        public static function merge($revision, $url, $dir) {
            $command = "cd $dir && sudo svn merge -r1:$revision $url";
            $output = implode ( '<br />', self::runCmd ( $command ) );
            if (strstr ( $output, 'Text conflicts' )) {
                return 'Command: ' . $command . '<br />' . $output;
            }
            return true;
        }
    
        /**
         * svn commit
         *
         * @param $dir string
         * @param $comment string
         *
         * @return boolean
         */
        public static function commit($dir, $comment) {
            $command = "cd $dir && sudo svn commit -m'$comment'";
            $output = implode ( '<br />', self::runCmd ( $command ) );
            if (strpos ( $output, 'Committed revision' ) || empty ( $output )) {
                return true;
            }
            return $output;
        }
    
        /**
         * svn status (输出WC中文件和目录的状态)
         *
         * @param $dir string
         */
        public static function getStatus($dir) {
            $command = "cd $dir && sudo svn st";
            return self::runCmd ( $command );
        }
    
        /**
         * svn 冲突
         *
         * @param $dir string
         * @return boolean
         */
        public static function hasConflict($dir) {
            $output = self::getStatus ( $dir );
            foreach ( $output as $line ) {
                if ( substr ( trim ( $line ), 0, 1 ) == 'C' || (substr ( trim ( $line ), 0, 1 ) == '!')) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * svn log
         *
         * @param $path string
         * @return string
         *
         */
        public static function getLog($path) {
            $command = "sudo svn log $path --xml";
            $output = self::runCmd ( $command );
            return implode ( '', $output );
        }
    
        /**
         * svn info
         * @param $path string
         */
        public static function getPathRevision($path) {
            $command = "sudo svn info $path --xml";
            $output = self::runCmd ( $command );
            $string = implode ( '', $output );
            $xml = new SimpleXMLElement ( $string );
            foreach ( $xml->entry [0]->attributes () as $key => $value ) {
                if ( $key == 'revision' ) {
                    return $value;
                }
            }
        }
    
        /**
         * 获取最新版本号
         * @param $path string
         */
        public static function getHeadRevision($path) {
            $command = "cd $path && sudo svn up";
            $output = self::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];
        }
    
        /**
         * 获取某文件最早版本号
         *
         * @param $filePath string
         *
         */
        public static function getFileFirstVersion($filePath){
            $command = "sudo svn log {$filePath}";
            $output = self::runCmd ( $command , "|grep -i ^r[0-9]* |awk  '{print $1}'");
            if(empty($output)){
                return false;
            }
            return str_replace("r", '', $output[count($output)-1]);
        }
    
        /**
         * 获取两个版本间修改的文件信息列表
         *
         * @param $fromVersion int
         * @param $headRevision int
         * @param $$path string
         *
         * @return array
         */
        public static function getChangedFiles($path, $fromVersion, $headRevision ){
            $files = array();
            $pipe = "|grep -i ^Index:|awk -F : '{print $2}'";
            $command = "svn diff -r {$fromVersion}:{$headRevision} $path";
            $output = self::runCmd ( $command ,$pipe);
            $files = array_merge($files, $output);
            $command = "svn diff -r {$headRevision}:{$fromVersion} $path"; //文件删除可用逆向对比
            $output = self::runCmd ( $command ,$pipe);
            $files = array_merge($files, $output);
            return array_unique($files);
        }
    
        /**
         * 获取两个版本间某文件修改 的内容
         *
         * @param $filePath string
         * @param $fromVersion int
         * @param $headRevision int
         *
         * @return array
         */
        public static function getChangedInfo( $filePath, $fromVersion, $headRevision ){
            $command = "sudo svn diff -r {$fromVersion}:{$headRevision} $filePath";
            $output = self::runCmd ( $command );
            return $output;
        }
    
        /**
         * 查看文件内容
         *
         * @param $filePath string
         * @param $version int
         *
         * @return array
         */
        public static function getFileContent($filePath, $version){
            $command = "sudo svn cat -r {$version} $filePath";
            $output = self::runCmd ( $command );
            return $output;
        }
    
        /**
         * Run a cmd and return result
         * @param $command string
         * @param $pipe string (可以增加管道对返回数据进行预筛选)
         * @return array
         */
        protected static function runCmd($command , $pipe ="") {
            $authCommand = ' --username ' . self::SVN_USERNAME . ' --password ' . self::SVN_PASSWORD . ' --no-auth-cache --non-interactive --config-dir ' . self::SVN_CONFIG_DIR . '.subversion';
            exec ( $command . $authCommand . " 2>&1" . $pipe, $output );
            return $output;
        }
    }
  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/rubekid/p/SvnUtils.html
Copyright © 2011-2022 走看看