| line | true | false | branch | 
 
| 54 | 0 | 32 | if 2 > @path | 
 
| 58 | 0 | 46 | unless $self->{'paths'}{$prev} | 
 
| 59 | 0 | 46 | unless $self->{'paths'}{$prev}{$next} | 
 
| 68 | 1 | 68 | unless open my $fh, '<:encoding(UTF-8)', $file | 
 
| 69 | 2 | 66 | unless -f $file | 
 
| 71 | 0 | 10 | unless close $fh | 
 
| 76 | 18 | 15 | if ({VERSION => 1}->{$op->{'op'}}) { } | 
 
|  | 14 | 1 | elsif ({before_upgrade => 1, upgrade => 1}->{$op->{'op'}}) { } | 
 
| 78 | 11 | 7 | if ($prev_version ne '') | 
 
| 93 | 2 | 9 | $restore ? : | 
 
| 112 | 1 | 13 | if $prev_version eq '' | 
 
| 120 | 2 | 11 | unless @op and {after_downgrade => 1, downgrade => 1}->{$op[0]{'op'}} || {RESTORE => 1}->{$op[0]{'op'}} | 
 
| 122 | 2 | 9 | if ({RESTORE => 1}->{$op2->{'op'}}) { } | 
 
| 147 | 0 | 7 | unless $self->{'on'}{$e} | 
 
| 161 | 16 | 1 | unless ($just_restored) | 
 
| 173 | 2 | 30 | if ($step->{'type'} eq 'RESTORE') | 
 
| 180 | 0 | 12 | unless (eval {
	do {
	my $just_restored = 0;
for (; 2 <= @path; shift @path) {
	my($prev, $next) = @path;
unless ($just_restored) {
	$self->_do({'type', 'BACKUP', 'version', $prev, 'prev_version', $prev, 'next_version', $next});
};
$just_restored = 0;
$from = $prev;
foreach my $step ($self->get_steps([$prev, $next])) {
	$self->_do($step);
if ($step->{'type'} eq 'RESTORE') {
	$just_restored = 1;
};
};
};
1
}
}) | 
 
| 182 | 0 | 0 | if ($from) | 
 
| 183 | 0 | 0 | unless eval {
	do {
	$self->_do({'type', 'RESTORE', 'version', $from, 'prev_version', $from, 'next_version', $path[-1]}, 1);
warn "Successfully undone interrupted migration by RESTORE $from\n";
1
}
} | 
 
| 202 | 21 | 8 | if $data eq '' | 
 
| 206 | 0 | 8 | unless close $fh | 
 
| 216 | 35 | 13 | if ($step->{'type'} eq 'BACKUP' or $step->{'type'} eq 'RESTORE' or $step->{'type'} eq 'VERSION') { } | 
 
| 221 | 7 | 6 | if ($cmd =~ /\A#!/ms) | 
 
| 223 | 0 | 7 | unless chmod 0700, $cmd | 
 
| 225 | 0 | 13 | unless system($cmd, @{$step->{'args'};}) == 0 | 
 
| 230 | 0 | 48 | unless (eval {
	do {
	if ($step->{'type'} eq 'BACKUP' or $step->{'type'} eq 'RESTORE' or $step->{'type'} eq 'VERSION') {
	$self->{'on'}{$step->{'type'}}($step);
}
else {
	my $cmd = $step->{'cmd'};
if ($cmd =~ /\A#!/ms) {
	$cmd = _data2arg($cmd);
croak("chmod($cmd): $!") unless chmod 0700, $cmd;
};
die "'$step->{'type'}' failed: $cmd @{$step->{'args'};}\n" unless system($cmd, @{$step->{'args'};}) == 0;
print "\n";
};
1
}
}) | 
 
| 231 | 0 | 0 | if $is_fatal | 
 
| 240 | 40 | 20 | length $near ? : | 
 
| 247 | 13 | 12 | if $p->{$to} | 
 
| 273 | 0 | 0 | unless system($ENV{'SHELL'} // '/bin/sh') == 0 | 
 
| 283 | 34 | 65 | if ($t->{'op'} =~ /\ADEFINE[24]?\z/ms) { } | 
 
|  | 33 | 32 | elsif ({VERSION => 1}->{$t->{'op'}}) { } | 
 
|  | 4 | 28 | elsif ({RESTORE => 1}->{$t->{'op'}}) { } | 
 
|  | 23 | 5 | elsif ({before_upgrade => 1, upgrade => 1}->{$t->{'op'}} or {after_downgrade => 1, downgrade => 1}->{$t->{'op'}}) { } | 
 
|  | 4 | 1 | elsif ($macro{$t->{'op'}}) { } | 
 
| 284 | 3 | 31 | if 1 != @{$t->{'args'};} | 
 
| 285 | 5 | 26 | unless $t->{'args'}[0] =~ /\A(?!#)\S+\z/ms | 
 
| 286 | 3 | 23 | if $t->{'data'} ne '' | 
 
| 288 | 3 | 20 | if {DEFINE => 1, DEFINE2 => 1, DEFINE4 => 1, RESTORE => 1, VERSION => 1, after_downgrade => 1, before_upgrade => 1, downgrade => 1, upgrade => 1}->{$name} | 
 
| 289 | 3 | 17 | if $macro{$name} | 
 
| 290 | 3 | 14 | if ($t->{'op'} eq 'DEFINE') { } | 
 
|  | 8 | 6 | elsif ($t->{'op'} eq 'DEFINE2') { } | 
 
|  | 6 | 0 | elsif ($t->{'op'} eq 'DEFINE4') { } | 
 
| 291 | 1 | 2 | if @tokens < 1 | 
 
| 293 | 1 | 1 | unless {before_upgrade => 1, upgrade => 1}->{$t1->{'op'}} or {after_downgrade => 1, downgrade => 1}->{$t1->{'op'}} | 
 
| 297 | 1 | 7 | if @tokens < 2 | 
 
| 300 | 1 | 6 | unless {before_upgrade => 1, upgrade => 1}->{$t1->{'op'}} | 
 
| 301 | 1 | 5 | unless {after_downgrade => 1, downgrade => 1}->{$t2->{'op'}} | 
 
| 305 | 1 | 5 | if @tokens < 4 | 
 
| 310 | 1 | 4 | if $t1->{'op'} ne 'before_upgrade' | 
 
| 311 | 1 | 3 | if $t2->{'op'} ne 'upgrade' | 
 
| 312 | 1 | 2 | if $t3->{'op'} ne 'downgrade' | 
 
| 313 | 1 | 1 | if $t4->{'op'} ne 'after_downgrade' | 
 
| 318 | 2 | 31 | if 1 != @{$t->{'args'};} | 
 
| 320 | 10 | 21 | if not $t->{'args'}[0] =~ /\A\S+\z/ms or $t->{'args'}[0] =~ m([\x00-\x1F\x7F /?*`"'\\])ms | 
 
| 321 | 1 | 20 | if $t->{'data'} ne '' | 
 
| 329 | 1 | 3 | if 0 != @{$t->{'args'};} | 
 
| 330 | 1 | 2 | if $t->{'data'} ne '' | 
 
| 338 | 4 | 5 | unless @{$t->{'args'};} or $t->{'data'} =~ /\S/ms | 
 
| 345 | 14 | 5 | @{$t->{'args'};} ? : | 
 
| 353 | 2 | 6 | $_->{'data'} =~ /\S/ms ? : | 
 
|  | 1 | 8 | @{$_->{'args'};} ? : | 
 
| 359 | 1 | 1 | $t->{'data'} =~ /\S/ms ? : | 
 
|  | 4 | 2 | @{$t->{'args'};} ? : | 
 
|  | 3 | 6 | @args ? : | 
 
| 361 | 1 | 8 | unless @args | 
 
| 378 | 0 | 8 | unless state $bin = (grep {-x "$_/bash";} split(/:/ms, $ENV{'PATH'}, 0))[0] | 
 
| 379 | 0 | 8 | $script =~ /\A#!/ms ? : | 
 
| 394 | 13 | 173 | if (/\A#/ms) { } | 
 
|  | 145 | 28 | elsif (/\A(\S+)\s*(.*)\z/ms) { } | 
 
|  | 25 | 3 | elsif (/\A(?:\r?\n|[ ][ ].*)\z/ms) { } | 
 
| 403 | 17 | 86 | if ($param =~ s/\A"(.*)"\z/$1/ms) | 
 
| 408 | 4 | 141 | if $args =~ /\G(.+)\z/cgms | 
 
| 417 | 22 | 3 | if (@tokens) { } | 
 
|  | 1 | 2 | elsif (/\S/ms) { } |