Update NEWS file the 0.7 release.
[cumulus.git] / contrib / restore.pl
index 0c7ee21..5562974 100755 (executable)
@@ -85,11 +85,16 @@ sub verifier_check {
 # necessary integrity checks (if a checksum is included), and return the object
 # data.
 sub load_ref {
-    # First, try to parse the object reference string into constituent pieces.
-    # The format is segment/object(checksum)[range].  Both the checksum and
-    # range are optional.
     my $ref_str = shift;
 
+    # Check for special objects before attempting general parsing.
+    if ($ref_str =~ m/^zero\[((\d+)\+)?(\d+)\]$/) {
+        return "\0" x ($3 + 0);
+    }
+
+    # Try to parse the object reference string into constituent pieces.  The
+    # format is segment/object(checksum)[range].  Both the checksum and range
+    # are optional.
     if ($ref_str !~ m/^([-0-9a-f]+)\/([0-9a-f]+)(\(\S+\))?(\[\S+\])?$/) {
         die "Malformed object reference: $ref_str";
     }
@@ -117,12 +122,17 @@ sub load_ref {
     # If a range was specified, then only a subset of the bytes of the object
     # are desired.  Extract just the desired bytes.
     if ($range) {
-        if ($range !~ m/^\[(\d+)\+(\d+)\]$/) {
+        if ($range !~ m/^\[((\d+)\+)?(\d+)\]$/) {
             die "Malformed object range: $range";
         }
 
         my $object_size = length $contents;
-        my ($start, $length) = ($1 + 0, $2 + 0);
+        my ($start, $length);
+        if (defined($1)) {
+            ($start, $length) = ($2 + 0, $3 + 0);
+        } else {
+            ($start, $length) = (0, $3 + 0);
+        }
         if ($start >= $object_size || $start + $length > $object_size) {
             die "Object range $range falls outside object bounds "
                 . "(actual size $object_size)";