Skip to content

Commit

Permalink
Merge branch 'ew/svn-maint-fixes' into maint
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Mar 6, 2015
2 parents e1db59e + e426311 commit 2e7ca27
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 1 deletion.
3 changes: 2 additions & 1 deletion perl/Git/SVN.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions perl/Git/SVN/Fetcher.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions perl/Git/SVN/Ra.pm
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down

0 comments on commit 2e7ca27

Please sign in to comment.