chiark / gitweb /
dgit: generate_commits_from_dsc: Move up $upstreamv
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 1090984aece5bd9bb2053af8e79f523ac2ccee5c..5684ba9a6e86b7df84e598107efcc665ee698d34 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -102,7 +102,7 @@ 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 )? (?: ,no-check | ,all-check )?
-                         | git | git-ff
+                     | (?: git | git-ff ) (?: ,always )?
                          | check (?: ,ignores )?
                          | none
                          )}x;
@@ -2209,11 +2209,14 @@ sub generate_commits_from_dsc () {
     prep_ud();
     changedir $playground;
 
+    my $bpd_abs = bpd_abs();
+    my $upstreamv = upstreamversion $dsc->{version};
     my @dfi = dsc_files_info();
+
     foreach my $fi (@dfi) {
        my $f = $fi->{Filename};
        die "$f ?" if $f =~ m#/|^\.|\.dsc$|\.tmp$#;
-       my $upper_f = (bpd_abs()."/$f");
+       my $upper_f = "$bpd_abs/$f";
 
        printdebug "considering reusing $f: ";
 
@@ -2260,7 +2263,6 @@ sub generate_commits_from_dsc () {
     # from the debian/changelog, so we record the tree objects now and
     # make them into commits later.
     my @tartrees;
-    my $upstreamv = upstreamversion $dsc->{version};
     my $orig_f_base = srcfn $upstreamv, '';
 
     foreach my $fi (@dfi) {
@@ -6213,13 +6215,14 @@ sub maybe_unapply_patches_again () {
 
 #----- other building -----
 
-sub clean_tree_check_git ($$) {
-    my ($honour_ignores, $message) = @_;
+sub clean_tree_check_git ($$$) {
+    my ($honour_ignores, $message, $ignmessage) = @_;
     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 $!;
+       $message .= $ignmessage if $honour_ignores;
        fail $message;
     }
 }
@@ -6229,8 +6232,7 @@ sub clean_tree_check_git_wd ($) {
     return if $cleanmode =~ m{no-check};
     return if $patches_applied_dirtily; # yuk
     clean_tree_check_git +($cleanmode !~ m{all-check}),
-                         (f_ <<END, $message);
-%s
+       $message, "\n".__ <<END;
 If this is just missing .gitignore entries, use a different clean
 mode, eg --clean=dpkg-source,no-check (-wdn/-wddn) to ignore them
 or --clean=git (-wg/-wgf) to use \`git clean' instead.
@@ -6238,20 +6240,19 @@ 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}) {
        clean_tree_check_git +($cleanmode =~ m{ignores}), __
- "tree contains uncommitted files and --clean=check specified";
+ "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)";
     } elsif ($cleanmode =~ m{^git}) {
-       # If we were actually cleaning these files would be summarily
-       # deleted.  Since we're not, and not using the working tree
-       # anyway, we can just ignore them - nothing will use them.
+       clean_tree_check_git 1, __
+ "tree contains uncommited, untracked, unignored files\n".
+ "You can use --clean=git[-ff],always (-wga/-wgfa) to delete them.", '';
     } elsif ($cleanmode eq 'none') {
     } else {
        confess "$cleanmode ?";
@@ -6269,9 +6270,9 @@ sub clean_tree () {
        runcmd_ordryrun_local @cmd;
        clean_tree_check_git_wd __
  "tree contains uncommitted files (after running rules clean)";
-    } elsif ($cleanmode eq 'git') {
+    } elsif ($cleanmode =~ m{^git(?!-)}) {
        runcmd_ordryrun_local @git, qw(clean -xdf);
-    } elsif ($cleanmode eq 'git-ff') {
+    } elsif ($cleanmode =~ m{^git-ff}) {
        runcmd_ordryrun_local @git, qw(clean -xdff);
     } elsif ($cleanmode =~ m{^check}) {
        clean_tree_check();
@@ -6314,10 +6315,12 @@ sub build_prep ($) {
     my ($wantsrc) = @_;
     build_prep_early();
     check_bpd_exists();
-    if (!building_source_in_playtree() || ($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.)
+       || $cleanmode =~ m{always}) {
+       # Or because the user asked us to.
        clean_tree();
     } else {
        # We don't actually need to do anything in $maindir, but we
@@ -7298,12 +7301,11 @@ sub parseopts () {
                } elsif (s/^-wn$//s) {
                    push @ropts, $&;
                    $cleanmode = 'none';
-               } elsif (s/^-wg$//s) {
+               } elsif (s/^-wg(f?)(a?)$//s) {
                    push @ropts, $&;
                    $cleanmode = 'git';
-               } elsif (s/^-wgf$//s) {
-                   push @ropts, $&;
-                   $cleanmode = 'git-ff';
+                   $cleanmode .= '-ff' if $1;
+                   $cleanmode .= ',always' if $2;
                } elsif (s/^-wd(d?)([na]?)$//s) {
                    push @ropts, $&;
                    $cleanmode = 'dpkg-source';