use strict;
use warnings;
+use Carp;
use POSIX;
use IO::Handle;
use Config;
+use Digest::SHA;
+use Data::Dumper;
BEGIN {
use Exporter ();
$VERSION = 1.00;
@ISA = qw(Exporter);
@EXPORT = qw(setup_sigwarn
- debiantag server_branch server_ref
+ debiantag_old server_branch server_ref
stat_exists link_ltarget
+ hashfile
fail ensuredir executable_on_path
waitstatusmsg failedcmd
cmdoutput cmdoutput_errok
printcmd(\*DEBUG,$debugprefix.$extraprefix,@_) if $debuglevel>0;
}
-sub debiantag ($$) {
+sub debiantag_old ($$) {
my ($v,$distro) = @_;
$v =~ y/~:/_%/;
return "$distro/$v";
}
sub failedcmd {
+ # Expects $!,$? as set by close - see below.
+ # To use with system(), set $?=-1 first.
+ #
+ # Actual behaviour of perl operations:
+ # success $!==0 $?==0 close of piped open
+ # program failed $!==0 $? >0 close of piped open
+ # syscall failure $! >0 $?=-1 close of piped open
+ # failure $! >0 unchanged close of something else
+ # success trashed $?==0 system
+ # program failed trashed $? >0 system
+ # syscall failure $! >0 unchanged system
{ local ($!); printcmd \*STDERR, _us().": failed command:", @_ or die $!; };
- if ($!) {
+ if ($? < 0) {
fail "failed to fork/exec: $!";
} elsif ($?) {
fail "subprocess ".waitstatusmsg();
}
sub cmdoutput_errok {
- die Dumper(\@_)." ?" if grep { !defined } @_;
+ confess Dumper(\@_)." ?" if grep { !defined } @_;
debugcmd "|",@_;
open P, "-|", @_ or die "$_[0] $!";
my $d;
link $old, $new or die "link $old $new: $!";
}
+sub hashfile ($) {
+ my ($fn) = @_;
+ my $h = Digest::SHA->new(256);
+ $h->addfile($fn);
+ return $h->hexdigest();
+}
+
sub git_rev_parse ($) {
return cmdoutput qw(git rev-parse), "$_[0]~0";
}