diff options
Diffstat (limited to 'z-distfiles/scripts-gw/svm-expanded')
-rwxr-xr-x | z-distfiles/scripts-gw/svm-expanded | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/z-distfiles/scripts-gw/svm-expanded b/z-distfiles/scripts-gw/svm-expanded new file mode 100755 index 0000000..d74a8a4 --- /dev/null +++ b/z-distfiles/scripts-gw/svm-expanded @@ -0,0 +1,153 @@ +#!/usr/bin/perl -w + +eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}' + if 0; # not running under some shell +use strict; +use SVN::Core '0.32'; +use SVN::Mirror; + +=head1 NAME + +svm - command line interface for remote Subversion repository mirroring + +=head1 SYNOPSIS + + # the svn repository for svm to use + % setenv SVMREPOS ~/svm + + # set the path mirror/svn to mirror official subversion trunk + % svm init mirror/svn http://svn.collab.net/repos/svn/trunk + + # run the actual mirroring + # flatten the changesets between revision 1 thru 6000 + % svm sync mirror/svn 6000 + + # merge back changes in local branch + % svn cp file://$SVMREPOS/mirror/svn file://$SVMREPOS/svn-local + # make some changes and then merge back to source repository + % svm mergeback mirror/svn svn-local + +=head1 DESCRIPTION + +F<svm> mirrors remote repository accissible via L<SVN::Ra> interface +to a local repository. + +=head1 COMMANDS + +=over + +=item init B<path> B<url> + +Initialize the B<path> in svm repository to mirror from B<url>. + +=item sync B<path> B<[sync_to]> + +Invoke the synchronization of B<path> in svm repository according the +how it is initialized. + +=back + +=cut + +my $repospath = $ENV{SVMREPOS} || $ENV{HOME}.'/svn/svm'; +my $auth = SVN::Core::auth_open ([SVN::Client::get_simple_provider, + SVN::Client::get_ssl_server_trust_file_provider, + SVN::Client::get_username_provider]); + +sub help { + require Pod::Text; + my $parser = Pod::Text->new (sentence => 0, width => 78); + $parser->parse_from_file ($0, '-' ); +} + +sub init { + die "$0 init <path> <source>" unless $#_ == 1; + my ($path, $source) = @_; + my $m = SVN::Mirror->new(target_path => $path, target => $repospath, + auth => $auth, + source => $source, target_create => 1); + $m->init; +} + +sub ls { + my $m = SVN::Mirror->new(target => $repospath); + + $m->list; +} + +sub can_continue { + $_ = $@; + return 1 if + m/Connection reset by peer/ || + m/connection timed out/; +} + +sub unlock { + my $path = shift; + my $what = shift; + my $pool = SVN::Pool->new_default; + my $m = SVN::Mirror->new(target_path => $path, target => $repospath, + pool => $pool, auth => $auth, + get_source => 1); + + $m->unlock($what); + +} + +sub sync { + my $path = shift; + my $skip_to = shift; + my $pool = SVN::Pool->new_default; + my $m = SVN::Mirror->new(target_path => $path, target => $repospath, + pool => $pool, auth => $auth, + get_source => 1, skip_to => $skip_to); + + while (1) { + eval { + $m->init; + $m->run; + }; + last unless $@; + + warn $@; + $m->{pool} = SVN::Pool->new_default; + $m = SVN::Mirror->new(%$m); + last unless can_continue; + print "retry...\n"; + sleep 5; + } + +} + +sub mergeback { + my ($path, $branch_path, $rev) = @_; + my $pool = SVN::Pool->new_default; + my $m = SVN::Mirror->new(target_path => $path, target => $repospath, + pool => $pool, auth => $auth, + get_source => 1); + $m->init; + $m->mergeback ($rev-1, $branch_path, $rev); +} + +my $cmd = shift || 'help'; + +die "command not recognized" unless main->can($cmd); + +no strict 'refs'; + +&$cmd(@ARGV); + +=head1 AUTHORS + +Chia-liang Kao E<lt>clkao@clkao.orgE<gt> + +=head1 COPYRIGHT + +Copyright 2003 by Chia-liang Kao E<lt>clkao@clkao.orgE<gt>. + +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +See L<http://www.perl.com/perl/misc/Artistic.html> + +=cut |