.git/config is written on each commit. It's slow
---
 perl/Git/SVN/Fetcher.pm | 77 +++++++++++++++++++++++++++++++------------------
 1 file changed, 49 insertions(+), 28 deletions(-)

diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
index e658889..a5ad4cd 100644
--- a/perl/Git/SVN/Fetcher.pm
+++ b/perl/Git/SVN/Fetcher.pm
@@ -1,5 +1,6 @@
 package Git::SVN::Fetcher;
 use vars qw/@ISA $_ignore_regex $_preserve_empty_dirs $_placeholder_filename
+            $_package_inited
             @deleted_gpath %added_placeholder $repo_id/;
 use strict;
 use warnings;
@@ -26,32 +27,9 @@ sub new {
                                  _mark_empty_symlinks($git_svn, $switch_path);
        }
 
-       # some options are read globally, but can be overridden locally
-       # per [svn-remote "..."] section.  Command-line options will *NOT*
-       # override options set in an [svn-remote "..."] section
-       $repo_id = $git_svn->{repo_id};
-       my $k = "svn-remote.$repo_id.ignore-paths";
-       my $v = eval { command_oneline('config', '--get', $k) };
-       $self->{ignore_regex} = $v;
-
-       $k = "svn-remote.$repo_id.preserve-empty-dirs";
-       $v = eval { command_oneline('config', '--get', '--bool', $k) };
-       if ($v && $v eq 'true') {
-               $_preserve_empty_dirs = 1;
-               $k = "svn-remote.$repo_id.placeholder-filename";
-               $v = eval { command_oneline('config', '--get', $k) };
-               $_placeholder_filename = $v;
-       }
-
-       # Load the list of placeholder files added during previous invocations.
-       $k = "svn-remote.$repo_id.added-placeholder";
-       $v = eval { command_oneline('config', '--get-all', $k) };
-       if ($_preserve_empty_dirs && $v) {
-               # command() prints errors to stderr, so we only call it if
-               # command_oneline() succeeded.
-               my @v = command('config', '--get-all', $k);
-               $added_placeholder{ dirname($_) } = $_ foreach @v;
-       }
+       _try_init_package($git_svn);
+       $self->{_save_ph} = { %added_placeholder };
+       $self->{ignore_regex} = $_ignore_regex;
 
        $self->{empty} = {};
        $self->{dir_prop} = {};
@@ -64,6 +42,43 @@ sub new {
        $self;
 }
 
+sub _try_init_package {
+       if (!$_package_inited) {
+               my ( $git_svn ) = @_;
+
+               $_package_inited = 1;
+               $repo_id = $git_svn->{repo_id};
+
+               # some options are read globally, but can be overridden locally
+               # per [svn-remote "..."] section.  Command-line options will 
*NOT*
+               # override options set in an [svn-remote "..."] section
+
+               my $k = "svn-remote.$repo_id.ignore-paths";
+               my $v = eval { command_oneline('config', '--get', $k) };
+               $_ignore_regex = $v;
+
+               $k = "svn-remote.$repo_id.preserve-empty-dirs";
+               $v = eval { command_oneline('config', '--get', '--bool', $k) };
+               if ($v && $v eq 'true') {
+                       $_preserve_empty_dirs = 1;
+                       $k = "svn-remote.$repo_id.placeholder-filename";
+                       $v = eval { command_oneline('config', '--get', $k) };
+                       $_placeholder_filename = $v;
+
+                       # Load the list of placeholder files added during 
previous invocations.
+                       $k = "svn-remote.$repo_id.added-placeholder";
+                       $v = eval { command_oneline('config', '--get-all', $k) 
};
+                       if ($v) {
+                               # command() prints errors to stderr, so we only 
call it if
+                               # command_oneline() succeeded.
+                               my @v = command('config', '--get-all', $k);
+                               $added_placeholder{ dirname($_) } = $_ foreach 
@v;
+                       }
+               }
+       }
+       undef
+}
+
 # this uses the Ra object, so it must be called before do_{switch,update},
 # not inside them (when the Git::SVN::Fetcher object is passed) to
 # do_{switch,update}
@@ -123,8 +138,6 @@ sub is_path_ignored {
        return 1 if in_dot_git($path);
        return 1 if defined($self->{ignore_regex}) &&
                    $path =~ m!$self->{ignore_regex}!;
-       return 0 unless defined($_ignore_regex);
-       return 1 if $path =~ m!$_ignore_regex!o;
        return 0;
 }
 
@@ -506,6 +519,14 @@ sub add_placeholder_file {
 
 sub stash_placeholder_list {
        my ($self) = @_;
+
+       for ( keys %added_placeholder ) {
+               goto theydiffer if (!delete $self->{_save_ph}{$_});
+       }
+       return undef if (!keys $self->{_save_ph});
+
+theydiffer:
+
        my $k = "svn-remote.$repo_id.added-placeholder";
        my $v = eval { command_oneline('config', '--get-all', $k) };
        command_noisy('config', '--unset-all', $k) if $v;
-- 
1.8.1.5


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to