Make git-svn works with crlf (or any other) file content convertion enabled.
When we modify file content SVN cant apply its delta to it. To fix this
situation I take full file content from SVN as next revision. This is
dump and slow but it works.
---
git-svn.perl | 34 +++++++++++++++++++---------------
1 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index cf6dbbc..606a177 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -28,6 +28,7 @@ sub fatal (@) { print STDERR "@_\n"; exit 1 }
require SVN::Core; # use()-ing this causes segfaults for me... *shrug*
require SVN::Ra;
require SVN::Delta;
+require SVN::Client;
if ($SVN::Core::VERSION lt '1.1.0') {
fatal "Need SVN::Core 1.1.0 or better (got $SVN::Core::VERSION)";
}
@@ -3075,6 +3076,7 @@ sub new {
my $self = SVN::Delta::Editor->new;
bless $self, $class;
$self->{c} = $git_svn->{last_commit} if exists $git_svn->{last_commit};
+ $self->{url} = $git_svn->{url};
$self->{empty} = {};
$self->{dir_prop} = {};
$self->{file_prop} = {};
@@ -3214,30 +3216,32 @@ sub change_file_prop {
sub apply_textdelta {
my ($self, $fb, $exp) = @_;
- my $fh = IO::File->new_tmpfile;
- $fh->autoflush(1);
- # $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 = IO::File->new_tmpfile;
$base->autoflush(1);
if ($fb->{blob}) {
print $base 'link ' if ($fb->{mode_a} == 120000);
my $size = $::_repository->cat_blob($fb->{blob}, $base);
die "Failed to read object $fb->{blob}" if ($size < 0);
-
- if (defined $exp) {
- seek $base, 0, 0 or croak $!;
- my $got = ::md5sum($base);
- die "Checksum mismatch: $fb->{path} $fb->{blob}\n",
- "expected: $exp\n",
- " got: $got\n" if ($got ne $exp);
- }
}
seek $base, 0, 0 or croak $!;
- $fb->{fh} = $dup;
+
+ my $fh = IO::File->new_tmpfile;
+ $fh->autoflush(1);
+
+ $fb->{fh} = $fh;
$fb->{base} = $base;
- [ SVN::TxDelta::apply($base, $fh, undef, $fb->{path}, $fb->{pool}) ];
+
+ my $url = $self->{url};
+ $url =~ s/\/$//;
+ $url .= '/';
+ $url .= $fb->{path};
+
+ my $rev = $self->{file_prop}->{$fb->{path}}->{'svn:entry:committed-rev'};
+ die ("Can't find $fb->{path} revision") unless defined $rev;
+
+ my $ctx = SVN::Client->new();
+ $ctx->cat($fh, $url, $rev);
}
sub close_file {
--
1.5.6.2
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html