• 【PHP】SVN版本差异导出


    <?php
    /**
     * 导出指定版本之间的差异文件,如 100 和 200 之间的差异则导出 100(不包括) - 200(包括) 的所有修改
     * 【SVN命令行】
     * 1、查看版本间差异
     * svn diff -r 2359:2360 --summarize --username heyw --password 123123 svn://192.168.0.10/rrc_cli
     * 2、导出某个版本文件到本地
     * svn export -r 2360 svn://192.168.0.10/rrc_cli/common/controller/WechatBaseController.class.php /tmp/rrc_cli/common/controller/WechatBaseController.class.php --username heyw --password 123123
     *
     * @example svn.php 60 62:63 70
     * @author heyw
     */
    
    // 初始化
    
    # 项目配置
    $svnUrl = array(
    	'rrc_cli' => 'svn://192.168.0.10/rrc_cli/'
    );
    
    # 账号密码
    $svnUser = 'heyw';
    $svnPass = '123456';
    
    # 根目录
    define('SITE_PATH', dirname(__FILE__));
    
    
    // 参数
    $param = $_SERVER['argv'];
    if (empty($param) || count($param) < 3) {
    	exit('run: php svn.php svn_project(www) change_version(60:61)');
    }
    
    # 初始化
    $svnPro = $param[1];
    $changeVersion = $param[2];
    if (empty($svnUrl[$svnPro])) {
    	exit('wrong svn project');
    }
    
    # 解析
    $url = $svnUrl[$svnPro];
    $params = explode(' ', $changeVersion);
    $diffFile = [];
    $maxVersion = 0;
    foreach ($params as $changeVer) {
    	# 各版本之间的差异文件
    	$versionArr = explode(':', str_replace([':',':'], ':', $changeVer));
    	$oldVersion = $versionArr[0] - 1;
    	$newVersion = empty($versionArr[1]) ? $versionArr[0] : $versionArr[1];
    	$diffCmd   	= "svn diff -r ${oldVersion}:${newVersion} --summarize --username ${svnUser} --password ${svnPass} ${url}";
    	exec($diffCmd, $diffList, $return);
    	$diff = (array)$diffList;
    
    	# 差异文件分析
    	foreach ($diff as $diffInfo) {
    		if (preg_match('/([w]+)s+(svn:.+)/', $diffInfo, $matches)) {
    			# 匹配变更类型,以及文件名称
    			$svnFileMode = $matches[1];
    			$svnFileName = $matches[2];
    	 
    			# 文件被删除,A、M、D、AM即增加且修改
    			if ($svnFileMode == 'D' || in_array($svnFileName, $diffFile)) {
    				continue;
    			}
    
    			# 差异文件 && 日志
    			$diffFile[] = $svnFileName;
    			echo $diffInfo . "
    ";
    		}
    	}
    
    	$maxVersion = $newVersion;
    }
    
    # 版本差异
    $diffCount = count($diffFile);
    if (count($diffFile) < 1) {
    	exit("版本间没有差异");
    }
    
    // 文件导出
    # 目录,差异文件
    $workPath = SITE_PATH . '/' . $svnPro;
    $diffFilePath = SITE_PATH . "/diff_" . str_replace(' ', '_', $changeVersion) . ".txt";
     
    # 清空旧数据
    @system('rm -rf ' . $workPath);
    @system('rm -rf ' . SITE_PATH . '/diff_*');
    svnMkdir($workPath);
     
    # 导出版本文件
    echo "开始导出...
    ";
    foreach ($diffFile as $svnFileName) {
    	# 写日志
    	fileWrite($diffFilePath, $svnFileName . "
    ", 'a');
    
    	# 下载到本地
    	$localFilePath = $workPath . '/' . str_replace($url, '', $svnFileName);
    	$localFileDir = dirname($localFilePath);
    	svnMkdir($localFileDir);
    
    	$export_cmd = "svn export -r ${maxVersion} ${svnFileName} ${localFilePath} --username ${svnUser} --password ${svnPass}";
    	system($export_cmd);
    }
     
    exit("共导出${diffCount}个差异文件");
     
     
    /**
     * 创建文件夹
     *
     * @param string $path      文件夹路径
     * @param int    $mode      访问权限
     * @param bool   $recursive 是否递归创建
     * @return bool
     */
    function svnMkdir($path = '', $mode = 0777, $recursive = true) {
    	clearstatcache();
    	if (!is_dir($path)) {
    		mkdir($path, $mode, $recursive);
    		return chmod($path, $mode);
    	}
     
    	return true;
    }
     
    /**
     * 写文件
     *
     * @param string $filename 文件名
     * @param string $text     要写入的文本字符串
     * @param string $openmod  文本写入模式('w':覆盖重写,'a':文本追加)
     * @return bool
     */
    function fileWrite($filename = '', $text = '', $openmod = 'w') {
    	if (@$fp = fopen($filename, $openmod)) {
    		flock($fp, 2);
    		fwrite($fp, $text);
    		fclose($fp);
    		return true;
    	} else {
    		return false;
    	}
    }
    

      

    得意时做事,失意时读书
  • 相关阅读:
    Jedis、RedisTemplate、StringRedisTemplate之间的比较
    阿里云服务器搭建DiscuzQ
    阿里云Docker加速镜像配置
    IDEA不卡配置
    Tomcat中出现"RFC 7230 and RFC 3986"错误的解决方法
    Eclipse设置保存时自动格式化代码
    VUE中v-for和v-if不能同时使用的问题
    JS中设置cookie,读取cookie,删除cookie
    JS中数组的拷贝方法
    在VSCode中开启ESLint风格审查
  • 原文地址:https://www.cnblogs.com/lanse1993/p/13570313.html
Copyright © 2020-2023  润新知