X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=git-svnimport.perl;h=b73d6494d80fe5ee19e1d95971e2e4e64e980dea;hb=795cbe938fdc60228c4c9654a658aa27a7570b79;hp=f6eff8e32adc92a072b33de9040e2154efd13a8a;hpb=83877f8d92b2050eb668dc3351277e57779a8f05;p=git.git diff --git a/git-svnimport.perl b/git-svnimport.perl index f6eff8e32..b73d6494d 100755 --- a/git-svnimport.perl +++ b/git-svnimport.perl @@ -31,25 +31,29 @@ $SIG{'PIPE'}="IGNORE"; $ENV{'TZ'}="UTC"; our($opt_h,$opt_o,$opt_v,$opt_u,$opt_C,$opt_i,$opt_m,$opt_M,$opt_t,$opt_T, - $opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D,$opt_S,$opt_F); + $opt_b,$opt_r,$opt_I,$opt_A,$opt_s,$opt_l,$opt_d,$opt_D,$opt_S,$opt_F, + $opt_P,$opt_R); sub usage() { print STDERR <new(); + $path =~ s#^/*##; eval { (undef, $properties) = $self->{'svn'}->get_file($path,$rev,$fh,$pool); }; $pool->clear; @@ -179,6 +184,7 @@ sub ignore { my($self,$path,$rev) = @_; print "... $rev $path ...\n" if $opt_v; + $path =~ s#^/*##; my (undef,undef,$properties) = $self->{'svn'}->get_dir($path,$rev,undef); if (exists $properties->{'svn:ignore'}) { @@ -195,6 +201,7 @@ sub ignore { sub dir_list { my($self,$path,$rev) = @_; + $path =~ s#^/*##; my ($dirents,undef,$properties) = $self->{'svn'}->get_dir($path,$rev,undef); return $dirents; @@ -278,7 +285,7 @@ my $last_rev = ""; my $last_branch; my $current_rev = $opt_s || 1; unless(-d $git_dir) { - system("git-init-db"); + system("git-init"); die "Cannot init the GIT db at $git_tree: $?\n" if $?; system("git-read-tree"); die "Cannot init an empty tree: $?\n" if $?; @@ -352,6 +359,7 @@ open BRANCHES,">>", "$git_dir/svn2git"; sub node_kind($$) { my ($svnpath, $revision) = @_; my $pool=SVN::Pool->new; + $svnpath =~ s#^/*##; my $kind = $svn->{'svn'}->check_path($svnpath,$revision,$pool); $pool->clear; return $kind; @@ -427,6 +435,20 @@ sub get_ignore($$$$$) { } } +sub project_path($$) +{ + my ($path, $project) = @_; + + $path = "/".$path unless ($path =~ m#^\/#) ; + return $1 if ($path =~ m#^$project\/(.*)$#); + + $path =~ s#\.#\\\.#g; + $path =~ s#\+#\\\+#g; + return "/" if ($project =~ m#^$path.*$#); + + return undef; +} + sub split_path($$) { my($rev,$path) = @_; my $branch; @@ -446,7 +468,11 @@ sub split_path($$) { print STDERR "$rev: Unrecognized path: $path\n" unless (defined $no_error{$path}); return () } - $path = "/" if $path eq ""; + if ($path eq "") { + $path = "/"; + } elsif ($project_name) { + $path = project_path($path, $project_name); + } return ($branch,$path); } @@ -516,7 +542,7 @@ sub copy_path($$$$$$$$) { if ($node_kind eq $SVN::Node::dir) { $srcpath =~ s#/*$#/#; } - + my $pid = open my $f,'-|'; die $! unless defined $pid; if (!$pid) { @@ -534,7 +560,7 @@ sub copy_path($$$$$$$$) { } else { $p = $path; } - push(@$new,[$mode,$sha1,$p]); + push(@$new,[$mode,$sha1,$p]); } close($f) or print STDERR "$newrev:$newbranch: could not list files in $oldpath \@ $rev\n"; @@ -841,34 +867,14 @@ sub commit { or die "Cannot write branch $dest for update: $!\n"; } - if($tag) { - my($in, $out) = ('',''); + if ($tag) { $last_rev = "-" if %$changed_paths; # the tag was 'complex', i.e. did not refer to a "real" revision $dest =~ tr/_/\./ if $opt_u; - $branch = $dest; - - my $pid = open2($in, $out, 'git-mktag'); - print $out ("object $cid\n". - "type commit\n". - "tag $dest\n". - "tagger $committer_name <$committer_email> 0 +0000\n") and - close($out) - or die "Cannot create tag object $dest: $!\n"; - - my $tagobj = <$in>; - chomp $tagobj; - - if ( !close($in) or waitpid($pid, 0) != $pid or - $? != 0 or $tagobj !~ /^[0123456789abcdef]{40}$/ ) { - die "Cannot create tag object $dest: $!\n"; - } - open(C,">$git_dir/refs/tags/$dest") and - print C ("$tagobj\n") and - close(C) - or die "Cannot create tag $branch: $!\n"; + system('git-tag', $dest, $cid) == 0 + or die "Cannot create tag $dest: $!\n"; print "Created tag '$dest' on '$branch'\n" if $opt_v; } @@ -898,6 +904,7 @@ sub commit_all { while(my($path,$action) = each %$changed_paths) { ($branch,$path) = split_path($revision,$path); next if not defined $branch; + next if not defined $path; $done{$branch}{$path} = $action; } while(($branch,$changed_paths) = each %done) { @@ -913,11 +920,27 @@ if ($opt_l < $current_rev) { exit; } -print "Fetching from $current_rev to $opt_l ...\n" if $opt_v; +print "Processing from $current_rev to $opt_l ...\n" if $opt_v; -my $pool=SVN::Pool->new; -$svn->{'svn'}->get_log("/",$current_rev,$opt_l,0,1,1,\&commit_all,$pool); -$pool->clear; +my $from_rev; +my $to_rev = $current_rev - 1; + +while ($to_rev < $opt_l) { + $from_rev = $to_rev + 1; + $to_rev = $from_rev + $repack_after; + $to_rev = $opt_l if $opt_l < $to_rev; + print "Fetching from $from_rev to $to_rev ...\n" if $opt_v; + my $pool=SVN::Pool->new; + $svn->{'svn'}->get_log("/",$from_rev,$to_rev,0,1,1,\&commit_all,$pool); + $pool->clear; + my $pid = fork(); + die "Fork: $!\n" unless defined $pid; + unless($pid) { + exec("git-repack", "-d") + or die "Cannot repack: $!\n"; + } + waitpid($pid, 0); +} unlink($git_index);