chiark / gitweb /
dgit: Provide --clean=dpkg-source[-d],all-check aka -wda / -wdda
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 7eb05312d3114d3a97aec5705256c91e5d4a1518..e88af4e6c41b779997e5fbe6f29c2d24af856bdf 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -101,7 +101,7 @@ our %forceopts = map { $_=>0 }
 our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)");
 
 our $suite_re = '[-+.0-9a-z]+';
-our $cleanmode_re = qr{(?: dpkg-source (?: -d )?
+our $cleanmode_re = qr{(?: dpkg-source (?: -d )? (?: ,no-check | ,all-check )?
                          | git | git-ff
                          | check (?: ,ignores )?
                          | none
@@ -6203,20 +6203,41 @@ sub maybe_unapply_patches_again () {
 
 #----- other building -----
 
+sub clean_tree_check_git ($$) {
+    my ($honour_ignores, $message) = @_;
+    my @cmd = (@git, qw(clean -dn));
+    push @cmd, qw(-x) unless $honour_ignores;
+    my $leftovers = cmdoutput @cmd;
+    if (length $leftovers) {
+       print STDERR $leftovers, "\n" or confess $!;
+       fail $message;
+    }
+}
+
+sub clean_tree_check_git_wd ($) {
+    my ($message) = @_;
+    return if $cleanmode =~ m{no-check};
+    return if $patches_applied_dirtily; # yuk
+    clean_tree_check_git +($cleanmode !~ m{all-check}),
+                         (f_ <<END, $message);
+%s
+If this is just missing .gitignore entries, use a different clean
+mode, eg --clean=dpkg-source,no-check (-wdu/-wddu) to ignore them
+or --clean=git (-wg/-wgf) to use \`git clean' instead.
+END
+}
+
 sub clean_tree_check () {
     # Not yet fully implemented.
     # This function needs to not care about modified but tracked files.
     # That was done by check_not_dirty, and by now we may have run
     # the rules clean target which might modify tracked files (!)
     if ($cleanmode =~ m{^check}) {
-       my @cmd = (@git, qw(clean -dn));
-       push @cmd, qw(-x) unless $cleanmode =~ m{ignores};
-       my $leftovers = cmdoutput @cmd;
-       if (length $leftovers) {
-           print STDERR $leftovers, "\n" or confess $!;
-           fail __
+       clean_tree_check_git +($cleanmode =~ m{ignores}), __
  "tree contains uncommitted files and --clean=check specified";
-       }
+    } elsif ($cleanmode =~ m{^dpkg-source}) {
+       clean_tree_check_git_wd __
+ "tree contains uncommitted files (NB dgit didn't run rules clean)";
     }
 }
 
@@ -6229,6 +6250,8 @@ sub clean_tree () {
        push @cmd, qw(-T clean);
        maybe_apply_patches_dirtily();
        runcmd_ordryrun_local @cmd;
+       clean_tree_check_git_wd __
+ "tree contains uncommitted files (after running rules clean)";
     } elsif ($cleanmode eq 'git') {
        runcmd_ordryrun_local @git, qw(clean -xdf);
     } elsif ($cleanmode eq 'git-ff') {
@@ -7257,12 +7280,12 @@ sub parseopts () {
                } elsif (s/^-wgf$//s) {
                    push @ropts, $&;
                    $cleanmode = 'git-ff';
-               } elsif (s/^-wd$//s) {
+               } elsif (s/^-wd(d?)([na]?)$//s) {
                    push @ropts, $&;
                    $cleanmode = 'dpkg-source';
-               } elsif (s/^-wdd$//s) {
-                   push @ropts, $&;
-                   $cleanmode = 'dpkg-source-d';
+                   $cleanmode .= '-d' if $1;
+                   $cleanmode .= ',no-check' if $2 eq 'n';
+                   $cleanmode .= ',all-check' if $2 eq 'a';
                } elsif (s/^-wc$//s) {
                    push @ropts, $&;
                    $cleanmode = 'check';