文档章节

用PHP写的SVN post-commit

大道至簡
 大道至簡
发布于 2014/10/08 19:06
字数 468
阅读 525
收藏 2

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;
	fgets($ph, 1024);//read or warning~
	pclose($ph);
	return $ret;
}
 
function system_withlog($cmd, &$logs=array())
{
	system($cmd);
	$logs[] = $cmd;
}
 
//run~
main();


本文转载自:http://moyee.cn/?p=54

大道至簡

大道至簡

粉丝 45
博文 91
码字总数 24369
作品 0
广州
技术主管
私信 提问
SVN 使用hooks 自动更新到远程的web目录下

环境: A机器192.168.1.10 作为SVN的服务端 (环境 apache svn ssh) 环境: B机器 192.168.1.20 (环境 nginx php ssh svn 作为客户端) 目的:开发人员上传代码到A机器时, 会自动更新到B机器上ngi...

求学ing
2013/09/24
0
3
SVN本地开发、测试环境版本控制-自动发布生产环境

发布系统 由于网站的结构是基于lnmp的,所以我们主要的代码都是php代码,之前在大网站的时候,一般会有比较严格的流程和比较严格的打包发布机制,比如Yahoo的 yinst package, 但是对于初创团...

飞龙栖息地
2013/08/17
0
0
centos下svn同步不生效

环境:Centos 6.5 64位 min 、Nginx 1.6.1 、PHP 5.5.1、MySQL 5.6.20 yum 安装subversion ,设置的svn版本库为/usr/local/svn_dir 防火墙中 -A INPUT -p tcp -m state --state NEW -m tcp ......

phpng
2014/08/23
1K
1
马哥linux干货分享之SVN服务器部署并实现双机同步及禁止普通用户删除文件

下面来布署svn服务器 所有文件下载地址: http://pan.baidu.com/share/link?shareid=395023&uk=2501966565 环境:CentOS5.8 x64 ,开发包组已安装,iptables,selinux已经关闭 一.安装配置apach...

magedu_linux01
2014/08/29
814
0
Ubuntu下SVN安装和配置

一、SVN安装 1.安装包 1.$ sudo apt-get install subversion 2.创建项目目录 $ sudo mkdir /home/xiaozhe/svn $ cd /home/xiaozhe/svn/ $ sudo mkdir mypro 3.创建svn文件仓库 $ sudo svnad......

charley158
2013/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
5
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
2
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
3
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部