8080my %init_opts = ( ' template=s' => \$_template, ' shared:s' => \$_shared,
8181 ' trunk|T=s' => \$_trunk, ' tags|t=s' => \$_tags,
8282 ' branches|b=s' => \$_branches, ' prefix=s' => \$_prefix,
83+ ' minimize-url|m' => \$Git::SVN::_minimize_url ,
8384 ' no-metadata' => sub { $icv {noMetadata } = 1 },
8485 ' use-svm-props' => sub { $icv {useSvmProps } = 1 },
8586 ' use-svnsync-props' => sub { $icv {useSvnsyncProps } = 1 },
@@ -393,7 +394,7 @@ sub cmd_dcommit {
393394 } else {
394395 my %ed_opts = ( r => $last_rev ,
395396 log => get_commit_entry($d )-> {log },
396- ra => Git::SVN::Ra-> new($url ),
397+ ra => Git::SVN::Ra-> new($gs -> full_url ),
397398 tree_a => " $d ~1" ,
398399 tree_b => $d ,
399400 editor_cb => sub {
@@ -820,7 +821,7 @@ package Git::SVN;
820821use warnings;
821822use vars qw/ $default_repo_id $default_ref_id $_no_metadata $_follow_parent
822823 $_repack $_repack_flags $_use_svm_props $_head
823- $_use_svnsync_props $no_reuse_existing/ ;
824+ $_use_svnsync_props $no_reuse_existing $_minimize_url / ;
824825use Carp qw/ croak/ ;
825826use File::Path qw/ mkpath/ ;
826827use File::Copy qw/ copy/ ;
@@ -1037,7 +1038,7 @@ sub init_remote_config {
10371038 " [svn-remote \" $existing \" ]\n " ;
10381039 }
10391040 $self -> {repo_id } = $existing ;
1040- } else {
1041+ } elsif ($_minimize_url) {
10411042 my $min_url = Git::SVN::Ra-> new($url )-> minimize_url;
10421043 $existing = find_existing_remote($min_url , $r );
10431044 if ($existing ) {
@@ -1390,7 +1391,7 @@ sub traverse_ignore {
13901391 }
13911392 }
13921393 foreach (sort keys %$dirent ) {
1393- next if $dirent -> {$_ }-> kind != $SVN::Node::dir ;
1394+ next if $dirent -> {$_ }-> { kind } != $SVN::Node::dir ;
13941395 $self -> traverse_ignore($fh , " $path /$_ " , $r );
13951396 }
13961397}
@@ -2888,7 +2889,7 @@ package Git::SVN::Ra;
28882889BEGIN {
28892890 # enforce temporary pool usage for some simple functions
28902891 my $e ;
2891- foreach (qw/ get_latest_revnum get_uuid get_repos_root/ ) {
2892+ foreach (qw/ rev_proplist get_latest_revnum get_uuid get_repos_root/ ) {
28922893 $e .= " sub $_ {
28932894 my \$ self = shift;
28942895 my \$ pool = SVN::Pool->new;
@@ -2897,36 +2898,13 @@ BEGIN
28972898 wantarray ? \@ ret : \$ ret[0]; }\n " ;
28982899 }
28992900
2900- # get_dir needs $pool held in cache for dirents to work,
2901- # check_path is cacheable and rev_proplist is close enough
2902- # for our purposes.
2903- foreach (qw/ check_path get_dir rev_proplist/ ) {
2904- $e .= " my \% ${_}_cache; my \$ ${_}_rev = 0; sub $_ {
2905- my \$ self = shift;
2906- my \$ r = pop;
2907- my \$ k = join(\"\\ 0\" , \@ _);
2908- if (my \$ x = \$ ${_}_cache{\$ r}->{\$ k}) {
2909- return wantarray ? \@\$ x : \$ x->[0];
2910- }
2911- my \$ pool = SVN::Pool->new;
2912- my \@ ret = \$ self->SUPER::$_ (\@ _, \$ r, \$ pool);
2913- if (\$ r != \$ ${_}_rev) {
2914- \% ${_}_cache = ( pool => [] );
2915- \$ ${_}_rev = \$ r;
2916- }
2917- \$ ${_}_cache{\$ r}->{\$ k} = \\\@ ret;
2918- push \@ {\$ ${_}_cache{pool}}, \$ pool;
2919- wantarray ? \@ ret : \$ ret[0]; }\n " ;
2920- }
2921- $e .= " \n 1;" ;
2922- eval $e or die $@ ;
2901+ eval " $e ; 1;" or die $@ ;
29232902}
29242903
29252904sub new {
29262905 my ($class , $url ) = @_ ;
29272906 $url =~ s ! /+$!! ;
29282907 return $RA if ($RA && $RA -> {url } eq $url );
2929- $RA -> {pool }-> clear if $RA ;
29302908
29312909 SVN::_Core::svn_config_ensure($config_dir , undef );
29322910 my ($baton , $callbacks ) = SVN::Core::auth_open_helper([
@@ -2952,9 +2930,47 @@ sub new {
29522930 $self -> {svn_path } = $url ;
29532931 $self -> {repos_root } = $self -> get_repos_root;
29542932 $self -> {svn_path } =~ s # ^\Q $self->{repos_root}\E (/|$)## ;
2933+ $self -> {cache } = { check_path => { r => 0, data => {} },
2934+ get_dir => { r => 0, data => {} } };
29552935 $RA = bless $self , $class ;
29562936}
29572937
2938+ sub check_path {
2939+ my ($self , $path , $r ) = @_ ;
2940+ my $cache = $self -> {cache }-> {check_path };
2941+ if ($r == $cache -> {r } && exists $cache -> {data }-> {$path }) {
2942+ return $cache -> {data }-> {$path };
2943+ }
2944+ my $pool = SVN::Pool-> new;
2945+ my $t = $self -> SUPER::check_path($path , $r , $pool );
2946+ $pool -> clear;
2947+ if ($r != $cache -> {r }) {
2948+ %{$cache -> {data }} = ();
2949+ $cache -> {r } = $r ;
2950+ }
2951+ $cache -> {data }-> {$path } = $t ;
2952+ }
2953+
2954+ sub get_dir {
2955+ my ($self , $dir , $r ) = @_ ;
2956+ my $cache = $self -> {cache }-> {get_dir };
2957+ if ($r == $cache -> {r }) {
2958+ if (my $x = $cache -> {data }-> {$dir }) {
2959+ return wantarray ? @$x : $x -> [0];
2960+ }
2961+ }
2962+ my $pool = SVN::Pool-> new;
2963+ my ($d , undef , $props ) = $self -> SUPER::get_dir($dir , $r , $pool );
2964+ my %dirents = map { $_ => { kind => $d -> {$_ }-> kind } } keys %$d ;
2965+ $pool -> clear;
2966+ if ($r != $cache -> {r }) {
2967+ %{$cache -> {data }} = ();
2968+ $cache -> {r } = $r ;
2969+ }
2970+ $cache -> {data }-> {$dir } = [ \%dirents , $r , $props ];
2971+ wantarray ? (\%dirents , $r , $props ) : \%dirents ;
2972+ }
2973+
29582974sub DESTROY {
29592975 # do not call the real DESTROY since we store ourselves in $RA
29602976}
@@ -3169,7 +3185,7 @@ sub match_globs {
31693185 return unless scalar @x == 3;
31703186 my $dirents = $x [0];
31713187 foreach my $de (keys %$dirents ) {
3172- next if $dirents -> {$de }-> kind != $SVN::Node::dir ;
3188+ next if $dirents -> {$de }-> { kind } != $SVN::Node::dir ;
31733189 my $p = $g -> {path }-> full_path($de );
31743190 next if $exists -> {$p };
31753191 next if (length $g -> {path }-> {right } &&
0 commit comments