[packages/git-core] fix for git-svn fetching from svn servers that use serf library

draenog draenog at pld-linux.org
Fri Jul 12 16:57:01 CEST 2013


commit e163539a5154b6efccf80d11826c82463933e140
Author: Kacper Kornet <draenog at pld-linux.org>
Date:   Fri Jul 12 15:54:29 2013 +0100

    fix for git-svn fetching from svn servers that use serf library

 git-core-svn-serf.patch | 135 ++++++++++++++++++++++++++++++++++++++++++++++++
 git-core.spec           |   6 ++-
 2 files changed, 139 insertions(+), 2 deletions(-)
---
diff --git a/git-core.spec b/git-core.spec
index 5ff1d8f..f5efc09 100644
--- a/git-core.spec
+++ b/git-core.spec
@@ -11,10 +11,10 @@ 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
+Source0:	http://git-core.googlecode.com/files/git-%{version}.tar.gz;ala
 # Source0-md5:	83b792fd06066c77e1d4911ebba2d701
 Source1:	%{name}-gitweb.conf
 Source2:	%{name}-gitweb-apache.conf
@@ -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/e163539a5154b6efccf80d11826c82463933e140



More information about the pld-cvs-commit mailing list