用PHP寫的SVN post-commit

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.