codepot/pecl-svn/examples/hook_copycommit.php

109 lines
3.1 KiB
PHP
Executable File

<?php
/*
example copy on commit hook script
usage:
php ..path..to..this..file.. hook_copycommit.php "$REPOS" "$REV" "/target/location" >> /tmp/svnlog
*/
dl('svn.so');
class Subversion_CopyCommit {
var $repos;
var $rev;
var $target; // where the copy goes
function start($args) {
print_r($args);
list( $cmd , $this->repos, $this->rev , $this->target ) = $args;
if (empty($this->target)) {
echo "NO TARGET !";exit;
}
if ($this->repos{0} == '/') {
$this->repos = 'file://'. $this->repos;
}
$this->rev = (int) $this->rev;
$ar = svn_log($this->repos, $this->rev, $this->rev-1, 0, SVN_DISCOVER_CHANGED_PATHS);
//print_R($ar);
foreach($ar[0]['paths'] as $action) {
$this->processAction($action);
}
}
function processAction($action)
{
$this->debug("Action: {$action['action']} on {$action['path']}");
switch($action['action']) {
case 'M': // modified
case 'A': // added.
/* how to handle moves?? */
// is it a file or directory?
if ($this->isDir($action['path'])) {
if (!file_exists($this->target . $action['path'])) {
require_once 'System.php';
System::mkdir(array('-p',$this->target . $action['path']));
}
return;
}
$this->writeFile($this->target.$action['path'],
svn_cat($this->repos . $action['path'],$this->rev)) ;
return;
case 'D': // deleted.
if (file_exists($this->target . $action['path'])) {
require_once 'System.php';
System::rm($this->target . $action['path']);
}
return;
case 'R': // replaced????
return;
}
}
var $dircache = array();
function isDir($path)
{
if (!isset($this->dircache[dirname($path)])) {
echo "SVN:LS ".$this->repos.dirname($path) ."\n";
$p = strlen(dirname($path)) > 1 ? dirname($path) : '';
$this->dircache[dirname($path)]= svn_ls($this->repos.$p,$this->rev);
}
$ar= $this->dircache[dirname($path)];
//print_r($ar);
$match = basename($path);
foreach($ar as $info) {
if ($info['name'] != $match) {
continue;
}
return $info['type'] == 'dir';
}
return false;
}
function writeFile($target,$data)
{
if (!file_exists(dirname($target))) {
require_once 'System.php';
System::mkdir(array('-p', dirname($target)));
}
$fh = fopen($target,'w');
fwrite($fh, $data);
fclose($fh);
}
function debug($str)
{
echo $str."\n";
}
}
ini_set('memory_limit','64M');
$x = new Subversion_CopyCommit;
$x->start($_SERVER['argv']);