#!/usr/bin/perl -w use strict; use warnings; use SVN::Client; use Data::Dumper; my $gitreposdir = '.'; my $svnrepo = 'http://svn.foswiki.org'; my $ctx = SVN::Client->new(); my %svnextensions = (); my %branches = ( pharvey => { WikiDrawPlugin => 'branches/scratch/pharvey/WikiDrawPlugin' }, ItaloValcy => { ImageGalleryPlugin => 'branches/scratch/ItaloValcy/ImageGalleryPlugin_5x10' }, 'foswikidotorg' => { _path => 'branches/foswiki.org', }, 'Release01x00' => { _path => 'branches/Release01x00', }, 'Release01x01' => { _path => 'branches/Release01x01', }, 'trunk' => { _path => 'trunk' } ); sub init { while ( my ( $branch, $data ) = each %branches ) { if ( $data->{_path} ) { my @branchextensions; print "Listing $svnrepo/$data->{_path}\n"; @branchextensions = keys %{ $ctx->ls( $svnrepo . '/' . $data->{_path}, 'HEAD', 0 ) }; foreach my $ext (@branchextensions) { if ( $ext ne 't2fos.sh' ) { $data->{$ext} = $data->{_path} . '/' . $ext; push( @{ $svnextensions{$ext} }, { branch => $branch, path => $data->{$ext} } ); } } } else { while ( my ( $ext, $path ) = each %{$data} ) { push( @{ $svnextensions{$ext} }, { branch => $branch, path => $path } ); } } } return; } # init_svnrepos(\{sort(keys %svnrepos)}); sub init_svnrepos { my ($extensions) = @_; my $success = 0; foreach my $ext ( @{$extensions} ) { $success = init_svnrepo($ext); } return $success; } sub init_svnrepo { my ($ext) = @_; my $success = 0; if ( $branches{trunk}->{$ext} ) { do_commands( "git svn init $svnrepo -T $branches{trunk}->{$ext} $gitreposdir/$ext" ); while ( my ( $branch, $data ) = each %branches ) { if ( $branch ne 'trunk' and $data->{$ext} ) { do_commands(<<"HERE"); cd $gitreposdir/$ext git config --add svn-remote.$branch.url http://svn.foswiki.org/$data->{$ext} git config --add svn-remote.$branch.fetch :refs/remotes/$branch HERE } } $success = 1; } else { print STDERR "ERROR: Couldn't find $ext in svn trunk\n"; } return $success; } sub gitclone2gitsvn { my ($ext) = @_; my $success = 0; if ( $svnextensions{$ext} ) { foreach my $branchpath ( @{ $svnextensions{$ext} } ) { if ( $branchpath->{branch} ne 'trunk' ) { #print "Aliasing refs/remotes/$branchpath->{path} as origin/$branchpath->{branch}\n"; do_commands(<<"HERE"); cd $gitreposdir/$ext git update-ref refs/remotes/$branchpath->{path} origin/$branchpath->{branch} HERE } } #print "Aliasing $svnrepo/trunk as origin/master\n"; do_commands(<<"HERE"); cd $gitreposdir/$ext git update-ref refs/remotes/trunk origin/master git svn init $svnrepo -T $branches{trunk}->{_path}/$ext HERE $success = 1; } else { print STDERR "The extension $ext doesn't exist in svn\n"; } return $success; } sub do_commands { my ($commands) = @_; #print $commands . "\n"; system($commands); return; } if ( scalar(@ARGV) ) { init(); foreach my $extension (@ARGV) { $extension =~ s/\/$//; if ( gitclone2gitsvn($extension) ) { print "Fixed $extension\n"; } } } else { print "Usage: ./fix