Merge branch 'ew/svn-maint-fixes' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 6 Mar 2015 22:57:55 +0000 (14:57 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Mar 2015 22:57:55 +0000 (14:57 -0800)
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

perl/Git/SVN.pm
perl/Git/SVN/Fetcher.pm
perl/Git/SVN/Ra.pm
index 8e4af7153eb8a8957bd4172e0c044c1bfc748ddb..f24372645b40f81faf75e735e402a1f4c400b2ed 100644 (file)
@@ -14,6 +14,7 @@ package Git::SVN;
 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
index 10edb27732f439e5290a7b354efefeb10d219669..613055a3f5f794d02644e32dbaf91f907836b396 100644 (file)
@@ -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);
index 622535e21760f9fd5c6b63f97d41b48be9c04db6..32e2f19ea41b2dfed735cf1fa5e1fa49f3fed915 100644 (file)
@@ -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 {