SubversionИногда возникает необходимость получить измененные файлы между двумя ревизиями. Не многие svn gui клиенты способны на это (а под linux таких вообще не встречал).
Зачем это нужно? Ну скажем для загрузки изменений произошедших в проекте. При этом не нужно будет перезаливать весь проект, что безусловно экономит время и трафик! :-)
Для упрощения этой процедуры был написан небольшой консольный скрипт на php.
#! /usr/bin/php
< ?php
/**
* usage: svn://server repository start_revision end_revision /export/path/
*/
// Ловим параметры
if(isset($argv[1], $argv[2], $argv[3], $argv[4], $argv[5]) && ereg('^[0-9]+$', $argv[3]) && ereg('^[0-9]+$', $argv[4]))
{
$server = $argv[1];
$repository = $argv[2];
$revStart = $argv[3];
$revEnd = $argv[4];
$saveDir = $argv[5];
}
else
{
die("usage: svn://server repository start_revision end_revision /export/path/\n");
}
// Функция создания папок по пути
function mkdirs($path)
{
if(is_dir($path))
{
return true;
}
$exp = explode("/", $path);
$way = '';
foreach($exp as $n)
{
$way .= $n . '/';
if(!file_exists($way))
{
if(!mkdir($way, 0777))
{
return false;
}
}
}
return true;
}
// Получаем список измененных файлов
$svnList = explode("\n", `svn diff --summarize -r {$revStart}:{$revEnd} {$server}/{$repository}/`);
if(sizeof($svnList))
{
// Запишем ревизию в файл
file_put_contents($saveDir . '.revision', $revEnd);
foreach($svnList as $item)
{
if(strlen($item))
{
// Получаем путь до файла в хранилище
$sfile = trim(substr($item, 5, strlen($item)));
if(parse_url($sfile, PHP_URL_SCHEME) != '')
{
$sdir = dirname($sfile);
// Получаем путь папки для сохранения
$dir = $saveDir . substr($sdir, strlen($server . '/' . $repository . '/'), strlen($sdir));
// Получаем путь файла для сохранения
$file = $saveDir . substr($sfile, strlen($server . '/' . $repository . '/'), strlen($sfile));
// Создаем папку
if(mkdirs($dir))
{
// Забираем файл из хранилища
print `svn export --force -r {$revEnd} {$sfile} {$file}`;
}
}
}
}
}
?>
Использовать его очень просто:
~$ export.php svn://server path/to/repository start_revision end_revision /export/path/
Источник:
http://webiteam.ru/2009/03/eksport-iz-svn/