Subject: | patches vs. 0.04 |
Attached are patches that help when content lengths are specified, but
they are 0. As of 0.04, they cause as_string() to generate blocks that
SVN::Dump isn't able to successfully re-parse.
Subject: | for-book.txt |
commit 67d3b78550e36582b50b7b419c9dae531d1ee24a
Author: Rocco Caputo <rcaputo@cpan.org>
Date: Sun Apr 4 01:59:13 2010 -0400
Be lenient about blank lines before headers.
diff --git a/lib/SVN/Dump/Reader.pm b/lib/SVN/Dump/Reader.pm
index bba02c8..d5a676d 100644
--- a/lib/SVN/Dump/Reader.pm
+++ b/lib/SVN/Dump/Reader.pm
@@ -35,6 +35,7 @@ sub read_record {
# first get the headers
my $headers = $fh->read_header_block();
+ return unless $headers;
$record->set_headers_block( $headers );
# get the property block
@@ -83,13 +84,28 @@ sub read_record {
sub read_header_block {
my ($fh) = @_;
+ my $in_headers = 0;
+
local $/ = $NL;
my $headers = SVN::Dump::Headers->new();
while(1) {
my $line = <$fh>;
- confess _eof() if !defined $line;
+
+ # EOF is unexpected if we're in headers. Fine if we're not.
+ unless (defined $line) {
+ confess _eof() if $in_headers;
+ last;
+ }
+
chop $line;
- last if $line eq ''; # stop on empty line
+
+ # Empty line ends headers. Discarded if before headers.
+ if ($line eq '') {
+ next unless $in_headers;
+ last;
+ }
+
+ $in_headers = 1;
my ($key, $value) = split /: /, $line, 2;
$headers->{$key} = $value;
diff --git a/t/dump/fail/h_empty.svn b/t/dump/fail/h_empty.svn
index 917557c..85529c7 100644
--- a/t/dump/fail/h_empty.svn
+++ b/t/dump/fail/h_empty.svn
@@ -1,2 +1,2 @@
read_header_block
-^Unexpected EOF line \d+
+^Empty line found instead of a header block line \d+
commit 5487c4b4ed40a2757771c8a5a51616e01cb7f7f5
Author: Rocco Caputo <rcaputo@cpan.org>
Date: Sun Apr 4 01:57:54 2010 -0400
Don't create text or property blocks if they don't exist in a dump.
diff --git a/lib/SVN/Dump/Reader.pm b/lib/SVN/Dump/Reader.pm
index f631b34..bba02c8 100644
--- a/lib/SVN/Dump/Reader.pm
+++ b/lib/SVN/Dump/Reader.pm
@@ -39,12 +39,18 @@ sub read_record {
# get the property block
$record->set_property_block( $fh->read_property_block() )
- if exists $headers->{'Prop-content-length'};
+ if (
+ exists $headers->{'Prop-content-length'} and
+ $headers->{'Prop-content-length'}
+ );
# get the text block
$record->set_text_block(
$fh->read_text_block( $headers->{'Text-content-length'} ) )
- if exists $headers->{'Text-content-length'};
+ if (
+ exists $headers->{'Text-content-length'} and
+ $headers->{'Text-content-length'}
+ );
# some safety checks
confess "Inconsistent record size"
commit 98dacab052a4dca52679dc92a2c25a29a317592d
Author: Rocco Caputo <rcaputo@cpan.org>
Date: Sat Apr 3 23:00:23 2010 -0400
Add vim directives so I don't mess up style. Confess rather than croak.
diff --git a/lib/SVN/Dump.pm b/lib/SVN/Dump.pm
index c8ace9d..dd50f02 100644
--- a/lib/SVN/Dump.pm
+++ b/lib/SVN/Dump.pm
@@ -1,8 +1,9 @@
package SVN::Dump;
+# vim: ts=4 sw=4 expandtab
use strict;
use warnings;
-use Carp;
+use Carp qw(croak);
use SVN::Dump::Reader;
diff --git a/lib/SVN/Dump/Headers.pm b/lib/SVN/Dump/Headers.pm
index c45745d..bc0832c 100644
--- a/lib/SVN/Dump/Headers.pm
+++ b/lib/SVN/Dump/Headers.pm
@@ -1,8 +1,9 @@
package SVN::Dump::Headers;
+# vim: ts=4 sw=4 expandtab
use strict;
use warnings;
-use Carp;
+use Carp qw(croak confess);
use Scalar::Util qw( reftype );
my $NL = "\012";
@@ -68,7 +69,7 @@ sub type {
: exists $self->{'Revision-number'} ? 'revision'
: exists $self->{'UUID'} ? 'uuid'
: exists $self->{'SVN-fs-dump-format-version'} ? 'format'
- : croak 'Unable to determine the record type';
+ : confess 'Unable to determine the record type';
return $type;
}
diff --git a/lib/SVN/Dump/Property.pm b/lib/SVN/Dump/Property.pm
index 54b2460..0bd3d94 100644
--- a/lib/SVN/Dump/Property.pm
+++ b/lib/SVN/Dump/Property.pm
@@ -1,4 +1,5 @@
package SVN::Dump::Property;
+# vim: ts=4 sw=4 expandtab
use strict;
use warnings;
diff --git a/lib/SVN/Dump/Reader.pm b/lib/SVN/Dump/Reader.pm
index 052437f..f631b34 100644
--- a/lib/SVN/Dump/Reader.pm
+++ b/lib/SVN/Dump/Reader.pm
@@ -1,9 +1,10 @@
package SVN::Dump::Reader;
+# vim: ts=4 sw=4 expandtab
use strict;
use warnings;
use IO::Handle;
-use Carp;
+use Carp qw(croak confess);
our @ISA = qw( IO::Handle );
@@ -46,7 +47,7 @@ sub read_record {
if exists $headers->{'Text-content-length'};
# some safety checks
- croak "Inconsistent record size"
+ confess "Inconsistent record size"
if ( $headers->{'Prop-content-length'} || 0 )
+ ( $headers->{'Text-content-length'} || 0 )
!= ( $headers->{'Content-length'} || 0 );
@@ -80,7 +81,7 @@ sub read_header_block {
my $headers = SVN::Dump::Headers->new();
while(1) {
my $line = <$fh>;
- croak _eof() if !defined $line;
+ confess _eof() if !defined $line;
chop $line;
last if $line eq ''; # stop on empty line
@@ -88,7 +89,7 @@ sub read_header_block {
$headers->{$key} = $value;
}
- croak "Empty line found instead of a header block line $."
+ confess "Empty line found instead of a header block line $."
if ! keys %$headers;
return $headers;
@@ -102,7 +103,7 @@ sub read_property_block {
my @buffer;
while(1) {
my $line = <$fh>;
- croak _eof() if !defined $line;
+ confess _eof() if !defined $line;
chop $line;
# read a key/value pair
@@ -112,7 +113,7 @@ sub read_property_block {
chop $key; # remove the last $NL
$line = <$fh>;
- croak _eof() if !defined $line;
+ confess _eof() if !defined $line;
chop $line;
if( $line =~ /\AV (\d+)\z/ ) {
@@ -125,7 +126,7 @@ sub read_property_block {
# FIXME what happens if we see duplicate keys?
}
else {
- croak "Corrupted property"; # FIXME better error message
+ confess "Corrupted property"; # FIXME better error message
}
}
# or a deleted key (only with fs-format-version >= 3)
@@ -143,7 +144,7 @@ sub read_property_block {
}
# inconsistent data
else {
- croak "Corrupted property"; # FIXME better error message
+ confess "Corrupted property"; # FIXME better error message
}
}
@@ -158,7 +159,7 @@ sub read_text_block {
my $text = '';
while( length($text) <= $size ) {
my $line = <$fh>;
- croak _eof() if ! defined $line;
+ confess _eof() if ! defined $line;
$text .= $line;
}
diff --git a/lib/SVN/Dump/Record.pm b/lib/SVN/Dump/Record.pm
index e8a2905..ecaf8ce 100644
--- a/lib/SVN/Dump/Record.pm
+++ b/lib/SVN/Dump/Record.pm
@@ -1,4 +1,5 @@
package SVN::Dump::Record;
+# vim: ts=4 sw=4 expandtab
use strict;
use warnings;
diff --git a/lib/SVN/Dump/Text.pm b/lib/SVN/Dump/Text.pm
index 030f1b1..c6d2435 100644
--- a/lib/SVN/Dump/Text.pm
+++ b/lib/SVN/Dump/Text.pm
@@ -1,4 +1,5 @@
package SVN::Dump::Text;
+# vim: ts=4 sw=4 expandtab
use strict;
use warnings;
commit cd4a14a1575f7f131609ea4aad55c9ae9e4ddfd6
Author: Rocco Caputo <rcaputo@cpan.org>
Date: Sat Apr 3 22:21:11 2010 -0400
Subversion dump format docs have moved.
diff --git a/README b/README
index d93231c..d7bd2ea 100644
--- a/README
+++ b/README
@@ -4,9 +4,8 @@ SVN::Dump
This module lets you manage SVN dumps with Perl.
The reference document for Subversion dumpfiles is at:
-http://svn.collab.net/viewvc/svn/trunk/notes/fs_dumprestore.txt?revision=HEAD
+http://svn.apache.org/repos/asf/subversion/trunk/notes/dump-load-format.txt
PLEASE NOTE THAT THIS CODE IS OF IN ALPHA QUALITY. I DO NOT MASTER YET
ALL THE CONCEPTS BEHIND THE SUBVERSION FILESYSTEM, BUT WILL EVENTUALLY LEARN.
THE INTERFACE IS SUBJECT TO CHANGE IN THE FUTURE.
-