undo: deal with checkout exception
The ancient decision to let undo perform the checkout by itself still makes sense from a UX perspective, but keeps requiring specific handling of edge cases. In this case, the easiest way to deal with trailing input is to just abort entirely. Also: updated lib/RevBank/Plugins.pm to import 'isa' and get up to 5.32 level.
This commit is contained in:
parent
3c622ab6d4
commit
6b04ecc256
2 changed files with 21 additions and 4 deletions
|
@ -62,8 +62,9 @@ sub load($class) {
|
||||||
RevBank::Eval::clean_eval(qq[
|
RevBank::Eval::clean_eval(qq[
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use feature qw(signatures state);
|
use v5.32;
|
||||||
no warnings 'experimental::signatures';
|
use experimental 'signatures';
|
||||||
|
use experimental 'isa';
|
||||||
package $package;
|
package $package;
|
||||||
BEGIN { RevBank::Global->import; }
|
BEGIN { RevBank::Global->import; }
|
||||||
our \@ISA = qw(RevBank::Plugin);
|
our \@ISA = qw(RevBank::Plugin);
|
||||||
|
|
20
plugins/undo
20
plugins/undo
|
@ -6,6 +6,11 @@ my $filename = ".revbank.undo";
|
||||||
|
|
||||||
my @TAB;
|
my @TAB;
|
||||||
|
|
||||||
|
{
|
||||||
|
package RevBank::Plugin::undo::RollBackUndo;
|
||||||
|
sub new($class) { return bless [], $class; }
|
||||||
|
}
|
||||||
|
|
||||||
sub command :Tab(undo) ($self, $cart, $command, @) {
|
sub command :Tab(undo) ($self, $cart, $command, @) {
|
||||||
$command eq 'undo' or return NEXT;
|
$command eq 'undo' or return NEXT;
|
||||||
|
|
||||||
|
@ -72,14 +77,25 @@ sub undo :Tab(&tab) ($self, $cart, $tid, @) {
|
||||||
|
|
||||||
eval { $cart->checkout('-undo') };
|
eval { $cart->checkout('-undo') };
|
||||||
|
|
||||||
if ($@ and $@ =~ "ROLLBACK_UNDO") {
|
if ($@ isa RevBank::Plugin::undo::RollbackUndo) {
|
||||||
# Undo the undo... :)
|
# Undo the undo... :)
|
||||||
spurt $filename, slurp $backup;
|
spurt $filename, slurp $backup;
|
||||||
|
|
||||||
# can't 'return ABORT' here; it would return from with_lock
|
# can't 'return ABORT' here; it would return from with_lock
|
||||||
$aborted = 1;
|
$aborted = 1;
|
||||||
|
} elsif ($@ isa RevBank::Cart::CheckoutProhibited) {
|
||||||
|
my $reason = $@->reason;
|
||||||
|
|
||||||
|
# Undo the undo... :)
|
||||||
|
spurt $filename, slurp $backup;
|
||||||
|
|
||||||
|
$aborted = 1;
|
||||||
|
warn "$reason\n";
|
||||||
|
} elsif ($@ and ref $@) {
|
||||||
|
# Re-throw exception object
|
||||||
|
die $@;
|
||||||
} elsif ($@) {
|
} elsif ($@) {
|
||||||
# Re-throw exception
|
# Re-throw exception string
|
||||||
die "(undo file BACKUP at $backup.)\n$@";
|
die "(undo file BACKUP at $backup.)\n$@";
|
||||||
} else {
|
} else {
|
||||||
unlink $backup;
|
unlink $backup;
|
||||||
|
|
Loading…
Add table
Reference in a new issue