chiark / gitweb /
git-debrebase: Properly reject bare dgit dsc imports
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 4 Aug 2018 09:35:58 +0000 (10:35 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 4 Aug 2018 09:43:29 +0000 (10:43 +0100)
A bare dgit dsc import is not a legal gdr branch, because the main
merge contains debian/patches/.  So it cannot be processed without
conversion.

Previously an attempt to launder such a branch would crash with a
stack trace, although keycommits would falsely claim it was OK

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
debian/changelog
git-debrebase

index 491e80f475c295b79557a2d5e04d2129f7cbe7f8..664a3d1fbef53d6f7e1d9286a05cdf8b18d21816 100644 (file)
@@ -5,6 +5,7 @@ dgit (6.5~) unstable; urgency=medium
   * dgit: Rename --dgit-view-save to --save-dgit-view, leaving an alias.
   * dgit: Provide print-unapplied-treeish subcommand.
   * dgit: Improve error message for unknown suite, to suggest -d.
+  * git-debrebase: Properly reject bare dgit dsc imports
 
  --
 
index 13c320e888e982568cf00a265e44f85047f558b6..a2a14ca654eaaef818a7081f773d4eac5ba10ed1 100755 (executable)
@@ -595,6 +595,7 @@ sub keycommits ($;$$$$) {
     my ($anchor, $breakwater);
     my $clogonly;
     my $cl;
+    my $found_pm;
     $fatal //= sub { fail $_[1]; };
     my $x = sub {
        my ($cb, $tagsfx, $mainwhy, $xwhy) = @_;
@@ -634,12 +635,20 @@ sub keycommits ($;$$$$) {
            $breakwater = undef;
        } elsif ($ty eq 'Pseudomerge' or
                 $ty eq 'AddPatches') {
+           my $found_pm = 1;
            $x->($furniture, (lc $ty),
                 "found interchange bureaucracy commit ($ty)"," ($head)");
        } elsif ($ty eq 'DgitImportUnpatched') {
-           $x->($trouble, 'dgitimport',
-                "found dgit dsc import ($head)");
-           return (undef,undef);
+           if ($found_pm) {
+               $x->($trouble, 'dgitimport',
+                    "found dgit dsc import"," ($head)");
+               return (undef,undef);
+           } else {
+               $x->($fatal, 'unprocessable',
+                    "found bare dgit dsc import with no prior history",
+                    " ($head)");
+               return (undef,undef);
+           }
        } else {
            $x->($fatal, 'unprocessable',
                 "found unprocessable commit, cannot cope: $cl->{Why}",
@@ -814,13 +823,12 @@ sub walk ($;$$) {
                next;
            } else {
                # Everything is from this import.  This kind of import
-               # is already in valid breakwater format, with the
-               # patches as commits.
-               printf $report " NoPM" if $report;
-               # last thing we processed will have been the first patch,
-               # if there is one; which is fine, so no need to rewrite
-               # on account of this import
-               $build_start->("ImportOrigin", $cur);
+               # is already nearly in valid breakwater format, with the
+               # patches as commits.  Unfortunately it contains
+               # debian/patches/.
+               printdebug "*** WALK BOMB bare dgit import\n";
+               $cl->{Why} = "bare dgit dsc import";
+               return $bomb->();
            }
            die "$ty ?";
         } else {