Merge branch 'svn-maint-fixes' into svn-fixes
authorJunio C Hamano <gitster@pobox.com>
Thu, 26 Feb 2015 22:03:57 +0000 (14:03 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 Feb 2015 22:03:57 +0000 (14:03 -0800)
* 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 afa562c8b9f8129e76b2cd7c9568ba1b3dfa06df..152fb7e9274c779cb66de099878b4de40e5406e4 100644 (file)
@@ -12,6 +12,7 @@ package Git::SVN;
 use IPC::Open3;
 use Memoize;  # core since 5.8.0, Jul 2002
 use POSIX qw(:signal_h);
+use Time::Local;
 
 use Git qw(
     command
@@ -1326,7 +1327,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 6b9c6e01386fee3756298fcb4d580a478158302f..d8c21ad91549b4e52ce95c5e694db2f53f9931c9 100644 (file)
@@ -321,6 +321,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 cf36b9d3cdde67f03f147d596f8f277ea11ba302..4a499fcb38daf4ab8d3e20ca0fa10e5732e684a9 100644 (file)
@@ -394,6 +394,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 {