標籤:style http color io os ar for 檔案 sp
SVN提交代碼時自動將發生改變的檔案和目錄更新到web目錄:
1.根據更新svn日誌,自動在/data/svn-update/mmoyu/目錄update發生改變的分支目錄
2.根據更新svn日誌,從/data/svn-update/mmoyu/分支目錄copy新增檔案(或改變的檔案)或者在目標目錄刪除檔案(或檔案夾)
PS :
mmoyu是我的一個svn倉庫,
51open是其中一個分支,
日誌產生在/data/www/logs/svn目錄
#!/usr/local/php/bin/php<?php/** * svn hook post-commit written by php * @author : yearnfar * @website : http://51open.net */ define(‘SVNBIN_PATH‘, ‘/usr/local/svn/bin‘);define(‘SVNLOG_PATH‘, ‘/data/www/logs/svn‘); //$svnpath[lable] = array(svndir, updatedir, dstdir);$svnpath["51open"] = array("51open", "/data/svn-update/mmoyu/51open", "/data/www/mmoyu/51open"); function main(){global $argc, $argv, $svnpath;if ($argc < 3) exit("params error!");list(, $path, $no) = $argv; $logs = array();$info = array(); if (popen_svnlook(‘info‘, $no, $path, $info)===-1) {exit("look info error!");} else {list($author, $time, $version, $message) = $info;$logs[] = "author: {$author}time: {$time}version: {$version}message: {$message}";} $logs[] = "change files:";$changefiles = array();if (popen_svnlook(‘changed‘, $no, $path, $changefiles)===-1) {exit("look changed error!");} else {$logs[] = implode(‘‘, $changefiles);} $logs[] = "change dirs:";$changedirs = array();if (popen_svnlook(‘dirs-changed‘, $no, $path, $changedirs)===-1) {exit("look dirs-changed error!");} else {$logs[] = implode(‘‘, $changedirs);} $sub = ‘‘;foreach ($changedirs as $dir) {//if ($sub==‘‘) {foreach ($svnpath as $k => $v) {if (strlen($dir)>strlen($v[0]) && substr($dir, 0, strlen($v[0]))==$v[0]) {$sub = $k;$offset = strlen($v[0]);break;}}}//if ($sub==‘‘) return ;//if (popen_svn(‘update‘, $no, $svnpath[$sub][1] . substr($dir, $offset))===-1) {exit("update error!");}} foreach($changefiles as $line) {$op = $line[0];$line = substr(trim(substr($line, 1)), $offset); $src = $svnpath[$sub][1] . $line;$dst = $svnpath[$sub][2] . $line; if ($op==‘D‘) {system_withlog("rm -rf {$dst}", $logs);continue;} elseif ($op==‘A‘) {if (!is_dir(dirname($dst))) {system_withlog("mkdir -p ".dirname($dst), $logs);}}//if (is_file($src)) {system_withlog("cp -f {$src} {$dst}", $logs);}} $logs[] = "\r\n\r\n";$logfile = SVNLOG_PATH."/{$sub}_{$no}.log"; $fp = fopen($logfile, "wb");fwrite($fp, implode("\r\n", $logs));fclose($fp); echo "all files updated! logs: {logfile}";return ;} function popen_svnlook($cmd, $no, $path, &$ret = array()){$ph = popen(SVNBIN_PATH."/svnlook {$cmd} -r {$no} {$path}", ‘r‘); while (($buffer = fgets($ph, 1024))!==false) {$ret[] = $buffer;}$errno = feof($ph) ? 0 : -1;pclose($ph); return $errno;} function popen_svn($cmd, $no, $path){$ph = popen(SVNBIN_PATH."/svn {$cmd} -r {$no} $path", ‘r‘);$ret = $ph ? 0: -1;pclose($ph);return $ret;} function system_withlog($cmd, &$logs=array()){system($cmd);$logs[] = $cmd;} //run~main();
用PHP寫的SVN post-commit