Главная > PHP, Subversion > Экспорт из SVN

Экспорт из SVN

Иногда возникает необходимость получить измененные файлы между двумя ревизиями. Не многие 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/

Вот и все! ;-)

Categories: PHP, Subversion Tags: ,
  1. Silver Dragon
    26 Март 2009 в 17:26 | #1

    Было бы еще круче если б гуишка была :)

  2. jarool
    26 Март 2009 в 17:36 | #2

    Интересно, а на Windows машине `svn diff –summarize -r {$revStart}:{$revEnd} {$server}/{$repository}/` сработает ?

  3. 26 Март 2009 в 22:55 | #3

    Вообще говоря сработает. При установке клиента svn тоже ставиться всегда. Единственное что нужно путь прописать полный.

  4. 8 Апрель 2009 в 12:34 | #4

    Не многие svn gui клиенты способны на это (а под linux таких вообще не встречал)

    smartSVN

  5. 8 Апрель 2009 в 14:50 | #5

    Aco :

    smartSVN

    Что-то не вижу как…

  6. 23 Апрель 2009 в 16:27 | #6

    TUX :

    Aco :

    smartSVN

    Что-то не вижу как…

    Query -> Create Patch…

  7. 22 Май 2009 в 11:25 | #7

    Если svn+ssh то на каждый файл просит пароль, очень напрягает, особенно если файлов больше тысячи…

  8. 22 Май 2009 в 11:44 | #8

    @Aco
    Добавь доверенный ключ.
    И будет тебе счастье! =)

  9. 22 Май 2009 в 16:16 | #9

    Кстати, напомни, как его добавить?

  10. 25 Май 2009 в 07:58 | #10

    Aco :

    Кстати, напомни, как его добавить?

    Напоминаю: Создание доверенного ssh ключа
    ;)

  11. 25 Май 2009 в 11:26 | #11

    На сервере не опасно ключи держать? Имхо, лучше сделать скрипт так, что бы он за один раз все файлы выкачивал?

  12. 25 Май 2009 в 12:21 | #12

    @Aco
    За один раз не получиться. Таков протокол svn’а.
    Если есть какие-либо опасения за сохранность ключей, то лучше сделать отдельную ssh-учетку для работы svn’а с минимальными правами.

  1. Пока что нет уведомлений.