summaryrefslogtreecommitdiff
path: root/perl/Git/SVN/Fetcher.pm
diff options
context:
space:
mode:
authorLibravatar Kyle J. McKay <mackyle@gmail.com>2013-07-06 21:20:49 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2013-07-07 15:43:03 -0700
commit8ac251b66b952b0eddfa4e5bbf08a3c0ae7dbc0b (patch)
tree36a8a7da0a64efa6a5e610c2d62c0e1436ce7d65 /perl/Git/SVN/Fetcher.pm
parentGit.pm: add new temp_is_locked function (diff)
downloadtgif-8ac251b66b952b0eddfa4e5bbf08a3c0ae7dbc0b.tar.xz
git-svn: allow git-svn fetching to work using serf
When attempting to git-svn fetch files from an svn https?: url using the serf library (the only choice starting with svn 1.8) the following errors can occur: Temp file with moniker 'svn_delta' already in use at Git.pm line 1250 Temp file with moniker 'git_blob' already in use at Git.pm line 1250 David Rothenberger <daveroth@acm.org> has determined the cause to be that ra_serf does not drive the delta editor in a depth-first manner [...]. Instead, the calls come in this order: 1. open_root 2. open_directory 3. add_file 4. apply_textdelta 5. add_file 6. apply_textdelta When using the ra_serf access method, git-svn can end up needing to create several temp files before the first one is closed. This change causes a new temp file moniker to be generated if the one that would otherwise have been used is currently locked. Signed-off-by: Kyle J. McKay <mackyle@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'perl/Git/SVN/Fetcher.pm')
-rw-r--r--perl/Git/SVN/Fetcher.pm6
1 files changed, 4 insertions, 2 deletions
diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
index bd174189b9..10edb27732 100644
--- a/perl/Git/SVN/Fetcher.pm
+++ b/perl/Git/SVN/Fetcher.pm
@@ -315,11 +315,13 @@ sub change_file_prop {
sub apply_textdelta {
my ($self, $fb, $exp) = @_;
return undef if $self->is_path_ignored($fb->{path});
- my $fh = $::_repository->temp_acquire('svn_delta');
+ my $suffix = 0;
+ ++$suffix while $::_repository->temp_is_locked("svn_delta_${$}_$suffix");
+ my $fh = $::_repository->temp_acquire("svn_delta_${$}_$suffix");
# $fh gets auto-closed() by SVN::TxDelta::apply(),
# (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');
+ my $base = $::_repository->temp_acquire("git_blob_${$}_$suffix");
if ($fb->{blob}) {
my ($base_is_link, $size);