Index: lib/Brackup/Restore.pm =================================================================== --- lib/Brackup/Restore.pm (revision 310) +++ lib/Brackup/Restore.pm (working copy) @@ -18,6 +18,7 @@ $self->{filename}= delete $opts{file}; # filename we're restoring from $self->{config} = delete $opts{config}; # brackup config (if available) $self->{verbose} = delete $opts{verbose}; + $self->{onerror} = delete $opts{onerror}; $self->{prefix} =~ s/\/$// if $self->{prefix}; @@ -128,7 +129,7 @@ $self->_restore_link ($full, $it) if $type eq "l"; $self->_restore_directory($full, $it) if $type eq "d"; $self->_restore_fifo ($full, $it) if $type eq "p"; - $self->_restore_file ($full, $it) if $type eq "f"; + $self->_restore_file ($full, $it, $self->{onerror}) if $type eq "f"; } # clear chunk cached by _restore_file @@ -211,7 +212,7 @@ } sub _restore_file { - my ($self, $full, $it) = @_; + my ($self, $full, $it, $onerror) = @_; if (-e $full && -s $full) { # TODO: add --conflict={skip,overwrite} option, defaulting to nothing: which dies @@ -276,9 +277,13 @@ $sha1->addfile($readfh); my $actual_dig = $sha1->hexdigest; - # TODO: support --onerror={continue,prompt}, etc, but for now we just die + # TODO: support --onerror={prompt} unless ($actual_dig eq $good_dig || $full =~ m!\.brackup-digest\.db\b!) { - die "Digest of restored file ($full) doesn't match"; + if ($onerror eq "continue") { + warn "Digest of restored file ($full) doesn't match"; + } else { + die "Digest of restored file ($full) doesn't match"; + } } } Index: lib/Brackup/Mount.pm =================================================================== --- lib/Brackup/Mount.pm (revision 310) +++ lib/Brackup/Mount.pm (working copy) @@ -109,7 +109,7 @@ _target => $target, _meta => $header, }, 'Brackup::Restore'; - Brackup::Restore::_restore_file($fake_object, $fn, $record->{meta}); + Brackup::Restore::_restore_file($fake_object, $fn, $record->{meta}, "fail"); my $fh = IO::File->new($fn, '<'); $record->{fh} = $fh; Index: brackup-restore =================================================================== --- brackup-restore (revision 310) +++ brackup-restore (working copy) @@ -50,6 +50,10 @@ Show more info during restore. +=item --onerror=continue + +Continue after an error. + =back =head1 WARRANTY @@ -79,12 +83,13 @@ use Brackup; use Brackup::Util qw(tempfile); -my ($opt_verbose, $meta_file, $opt_help, $restore_dir, $opt_all, $prefix, $config_file); +my ($opt_verbose, $opt_onerror, $meta_file, $opt_help, $restore_dir, $opt_all, $prefix, $config_file); usage() unless GetOptions( 'from=s' => \$meta_file, 'to=s' => \$restore_dir, + 'onerror=s' => \$opt_onerror, 'verbose' => \$opt_verbose, 'help' => \$opt_help, 'all' => \$opt_all, @@ -118,6 +123,7 @@ file => $meta_file, config => $config, verbose => $opt_verbose, + onerror => $opt_onerror, ); if (eval { $restore->restore }){ @@ -136,6 +142,6 @@ $why =~ s/\s+$//; $why = "Error: $why\n\n"; } - die "${why}brackup-restore [-v] --from=[metafile.brackup] --to=[restore_dir] <--all|--just=[what]>\nbrackup-restore --help\n"; + die "${why}brackup-restore [-v] [--onerror=continue]--from=[metafile.brackup] --to=[restore_dir] <--all|--just=[what]>\nbrackup-restore --help\n"; }