X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=7eb05312d3114d3a97aec5705256c91e5d4a1518;hp=8c7f288a75597f8086d02ecb25a3be1a43416226;hb=02201fcb3e2f7e92ccf115811c3e909a490f0a80;hpb=0457c2d771ef6fe6c0883344add9dd4da0c60917 diff --git a/dgit b/dgit index 8c7f288a..7eb05312 100755 --- 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'; @@ -6199,31 +6203,38 @@ sub maybe_unapply_patches_again () { #----- other building ----- -our $clean_using_builder; -# ^ tree is to be cleaned by dpkg-source's builtin idea that it should -# clean the tree before building (perhaps invoked indirectly by -# whatever we are using to run the build), rather than separately -# and explicitly by us. +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 __ + "tree contains uncommitted files and --clean=check specified"; + } + } +} sub clean_tree () { - return if $clean_using_builder; - if ($cleanmode eq 'dpkg-source') { + # We always clean the tree ourselves, rather than leave it to the + # builder (dpkg-source, or soemthing which calls dpkg-source). + if ($cleanmode =~ m{^dpkg-source}) { + my @cmd = @dpkgbuildpackage; + push @cmd, qw(-d) if $cleanmode =~ m{^dpkg-source-d}; + push @cmd, qw(-T clean); maybe_apply_patches_dirtily(); - runcmd_ordryrun_local @dpkgbuildpackage, qw(-T clean); - } elsif ($cleanmode eq 'dpkg-source-d') { - maybe_apply_patches_dirtily(); - runcmd_ordryrun_local @dpkgbuildpackage, qw(-d -T clean); + runcmd_ordryrun_local @cmd; } elsif ($cleanmode eq 'git') { 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 ?"; @@ -6262,9 +6273,18 @@ sub build_prep_early () { sub build_prep ($) { my ($wantsrc) = @_; build_prep_early(); - # clean the tree if we're trying to include dirty changes in the - # source package, or we are running the builder in $maindir - clean_tree() if $includedirty || ($wantsrc & WANTSRC_BUILDER); + if (!building_source_in_playtree() || ($wantsrc & WANTSRC_BUILDER)) { + # Clean the tree because we're going to use the contents of + # $maindir. (We trying to include dirty changes in the source + # package, or we are running the builder in $maindir.) + clean_tree(); + } else { + # We don't actually need to do anything in $maindir, but we + # should do some kind of cleanliness check because (i) the + # user may have forgotten a `git add', and (ii) if the user + # said -wc we should still do the check. + clean_tree_check(); + } build_maybe_quilt_fixup(); if ($rmchanges) { my $pat = changespat $version; @@ -6535,9 +6555,7 @@ sub cmd_gbp_build { build_source(); midbuild_checkchanges_vanilla $wantsrc; } else { - if (!$clean_using_builder) { - push @cmd, '--git-cleaner=true'; - } + push @cmd, '--git-cleaner=true'; } maybe_unapply_patches_again(); if ($wantsrc & WANTSRC_BUILDER) { @@ -7248,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 ];