chiark / gitweb /
dgit: clone: Create destination directory before using network
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 654b3d1d4cc1817d378740cb2a4b3d7870b2221d..b25d344f46a496516735dd9cb088cd76008c7341 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 )? (?: ,no-check )?
+our $cleanmode_re = qr{(?: dpkg-source (?: -d )? (?: ,no-check | ,all-check )?
                          | git | git-ff
                          | check (?: ,ignores )?
                          | none
@@ -132,8 +132,8 @@ our (@mergechanges) = qw(mergechanges -f);
 our (@gbp_build) = ('');
 our (@gbp_pq) = ('gbp pq');
 our (@changesopts) = ('');
-our (@pbuilder) = ("sudo -E pbuilder");
-our (@cowbuilder) = ("sudo -E cowbuilder");
+our (@pbuilder) = ("sudo -E pbuilder","--no-source-only-changes");
+our (@cowbuilder) = ("sudo -E cowbuilder","--no-source-only-changes");
 
 our %opts_opt_map = ('dget' => \@dget, # accept for compatibility
                     'curl' => \@curl,
@@ -3758,10 +3758,12 @@ sub clone ($) {
     }
     printdebug "clone main body\n";
 
-    canonicalise_suite();
-    my $hasgit = check_for_git();
     mkdir $dstdir or fail f_ "create \`%s': %s", $dstdir, $!;
     changedir $dstdir;
+
+    canonicalise_suite();
+    my $hasgit = check_for_git();
+
     runcmd @git, qw(init -q);
     record_maindir();
     setup_new_tree();
@@ -6218,11 +6220,11 @@ sub clean_tree_check_git_wd ($) {
     my ($message) = @_;
     return if $cleanmode =~ m{no-check};
     return if $patches_applied_dirtily; # yuk
-    clean_tree_check_git 1,
+    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
+mode, eg --clean=dpkg-source,no-check (-wdn/-wddn) to ignore them
 or --clean=git (-wg/-wgf) to use \`git clean' instead.
 END
 }
@@ -6238,6 +6240,13 @@ sub clean_tree_check () {
     } 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.
+    } elsif ($cleanmode eq 'none') {
+    } else {
+       confess "$cleanmode ?";
     }
 }
 
@@ -6260,7 +6269,7 @@ sub clean_tree () {
        clean_tree_check();
     } elsif ($cleanmode eq 'none') {
     } else {
-       die "$cleanmode ?";
+       confess "$cleanmode ?";
     }
 }
 
@@ -7185,6 +7194,12 @@ sub parseopts () {
                     ($om = $opts_opt_map{$1})) {
                push @ropts, $_;
                push @$om, $2;
+           } elsif (m/^--([-0-9a-z]+)\!:(.*)/s &&
+                    !$opts_opt_cmdonly{$1} &&
+                    ($om = $opts_opt_map{$1})) {
+               push @ropts, $_;
+               my $cmd = shift @$om;
+               @$om = ($cmd, grep { $_ ne $2 } @$om);
            } elsif (m/^--(gbp|dpm)$/s) {
                push @ropts, "--quilt=$1";
                $quilt_mode = $1;
@@ -7280,11 +7295,12 @@ sub parseopts () {
                } elsif (s/^-wgf$//s) {
                    push @ropts, $&;
                    $cleanmode = 'git-ff';
-               } elsif (s/^-wd(d?)([n]?)$//s) {
+               } elsif (s/^-wd(d?)([na]?)$//s) {
                    push @ropts, $&;
                    $cleanmode = 'dpkg-source';
                    $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';