git-svn: cache only mergeinfo revisions
authorEric Wong <normalperson@yhbt.net>
Mon, 20 Oct 2014 01:02:53 +0000 (01:02 +0000)
committerEric Wong <normalperson@yhbt.net>
Fri, 24 Oct 2014 22:55:39 +0000 (22:55 +0000)
This should reduce excessive memory usage from the new mergeinfo
caches without hurting performance too much, assuming reasonable
latency to the SVN server.

Cc: Hin-Tak Leung <htl10@users.sourceforge.net>
Suggested-by: Jakob Stoklund Olesen <stoklund@2pi.dk>
Signed-off-by: Eric Wong <normalperson@yhbt.net>
perl/Git/SVN.pm

index 171af37..f8a75b1 100644 (file)
@@ -1713,13 +1713,10 @@ sub mergeinfo_changes {
        # Initialize cache on the first call.
        unless (defined $self->{cached_mergeinfo_rev}) {
                $self->{cached_mergeinfo_rev} = {};
-               $self->{cached_mergeinfo} = {};
        }
 
        my $cached_rev = $self->{cached_mergeinfo_rev}{$old_path};
-       if (defined $cached_rev && $cached_rev == $old_rev) {
-               $old_minfo = $self->{cached_mergeinfo}{$old_path};
-       } else {
+       unless (defined $cached_rev && $cached_rev == $old_rev) {
                my $ra = $self->ra;
                # Give up if $old_path isn't in the repo.
                # This is probably a merge on a subtree.
@@ -1728,19 +1725,16 @@ sub mergeinfo_changes {
                                "directory didn't exist in r$old_rev\n";
                        return {};
                }
-               my (undef, undef, $props) =
-                       $self->ra->get_dir($old_path, $old_rev);
-               if (defined $props->{"svn:mergeinfo"}) {
-                       my %omi = map {split ":", $_ } split "\n",
-                               $props->{"svn:mergeinfo"};
-                       $old_minfo = \%omi;
-               }
-               $self->{cached_mergeinfo}{$old_path} = $old_minfo;
-               $self->{cached_mergeinfo_rev}{$old_path} = $old_rev;
        }
+       my (undef, undef, $props) = $self->ra->get_dir($old_path, $old_rev);
+       if (defined $props->{"svn:mergeinfo"}) {
+               my %omi = map {split ":", $_ } split "\n",
+                       $props->{"svn:mergeinfo"};
+               $old_minfo = \%omi;
+       }
+       $self->{cached_mergeinfo_rev}{$old_path} = $old_rev;
 
        # Cache the new mergeinfo.
-       $self->{cached_mergeinfo}{$path} = \%minfo;
        $self->{cached_mergeinfo_rev}{$path} = $rev;
 
        my %changes = ();