chiark / gitweb /
new cleaning arrangements
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 8911c8e2a35c1fe0d05df4e98f735744a0c47aaf..b6e79e36bca1ca1b1cd1cd124c0593c626bd275e 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -24,6 +24,7 @@ use Data::Dumper;
 use LWP::UserAgent;
 use Dpkg::Control::Hash;
 use File::Path;
+use File::Basename;
 use Dpkg::Version;
 use POSIX;
 
@@ -36,6 +37,7 @@ our $dryrun = 0;
 our $changesfile;
 our $new_package = 0;
 our $existing_package = 'dpkg';
+our $cleanmode = 'dpkg-source';
 
 our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)");
 
@@ -45,14 +47,19 @@ our (@dput) = qw(dput);
 our (@debsign) = qw(debsign);
 our (@sbuild) = qw(sbuild -A);
 our (@dpkgbuildpackage) = qw(dpkg-buildpackage -i\.git/ -I.git);
+our (@dpkgsource) = qw(dpkg-source -i\.git/ -I.git);
+our (@dpkggenchanges) = qw(dpkg-genchanges);
 our (@mergechanges) = qw(mergechanges -f);
-
+our (@changesopts) = ('');
 
 our %opts_opt_map = ('dget' => \@dget,
                     'dput' => \@dput,
                     'debsign' => \@debsign,
                      'sbuild' => \@sbuild,
+                     'dpkg-source' => \@dpkgsource,
                      'dpkg-buildpackage' => \@dpkgbuildpackage,
+                     'dpkg-genchanges' => \@dpkggenchanges,
+                     'ch' => \@changesopts,
                      'mergechanges' => \@mergechanges);
 
 our $keyid;
@@ -78,6 +85,8 @@ sub debiantag ($) {
 
 sub dscfn ($) { return "${package}_$_[0].dsc"; }
 
+sub changesopts () { return @changesopts[1..$#changesopts]; }
+
 our $us = 'dgit';
 
 sub fail { die "$us: @_\n"; }
@@ -938,6 +947,9 @@ sub cmd_push {
     } else {
        badusage "incorrect arguments to dgit push";
     }
+    if (check_for_git()) {
+       git_fetch_us();
+    }
     if (fetch_from_archive()) {
        is_fast_fwd(lrref(), 'HEAD') or die;
     } else {
@@ -951,6 +963,7 @@ sub cmd_push {
 sub cmd_build {
     # we pass further options and args to git-buildpackage
     badusage "-p is not allowed with dgit build" if defined $package;
+    badusage "dgit build implies --clean=dpkg-source" if defined $package;
     my $clogp = parsechangelog();
     $isuite = getfield $clogp, 'Distribution';
     $package = getfield $clogp, 'Source';
@@ -961,21 +974,54 @@ sub cmd_build {
        canonicalise_suite();
        push @cmd, "--git-debian-branch=".lbranch();
     }
+    push @cmd, changesopts();
     runcmd_ordryrun @cmd, @ARGV;
     printdone "build successful\n";
 }
 
-sub cmd_sbuild {
+our $version;
+our $sourcechanges;
+our $dscfn;
+
+sub build_source {
     check_not_dirty();
-    badusage "-p is not allowed with dgit sbuild" if defined $package;
+    badusage "-p is not allowed with this action" if defined $package;
     my $clogp = parsechangelog();
     $package = getfield $clogp, 'Source';
     my $isuite = getfield $clogp, 'Distribution';
-    my $version = getfield $clogp, 'Version';
-    runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S));
+    $version = getfield $clogp, 'Version';
+    $sourcechanges = "${package}_${version}_source.changes";
+    $dscfn = dscfn($version);
+    if ($cleanmode eq 'dpkg-source') {
+       runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts();
+    } else {
+       if ($cleanmode eq 'git') {
+           runcmd_ordryrun @git, qw(clean -xdf);
+       } elsif ($cleanmode eq 'none') {
+       } else {
+           die "$cleanmode ?";
+       }
+       my $pwd = cmdoutput qw(env - pwd);
+       my $leafdir = basename $pwd;
+       chdir ".." or die $!;
+       runcmd_ordryrun @dpkgsource, qw(-b --), $leafdir;
+       chdir $pwd or die $!;
+       runcmd_ordryrun qw(sh -ec),
+           'exec >$1; shift; exec "$@"','x',
+           "../$sourcechanges",
+           @dpkggenchanges, qw(-S), changesopts();
+    }
+}
+
+sub cmd_build_source {
+    badusage "build-source takes no additional arguments" if @ARGV;
+    build_source();
+    printdone "source built, results in $dscfn and $sourcechanges";
+}
+
+sub cmd_sbuild {
+    build_source();
     chdir ".." or die $!;
-    my $sourcechanges = "${package}_${version}_source.changes";
-    my $dscfn = dscfn($version);
     my $pat = "${package}_${version}_*.changes";
     if (!$dryrun) {
        stat $dscfn or fail "$dscfn (in parent directory): $!";
@@ -1015,14 +1061,21 @@ sub parseopts () {
                helponly();
            } elsif (m/^--new$/) {
                $new_package=1;
-           } elsif (m/^--(\w+)=(.*)/s && ($om = $opts_opt_map{$1})) {
+           } elsif (m/^--(\w+)=(.*)/s &&
+                    ($om = $opts_opt_map{$1}) &&
+                    length $om->[0]) {
                $om->[0] = $2;
-           } elsif (m/^--(\w+):(.*)/s && ($om = $opts_opt_map{$1})) {
+           } elsif (m/^--(\w+):(.*)/s &&
+                    ($om = $opts_opt_map{$1})) {
                push @$om, $2;
            } elsif (m/^--existing-package=(.*)/s) {
                $existing_package = $1;
            } elsif (m/^--distro=(.*)/s) {
                $idistro = $1;
+           } elsif (m/^--clean=(dpkg-source|git|none)$/s) {
+               $cleanmode = $1;
+           } elsif (m/^--clean=(.*)$/s) {
+               badusage "unknown cleaning mode \`$1'";
            } else {
                badusage "unknown long option \`$_'";
            }
@@ -1037,6 +1090,9 @@ sub parseopts () {
                    $debug++;
                } elsif (s/^-N/-/) {
                    $new_package=1;
+               } elsif (m/^-[vm]/) {
+                   push @changesopts, $_;
+                   $_ = '';
                } elsif (s/^-c(.*=.*)//s) {
                    push @git, '-c', $1;
                } elsif (s/^-d(.*)//s) {
@@ -1045,6 +1101,12 @@ sub parseopts () {
                    $changesfile = $1;
                } elsif (s/^-k(.*)//s) {
                    $keyid=$1;
+               } elsif (s/^-wn//s) {
+                   $cleanmode = 'none';
+               } elsif (s/^-wg//s) {
+                   $cleanmode = 'git';
+               } elsif (s/^-wd//s) {
+                   $cleanmode = 'dpkg-source';
                } else {
                    badusage "unknown short option \`$_'";
                }