From 87aeee89afd99df4c3d15ba53e18ecf66deb96dd Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 18 Oct 2007 13:58:44 -0400 Subject: [PATCH] * Signal handling for commands run by mr, including handling of SIGINT to stop mr. --- debian/changelog | 4 ++- mr | 64 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/debian/changelog b/debian/changelog index 17eea27..8b8fdcc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,8 +2,10 @@ mr (0.4) UNRELEASED; urgency=low * Fix mr register to work when -c is specified using a relative path and is used to register a sibdirectory. + * Signal handling for commands run by mr, including handling of SIGINT + to stop mr. - -- Joey Hess Thu, 18 Oct 2007 13:32:21 -0400 + -- Joey Hess Thu, 18 Oct 2007 13:57:41 -0400 mr (0.3) unstable; urgency=low diff --git a/mr b/mr index e735b67..d4c3b25 100755 --- a/mr +++ b/mr @@ -250,6 +250,11 @@ use strict; use Getopt::Long; use Cwd qw(getcwd abs_path); +$SIG{INT}=sub { + print STDERR "mr: interrupted\n"; + exit 2; +}; + $ENV{MR_CONFIG}="$ENV{HOME}/.mrconfig"; my $directory=getcwd(); my $verbose=0; @@ -398,10 +403,19 @@ sub action { #{{{ my $test="set -e;".$lib.$config{$topdir}{$subdir}{deleted}; print "mr $action: running deleted test >>$test<<\n" if $verbose; my $ret=system($test); - if ($ret >> 8 == 0) { - print STDERR "mr error: $dir should be deleted yet still exists\n\n"; - push @failed, $dir; - return; + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: deleted test received signal ".($? & 127)."\n"; + } + if ($ret >> 8 == 0) { + print STDERR "mr error: $dir should be deleted yet still exists\n\n"; + push @failed, $dir; + return; + } } } } @@ -427,10 +441,20 @@ sub action { #{{{ "my_action(){ $config{$topdir}{$subdir}{skip}\n }; my_action '$action'"; print "mr $action: running skip test >>$test<<\n" if $verbose; my $ret=system($test); - if ($ret >> 8 == 0) { - print "mr $action: $dir skipped per config file\n" if $verbose; - push @skipped, $dir; - return; + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: skip test received signal ".($? & 127)."\n"; + exit 1; + } + if ($ret >> 8 == 0) { + print "mr $action: $dir skipped per config file\n" if $verbose; + push @skipped, $dir; + return; + } } } @@ -455,6 +479,13 @@ sub action { #{{{ print STDERR "mr $action: running >>$command<<\n" if $verbose; my $ret=system($command); if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: received signal ".($? & 127)."\n"; + } print STDERR "mr $action: failed ($ret)\n" if $verbose; push @failed, $dir; if ($ret >> 8 != 0) { @@ -601,9 +632,20 @@ sub loadconfig { #{{{ $knownactions{$parameter}=1; if ($parameter eq 'chain' && length $dir && $section ne "DEFAULT" && - -e $dir.$section."/.mrconfig" && - system($value) >> 8 == 0) { - push @toload, $dir.$section."/.mrconfig"; + -e $dir.$section."/.mrconfig") { + my $ret=system($value); + if ($ret != 0) { + if (($? & 127) == 2) { + print STDERR "mr $action: chain test interrupted\n"; + exit 2; + } + elsif ($? & 127) { + print STDERR "mr $action: chain test received signal ".($? & 127)."\n"; + } + } + else { + push @toload, $dir.$section."/.mrconfig"; + } } } } -- 2.39.5