.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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html