chiark / gitweb /
dgit: Provide new clean mode --clean=check,ignores
[dgit.git] / dgit
diff --git a/dgit b/dgit
index b4943a23d70118c7c177b737798e40b6622f6679..7eb05312d3114d3a97aec5705256c91e5d4a1518 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -101,7 +101,11 @@ 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)?|git|git-ff|check|none)};
+our $cleanmode_re = qr{(?: dpkg-source (?: -d )?
+                         | git | git-ff
+                         | check (?: ,ignores )?
+                         | none
+                         )}x;
 
 our $git_authline_re = '^([^<>]+) \<(\S+)\> (\d+ [-+]\d+)$';
 our $splitbraincache = 'dgit-intern/quilt-cache';
@@ -6200,7 +6204,20 @@ sub maybe_unapply_patches_again () {
 #----- other building -----
 
 sub clean_tree_check () {
-    # Not yet implemented.  The lack of this is part of #910705.
+    # 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 __
+ "tree contains uncommitted files and --clean=check specified";
+       }
+    }
 }
 
 sub clean_tree () {
@@ -6216,13 +6233,8 @@ sub clean_tree () {
        runcmd_ordryrun_local @git, qw(clean -xdf);
     } elsif ($cleanmode eq 'git-ff') {
        runcmd_ordryrun_local @git, qw(clean -xdff);
-    } elsif ($cleanmode eq 'check') {
-       my $leftovers = cmdoutput @git, qw(clean -xdn);
-       if (length $leftovers) {
-           print STDERR $leftovers, "\n" or confess $!;
-           fail __
- "tree contains uncommitted files and --clean=check specified";
-       }
+    } elsif ($cleanmode =~ m{^check}) {
+       clean_tree_check();
     } elsif ($cleanmode eq 'none') {
     } else {
        die "$cleanmode ?";
@@ -7254,6 +7266,9 @@ sub parseopts () {
                } elsif (s/^-wc$//s) {
                    push @ropts, $&;
                    $cleanmode = 'check';
+               } elsif (s/^-wci$//s) {
+                   push @ropts, $&;
+                   $cleanmode = 'check,ignores';
                } elsif (s/^-c([^=]*)\=(.*)$//s) {
                    push @git, '-c', $&;
                    $gitcfgs{cmdline}{$1} = [ $2 ];