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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html