diff options
author | Junio C Hamano <gitster@pobox.com> | 2015-03-06 14:57:55 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-03-06 14:57:55 -0800 |
commit | 2e7ca2745b7c08815fdbdccf9b410846e079b102 (patch) | |
tree | 927ef783d6e404f213ee5f8a2cdd74b562eb333a | |
parent | e1db59e179d7215476b7096f1fd74db43a4a2dae (diff) | |
parent | e426311befe429ad39b47927cd12153b7aa99542 (diff) | |
download | git-2e7ca2745b7c08815fdbdccf9b410846e079b102.tar.gz |
Merge branch 'ew/svn-maint-fixes' into maint
Correct a breakage to git-svn around v2.2 era that triggers
premature closing of FileHandle.
* ew/svn-maint-fixes:
Git::SVN::*: avoid premature FileHandle closure
git-svn: fix localtime=true on non-glibc environments
-rw-r--r-- | perl/Git/SVN.pm | 3 | ||||
-rw-r--r-- | perl/Git/SVN/Fetcher.pm | 8 | ||||
-rw-r--r-- | perl/Git/SVN/Ra.pm | 3 |
3 files changed, 13 insertions, 1 deletions
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index 8e4af7153e..f24372645b 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -14,6 +14,7 @@ use IPC::Open3; use Memoize; # core since 5.8.0, Jul 2002 use Memoize::Storable; use POSIX qw(:signal_h); +use Time::Local; use Git qw( command @@ -1332,7 +1333,7 @@ sub parse_svn_date { $ENV{TZ} = 'UTC'; my $epoch_in_UTC = - POSIX::strftime('%s', $S, $M, $H, $d, $m - 1, $Y - 1900); + Time::Local::timelocal($S, $M, $H, $d, $m - 1, $Y - 1900); # Determine our local timezone (including DST) at the # time of $epoch_in_UTC. $Git::SVN::Log::TZ stored the diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm index 10edb27732..613055a3f5 100644 --- a/perl/Git/SVN/Fetcher.pm +++ b/perl/Git/SVN/Fetcher.pm @@ -322,6 +322,14 @@ sub apply_textdelta { # (but $base does not,) so dup() it for reading in close_file open my $dup, '<&', $fh or croak $!; my $base = $::_repository->temp_acquire("git_blob_${$}_$suffix"); + # close_file may call temp_acquire on 'svn_hash', but because of the + # call chain, if the temp_acquire call from close_file ends up being the + # call that first creates the 'svn_hash' temp file, then the FileHandle + # that's created as a result will end up in an SVN::Pool that we clear + # in SVN::Ra::gs_fetch_loop_common. Avoid that by making sure the + # 'svn_hash' FileHandle is already created before close_file is called. + my $tmp_fh = $::_repository->temp_acquire('svn_hash'); + $::_repository->temp_release($tmp_fh, 1); if ($fb->{blob}) { my ($base_is_link, $size); diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm index 622535e217..32e2f19ea4 100644 --- a/perl/Git/SVN/Ra.pm +++ b/perl/Git/SVN/Ra.pm @@ -391,6 +391,9 @@ sub longest_common_path { sub gs_fetch_loop_common { my ($self, $base, $head, $gsv, $globs) = @_; return if ($base > $head); + # Make sure the cat_blob open2 FileHandle is created before calling + # SVN::Pool::new_default so that it does not incorrectly end up in the pool. + $::_repository->_open_cat_blob_if_needed; my $gpool = SVN::Pool->new_default; my $ra_url = $self->url; my $reload_ra = sub { |