# -*- perl -*-
+# dgit
+# Debian::Dgit: functions common to dgit and its helpers and servers
+#
+# Copyright (C) 2015-2016 Ian Jackson
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
package Debian::Dgit;
$VERSION = 1.00;
@ISA = qw(Exporter);
@EXPORT = qw(setup_sigwarn
- debiantag server_branch server_ref
+ debiantags debiantag_old debiantag_new
+ server_branch server_ref
stat_exists link_ltarget
hashfile
fail ensuredir executable_on_path
- waitstatusmsg failedcmd
+ waitstatusmsg failedcmd_waitstatus
+ failedcmd_report_cmd failedcmd
cmdoutput cmdoutput_errok
git_rev_parse git_get_ref git_for_each_ref
git_for_each_tag_referring is_fast_fwd
printcmd(\*DEBUG,$debugprefix.$extraprefix,@_) if $debuglevel>0;
}
-sub debiantag ($$) {
+sub debiantag_old ($$) {
my ($v,$distro) = @_;
$v =~ y/~:/_%/;
return "$distro/$v";
}
+sub debiantag_new ($$) {
+ my ($v,$distro) = @_;
+ $v =~ y/~:/_%/;
+ return "archive/$distro/$v";
+}
+
+sub debiantags ($$) {
+ my ($version,$distro) = @_;
+ map { $_->($version, $distro) } (\&debiantag_new, \&debiantag_old);
+}
+
sub server_branch ($) { return "$branchprefix/$_[0]"; }
sub server_ref ($) { return "refs/".server_branch($_[0]); }
sub fail {
my $s = "@_\n";
+ $s =~ s/\n\n$/\n/;
my $prefix = _us().": ";
$s =~ s/^/$prefix/gm;
die $s;
}
}
+sub failedcmd_report_cmd {
+ my $intro = shift @_;
+ $intro //= "failed command";
+ { local ($!); printcmd \*STDERR, _us().": $intro:", @_ or die $!; };
+}
+
+sub failedcmd_waitstatus {
+ if ($? < 0) {
+ return "failed to fork/exec: $!";
+ } elsif ($?) {
+ return "subprocess ".waitstatusmsg();
+ } else {
+ return "subprocess produced invalid output";
+ }
+}
+
sub failedcmd {
# Expects $!,$? as set by close - see below.
# To use with system(), set $?=-1 first.
# success trashed $?==0 system
# program failed trashed $? >0 system
# syscall failure $! >0 unchanged system
- { local ($!); printcmd \*STDERR, _us().": failed command:", @_ or die $!; };
- if ($? < 0) {
- fail "failed to fork/exec: $!";
- } elsif ($?) {
- fail "subprocess ".waitstatusmsg();
- } else {
- fail "subprocess produced invalid output";
- }
+ failedcmd_report_cmd undef, @_;
+ fail failedcmd_waitstatus();
}
sub cmdoutput_errok {
# calls $func->($objid,$objtype,$fullrefname,$reftail);
# $reftail is RHS of ref after refs/[^/]+/
# breaks if $pattern matches any ref `refs/blah' where blah has no `/'
- my @cmd = (qw(git for-each-ref), $pattern);
+ # $pattern may be an array ref to mean multiple patterns
+ $pattern = [ $pattern ] unless ref $pattern;
+ my @cmd = (qw(git for-each-ref), @$pattern);
if (defined $gitdir) {
@cmd = ('sh','-ec','cd "$1"; shift; exec "$@"','x', $gitdir, @cmd);
}