Previously, we would fail fatally when trying to fetch changes with mergeinfo on a 32 bit machine, when the repository previously had fetched changes with mergeinfo on a 64 bit machine. This fixes bug 618875 (which is also 587650, 635097). Much of the code was written by Jonathan Nieder <jrnieder@xxxxxxxxx> with suggestions from Steffen Mueller <smueller@xxxxxxxx> (see http://lists.debian.org/debian-perl/2011/05/msg00023.html and http://lists.debian.org/debian-perl/2011/05/msg00026.html). Signed-off-by: Jason Gross <jgross@xxxxxxx> Cc: Jonathan Nieder <jrnieder@xxxxxxxxx> --- git-svn.perl | 59 +++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 36 insertions(+), 23 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index 89f83fd..78ccdc8 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -1680,7 +1680,7 @@ use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent $_use_svnsync_props $no_reuse_existing $_minimize_url $_use_log_author $_add_author_from $_localtime/; use Carp qw/croak/; -use File::Path qw/mkpath/; +use File::Path qw/mkpath rmtree/; use File::Copy qw/copy/; use IPC::Open3; use Memoize; # core since 5.8.0, Jul 2002 @@ -3198,28 +3198,41 @@ sub has_no_changes { $memoized = 1; my $cache_path = "$ENV{GIT_DIR}/svn/.caches/"; - mkpath([$cache_path]) unless -d $cache_path; - - tie my %lookup_svn_merge_cache => 'Memoize::Storable', - "$cache_path/lookup_svn_merge.db", 'nstore'; - memoize 'lookup_svn_merge', - SCALAR_CACHE => 'FAULT', - LIST_CACHE => ['HASH' => \%lookup_svn_merge_cache], - ; - - tie my %check_cherry_pick_cache => 'Memoize::Storable', - "$cache_path/check_cherry_pick.db", 'nstore'; - memoize 'check_cherry_pick', - SCALAR_CACHE => 'FAULT', - LIST_CACHE => ['HASH' => \%check_cherry_pick_cache], - ; - - tie my %has_no_changes_cache => 'Memoize::Storable', - "$cache_path/has_no_changes.db", 'nstore'; - memoize 'has_no_changes', - SCALAR_CACHE => ['HASH' => \%has_no_changes_cache], - LIST_CACHE => 'FAULT', - ; + my $do_memoization = sub { + mkpath([$cache_path]) unless -d $cache_path; + + tie my %lookup_svn_merge_cache => 'Memoize::Storable', + "$cache_path/lookup_svn_merge.db", 'nstore'; + memoize 'lookup_svn_merge', + SCALAR_CACHE => 'FAULT', + LIST_CACHE => ['HASH' => \%lookup_svn_merge_cache], + ; + + tie my %check_cherry_pick_cache => 'Memoize::Storable', + "$cache_path/check_cherry_pick.db", 'nstore'; + memoize 'check_cherry_pick', + SCALAR_CACHE => 'FAULT', + LIST_CACHE => ['HASH' => \%check_cherry_pick_cache], + ; + + tie my %has_no_changes_cache => 'Memoize::Storable', + "$cache_path/has_no_changes.db", 'nstore'; + memoize 'has_no_changes', + SCALAR_CACHE => ['HASH' => \%has_no_changes_cache], + LIST_CACHE => 'FAULT', + ; + }; + + if (not eval { + $do_memoization->(); + 1; + }) { + my $err = $@ || "Zombie error"; # "Zombie error" to catch clobbered $@ in buggy destructors + die $err unless -d $cache_path; + print STDERR "Discarding cache and trying again ($@)\n"; + rmtree([$cache_path]); + $do_memoization->(); + } } sub unmemoize_svn_mergeinfo_functions { -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html