[packages/git-core] fix git-svn fetching from svn servers that use serf library
draenog
draenog at pld-linux.org
Fri Jul 12 17:08:24 CEST 2013
commit c64c444d192ab30d81f79b34cb230bc67c185295
Author: Kacper Kornet <draenog at pld-linux.org>
Date: Fri Jul 12 15:54:29 2013 +0100
fix git-svn fetching from svn servers that use serf library
git-core-svn-serf.patch | 135 ++++++++++++++++++++++++++++++++++++++++++++++++
git-core.spec | 4 +-
2 files changed, 138 insertions(+), 1 deletion(-)
---
diff --git a/git-core.spec b/git-core.spec
index 5ff1d8f..c682008 100644
--- a/git-core.spec
+++ b/git-core.spec
@@ -11,7 +11,7 @@ Summary: Distributed version control system focused on speed, effectivity and us
Summary(pl.UTF-8): Rozproszony system śledzenia treści skupiony na szybkości, wydajności i użyteczności
Name: git-core
Version: 1.8.3.2
-Release: 1
+Release: 2
License: GPL v2
Group: Development/Tools
Source0: http://git-core.googlecode.com/files/git-%{version}.tar.gz
@@ -27,6 +27,7 @@ Patch0: %{name}-tests.patch
Patch1: %{name}-key-bindings.patch
Patch2: %{name}-sysconfdir.patch
Patch3: cherry-picked-commitlog.patch
+Patch4: %{name}-svn-serf.patch
URL: http://git-scm.com/
BuildRequires: autoconf >= 2.59
BuildRequires: automake
@@ -386,6 +387,7 @@ Ta wtyczka dostarcza podświetlanie składni dla treści commitów gita.
%patch1 -p0
%patch2 -p1
%patch3 -p1
+%patch4 -p1
%build
%{__aclocal}
diff --git a/git-core-svn-serf.patch b/git-core-svn-serf.patch
new file mode 100644
index 0000000..ca4fa41
--- /dev/null
+++ b/git-core-svn-serf.patch
@@ -0,0 +1,135 @@
+From 4e63dcc86cc77ec86a8d35ff752603a4b44d44a7 Mon Sep 17 00:00:00 2001
+From: "Kyle J. McKay" <mackyle at gmail.com>
+Date: Sat, 6 Jul 2013 21:20:48 -0700
+Subject: [PATCH 1/2] Git.pm: add new temp_is_locked function
+
+The temp_is_locked function can be used to determine whether
+or not a given name previously passed to temp_acquire is
+currently locked.
+
+Signed-off-by: Kyle J. McKay <mackyle at gmail.com>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+---
+ perl/Git.pm | 33 +++++++++++++++++++++++++++++++--
+ 1 file changed, 31 insertions(+), 2 deletions(-)
+
+diff --git a/perl/Git.pm b/perl/Git.pm
+index 7a252ef..0ba15b9 100644
+--- a/perl/Git.pm
++++ b/perl/Git.pm
+@@ -61,7 +61,7 @@ require Exporter;
+ remote_refs prompt
+ get_tz_offset
+ credential credential_read credential_write
+- temp_acquire temp_release temp_reset temp_path);
++ temp_acquire temp_is_locked temp_release temp_reset temp_path);
+
+
+ =head1 DESCRIPTION
+@@ -1206,6 +1206,35 @@ sub temp_acquire {
+ $temp_fd;
+ }
+
++=item temp_is_locked ( NAME )
++
++Returns true if the internal lock created by a previous C<temp_acquire()>
++call with C<NAME> is still in effect.
++
++When temp_acquire is called on a C<NAME>, it internally locks the temporary
++file mapped to C<NAME>. That lock will not be released until C<temp_release()>
++is called with either the original C<NAME> or the L<File::Handle> that was
++returned from the original call to temp_acquire.
++
++Subsequent attempts to call C<temp_acquire()> with the same C<NAME> will fail
++unless there has been an intervening C<temp_release()> call for that C<NAME>
++(or its corresponding L<File::Handle> that was returned by the original
++C<temp_acquire()> call).
++
++If true is returned by C<temp_is_locked()> for a C<NAME>, an attempt to
++C<temp_acquire()> the same C<NAME> will cause an error unless
++C<temp_release> is first called on that C<NAME> (or its corresponding
++L<File::Handle> that was returned by the original C<temp_acquire()> call).
++
++=cut
++
++sub temp_is_locked {
++ my ($self, $name) = _maybe_self(@_);
++ my $temp_fd = \$TEMP_FILEMAP{$name};
++
++ defined $$temp_fd && $$temp_fd->opened && $TEMP_FILES{$$temp_fd}{locked};
++}
++
+ =item temp_release ( NAME )
+
+ =item temp_release ( FILEHANDLE )
+@@ -1248,7 +1277,7 @@ sub _temp_cache {
+
+ my $temp_fd = \$TEMP_FILEMAP{$name};
+ if (defined $$temp_fd and $$temp_fd->opened) {
+- if ($TEMP_FILES{$$temp_fd}{locked}) {
++ if (temp_is_locked($name)) {
+ throw Error::Simple("Temp file with moniker '" .
+ $name . "' already in use");
+ }
+--
+1.8.3.2
+
+
+From 8ac251b66b952b0eddfa4e5bbf08a3c0ae7dbc0b Mon Sep 17 00:00:00 2001
+From: "Kyle J. McKay" <mackyle at gmail.com>
+Date: Sat, 6 Jul 2013 21:20:49 -0700
+Subject: [PATCH 2/2] 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 at 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 at gmail.com>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+---
+ perl/Git/SVN/Fetcher.pm | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
+index bd17418..10edb27 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);
+--
+1.8.3.2
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/git-core.git/commitdiff/c64c444d192ab30d81f79b34cb230bc67c185295
More information about the pld-cvs-commit
mailing list