Export changed (and, optionally, uncommited) files from SVN repository
#!/usr/bin/php | |
<?php | |
/** | |
* Options: | |
* -r rev_from:rev_to -- revision range to export | |
* -u username -- svn username (optional) | |
* -p password -- svn password (optional) | |
* -n -- export with uncommited files (optional) | |
*/ | |
$opts = getopt('r:u:p:n'); | |
$odir = sprintf('svnexport-%s', date('Ymd')); | |
if (isset($opts['r'])) | |
{ | |
$outfile = []; | |
// files changed in specified revision range | |
$svndiff = shell_exec('svn diff -r ' . escapeshellarg($opts['r']) . (isset($opts['u']) ? ' --username ' . escapeshellarg($opts['u']) : '') . (isset($opts['p']) ? ' --password ' . escapeshellarg($opts['p']) : '') . ' --summarize'); | |
foreach (explode("\n", trim($svndiff)) as $item) | |
if (preg_match('/^[AM]\s+(.+)$/', trim($item), $match)) | |
$outfile[md5($match[1])] = $match[1]; | |
// uncommited files | |
if (isset($opts['n'])) | |
{ | |
$svnstat = shell_exec('svn status --ignore-externals' . (isset($opts['u']) ? ' --username ' . escapeshellarg($opts['u']) : '') . (isset($opts['p']) ? ' --password ' . escapeshellarg($opts['p']) : '')); | |
foreach (explode("\n", trim($svnstat)) as $item) | |
if (preg_match('/^[AM\?]\s+(.+)$/', trim($item), $match)) | |
$outfile[md5($match[1])] = $match[1]; | |
} | |
// remove output dir from filelist | |
if (isset($outfile[md5($odir)])) | |
unset($outfile[md5($odir)]); | |
$outfile = array_values($outfile); | |
if (count($outfile) > 0) | |
{ | |
printf("Exporting %d file(s) to \"%s\"...\n", count($outfile), $odir); | |
if (!file_exists($odir)) | |
if (!mkdir($odir, 0777, true)) | |
die(sprintf("\nFailed to create output directory: %s\n\n", $odir)); | |
foreach ($outfile as $path) | |
{ | |
printf(" -- %s\n", $path); | |
if (is_file($path)) | |
{ | |
if (!file_exists($odir . '/' . dirname($path))) | |
if (!mkdir($odir . '/' . dirname($path), 0777, true)) | |
die(sprintf("Failed to create export directory: %s\n\n", $odir . '/' . dirname($path))); | |
if (!copy($path, $odir . '/' . $path)) | |
die(sprintf("Failed to export file: %s\n\n", $path)); | |
} | |
elseif (is_dir($path)) | |
{ | |
if (!file_exists($odir . '/' . $path)) | |
if (!mkdir($odir . '/' . $path, 0777, true)) | |
die(sprintf("Failed to create export directory: %s\n\n", $odir . '/' . $path)); | |
} | |
} | |
echo("Done!\n\n"); | |
} | |
else | |
die("Nothing to export!\n\n"); | |
} | |
else | |
die("Usage:\n\tsvn-changes <options>\nOptions:\n\t-r rev_from:rev_to\n\t[-u username]\n\t[-p password]\n\t[-n]\n\n"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment