【PHP】SVN版本差異匯出
阿新 • • 發佈:2020-08-27
<?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 . "\n"; } } $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 "開始匯出...\n"; foreach ($diffFile as $svnFileName) { # 寫日誌 fileWrite($diffFilePath, $svnFileName . "\n", '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; } }