chiark / gitweb /
Version tags mangling: Protect dots, as per proposed update to DEP-14.
[dgit.git] / Debian / Dgit.pm
index 6854a7cffd74dff3ae7a7d236d41cb5c42fc4088..1bac97bde55d02a5cc00e0ba388348f7f8537012 100644 (file)
@@ -36,12 +36,14 @@ BEGIN {
     $VERSION     = 1.00;
     @ISA         = qw(Exporter);
     @EXPORT      = qw(setup_sigwarn
+                     dep14_version_mangle
                       debiantags debiantag_old debiantag_new
                      server_branch server_ref
                       stat_exists link_ltarget
                      hashfile
                       fail ensuredir executable_on_path
-                      waitstatusmsg failedcmd_report_cmd 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
@@ -143,16 +145,22 @@ sub debugcmd {
     printcmd(\*DEBUG,$debugprefix.$extraprefix,@_) if $debuglevel>0;
 }
 
+sub dep14_version_mangle ($) {
+    my ($v) = @_;
+    # DEP-14 patch proposed 2016-11-09  "Version Mangling"
+    $v =~ y/~:/_%/;
+    $v =~ s/\.(?=\.|$|lock$)/.#/g;
+    return $v;
+}
+
 sub debiantag_old ($$) { 
     my ($v,$distro) = @_;
-    $v =~ y/~:/_%/;
-    return "$distro/$v";
+    return "$distro/". dep14_version_mangle $v;
 }
 
 sub debiantag_new ($$) { 
     my ($v,$distro) = @_;
-    $v =~ y/~:/_%/;
-    return "archive/$distro/$v";
+    return "archive/$distro/".dep14_version_mangle $v;
 }
 
 sub debiantags ($$) {
@@ -223,6 +231,16 @@ sub failedcmd_report_cmd {
     { 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.
@@ -236,13 +254,7 @@ sub failedcmd {
     #   program failed       trashed     $? >0       system
     #   syscall failure      $! >0       unchanged   system
     failedcmd_report_cmd undef, @_;
-    if ($? < 0) {
-       fail "failed to fork/exec: $!";
-    } elsif ($?) {
-       fail "subprocess ".waitstatusmsg();
-    } else {
-       fail "subprocess produced invalid output";
-    }
+    fail failedcmd_waitstatus();
 }
 
 sub cmdoutput_errok {