用PHP写的SVN post-commit

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();
时间: 2024-10-12 13:21:23

用PHP写的SVN post-commit的相关文章

怎么解决svn error &quot;svn: Aborting commit: xxx remains in conflict&quot;?

遇到问题 $ sudo svn commit -m ''svn: E155015: Commit failed (details follow):svn: E155015: Aborting commit: '/Users/mac/data/lz/core/lz.php' remains in conflict 解决方法1: $ sudo svn resolved /Users/mac/data/lz/core/lz.phpResolved conflicted state of 'core/l

eclipse svn Aborting commit: &#39;XXXXXXXX&#39;remains in conflict

svn提交新代码的时候,一直报错“Aborting commit: 'XXXXXXXX'remains in conflict” 于是开始搜寻解决办法,网络上大多是单独使用svn时的解决办法,其中前因后果讲的比较详细的是这篇: http://blog.sina.com.cn/s/blog_5d2673da0100i78k.html 讲的太复杂不太适合实战.读完之后仍然不知怎样解决,于是用很笨的方法,手动删除了临时文件再提交,虽然提交成功但是这个方法太暴力不可取. 之后又找到此文,觉得很实用,特此

svn: Aborting commit: ‘‘.settings‘ remains in tree

svn: Aborting commit: 'E:\MyEclipse2013\WorkspacesStarnet\BillSystem\.settings' remains in tree-conflict错误的解决方法 在工程上进行提交(Commit)操作时,报以下错误: svn: Aborting commit: 'E:\MyEclipse2013\WorkspacesStarnet\BillSystem\.settings' remains in tree-conflict 原因分析:

Subversion代码提交中的org.apache.subversion.javahl.ClientException: svn: E200007: Commit failed异常解决

引言: 在切换subversion服务器地址之后,发生的无法正确提交代码的问题org.apache.subversion.javahl.ClientException: svn: E200007: Commit failed (details follow), 该如何解决呢? 1.  背景介绍 由于项目需要,在机器上切换了subversion的服务器地址,但是在新的subversion的服务器地址上进行代码提交之时,出现了无法提交的错误. 2.  错误信息的分析 具体的错误信息: org.apa

svn提交失败 :“svn: E200007: Commit failed”

引言: 在切换subversion服务器地址之后,发生的无法正确提交代码的问题org.apache.subversion.javahl.ClientException: svn: E200007: Commit failed (details follow), 该如何解决呢? 1.  背景介绍 由于项目需要,在机器上切换了subversion的服务器地址,但是在新的subversion的服务器地址上进行代码提交之时,出现了无法提交的错误. 2.  错误信息的分析 具体的错误信息: org.apa

王立平--org.apache.subversion.javahl.ClientException: svn: E155011: Commit failed (details follow): svn

往svn服务器提交代码时候, 遇到错误:org.apache.subversion.javahl.ClientException: svn: E155011: Commit failed (details follow): svn: E155011: Directory 'D:\Android2\Picture\bin\dexedLibs' is out of date org.apache.subversion.javahl.ClientException: svn: E155011: Com

SVN中Commit出现乱码的解决方案【转载】

http://blog.csdn.net/thinkingcao/article/details/52797737 这几天在电脑上装了一个SVN,把Eclipse里面的工程全部Delete掉了,然后在SVN上Check uot下来了SVN服务器上的项目,导入到Eclipse中,以便随时Commit和提交,在我Commit的过程中遇到了一个问题,Commit出现乱码,并且失败了 平时使用svn的过程中,有的时候由于自己操作故障或者系统原因,导致svn不能更新,提示cleanup也不能成功,陷入了死

svn在commit后报错:is scheduled for addition, but is missing

删除文件夹后点commit提交,但是报错,报错内容如下: 提示 "svn: Commit failed (details follow): svn: '/***/xxx.c' is scheduled for addition, but is missing " 原因:之前用SVN提交过的文件,被标记为"add"状态,等待被加入到仓库.若此时你把这个文件删除了,SVN提交的时候还是会尝试提交这个文件,虽然它的状态已经是 "missing"了. 解

SVN如何commit(提交)项目代码

在本地代码做出变更之后,我们就需要通过svn commit命令提交到远程服务端 工具/原料 SVN客户端 方法/步骤 选中需要更新的代码文件夹或目录,点击右键,选择"TortoiseSVN"--"Add" 此时SVN客户端会自动帮你识别出已经变更过的代码文件,可以根据自己的需要选择是否需要上传. 选择"Ok"后会提示所有的文件已经"Add"成功了 再次回到第一步的目录,点击右键,选择"SVN Commit"

写出好的 commit message

为什幺要关注提交信息 加快Reviewing Code的过程 帮助我们写好release note 5年后帮你快速想起来某个分支,tag或者 commit增加了什么功能,改变了哪些代码 让其他的开发者在运行 git blame 的时候想跪谢 总之一个好的提交信息,会帮助你提高项目的整体质量 基本要求 第一行应该少于50个字. 随后是一个空行 第一行题目也可以写成:Fix issue #8976 喜欢用 vim 的哥们把下面这行代码加入 .vimrc 文件中,来检查拼写和自动折行 autocmd