chiark / gitweb /
Provide "dgit sbuild".
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 22 Aug 2013 12:58:02 +0000 (13:58 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 22 Aug 2013 12:58:02 +0000 (13:58 +0100)
debian/changelog
dgit
dgit.1

index af327bef04e1696a6d680f33ea7d31425c80bca8..14b34630f95ce313b41c17b37004aad4ae38adf4 100644 (file)
@@ -2,6 +2,7 @@ dgit (0.4) experimental; urgency=low
 
   * Use dgit.debian.net vhost on alioth.  Closes #720172.
   * Usage message.  Closes #720085.
 
   * Use dgit.debian.net vhost on alioth.  Closes #720172.
   * Usage message.  Closes #720085.
+  * Provide "dgit sbuild".
   * Assorted manpage fixes and improvements.
   * Fail if a required config item is missing.
   * Much better error messages.
   * Assorted manpage fixes and improvements.
   * Fail if a required config item is missing.
   * Much better error messages.
diff --git a/dgit b/dgit
index 7f13eecd19600c93d63008223fada04570e91011..e95f30c885ede0854217a5ab9157d63cbfa24e7e 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -42,14 +42,22 @@ our (@git) = qw(git);
 our (@dget) = qw(dget);
 our (@dput) = qw(dput);
 our (@debsign) = qw(debsign);
 our (@dget) = qw(dget);
 our (@dput) = qw(dput);
 our (@debsign) = qw(debsign);
-our $keyid;
+our (@sbuild) = qw(sbuild);
+our (@dpkgbuildpackage) = qw(dpkg-buildpackage -i\.git/ -I.git);
+our (@mergechanges) = qw(mergechanges -f);
 
 
-our $debug = 0;
-open DEBUG, ">/dev/null" or die $!;
 
 our %opts_opt_map = ('dget' => \@dget,
                     'dput' => \@dput,
 
 our %opts_opt_map = ('dget' => \@dget,
                     'dput' => \@dput,
-                    'debsign' => \@debsign);
+                    'debsign' => \@debsign,
+                     'sbuild' => \@sbuild,
+                     'dpkg-buildpackage' => \@dpkgbuildpackage;
+                     'mergechanges' => \@mergechanges);
+
+our $keyid;
+
+our $debug = 0;
+open DEBUG, ">/dev/null" or die $!;
 
 our $remotename = 'dgit';
 our $ourdscfield = 'Vcs-Dgit-Master';
 
 our $remotename = 'dgit';
 our $ourdscfield = 'Vcs-Dgit-Master';
@@ -63,6 +71,8 @@ sub lrref () { return "refs/remotes/$remotename/$csuite"; }
 sub rrref () { return "refs/$branchprefix/$csuite"; }
 sub debiantag ($) { return "debian/$_[0]"; }
 
 sub rrref () { return "refs/$branchprefix/$csuite"; }
 sub debiantag ($) { return "debian/$_[0]"; }
 
+sub dscfn () { return "${package}_${cversion}.dsc"; }
+
 our $us = 'dgit';
 
 sub fail () { die "$us: @_\n"; }
 our $us = 'dgit';
 
 sub fail () { die "$us: @_\n"; }
@@ -719,7 +729,7 @@ sub dopush () {
     my $clogp = parsechangelog();
     $package = getfield $clogp 'Source';
     my $cversion = getfield $clogp, 'Version';
     my $clogp = parsechangelog();
     $package = getfield $clogp 'Source';
     my $cversion = getfield $clogp, 'Version';
-    my $dscfn = "${package}_${cversion}.dsc";
+    my $dscfn = dscfn();
     stat "../$dscfn" or
        fail "looked for .dsc $dscfn, but $!;".
            " maybe you forgot to build";
     stat "../$dscfn" or
        fail "looked for .dsc $dscfn, but $!;".
            " maybe you forgot to build";
@@ -891,14 +901,39 @@ sub cmd_build {
     $package = getfield $clogp, 'Source';
     my @cmd =
        (qw(git-buildpackage -us -uc --git-no-sign-tags),
     $package = getfield $clogp, 'Source';
     my @cmd =
        (qw(git-buildpackage -us -uc --git-no-sign-tags),
-        '--git-builder=dpkg-buildpackage -i\.git/ -I.git');
+        "--git-builder=@dpkgbuildpackage");
     unless (grep { m/^--git-debian-branch/ } @ARGV) {
        canonicalise_suite();
        push @cmd, "--git-debian-branch=".lbranch();
     }
     runcmd_ordryrun @cmd, @ARGV;
     unless (grep { m/^--git-debian-branch/ } @ARGV) {
        canonicalise_suite();
        push @cmd, "--git-debian-branch=".lbranch();
     }
     runcmd_ordryrun @cmd, @ARGV;
+    print "build successful\n";
 }
 
 }
 
+sub cmd_sbuild {
+    check_not_dirty();
+    badusage "-p is not allowed with dgit sbuild" if defined $package;
+    my $clogp = parsechangelog();
+    $package = getfield $clogp, 'Source';
+    my $version = getfield $clogp, 'Version';
+    runcmd (@dpkgbuildpackage, qw(-us -uc -S));
+    chdir ".." or die $!;
+    my $sourcechanges = "${package}_${version}_source.changes";
+    my $dscfn = dscfn();
+    stat "../$dscfn" or fail "$dscfn (in parent directory): $!";
+    stat "../$sourcechanges" or fail "$sourcechanges (in parent directory): $!";
+    my $pat = "${package}_${version}_*.changes";
+    foreach my $cf (glob $pat) {
+       next if $cf eq $sourcechanges;
+       unlink $cf or fail "remove $cf: $!";
+    }
+    runcmd @sbuild, @ARGV, $sourcechanges;
+    runcmd @mergechanges, glob $pat;
+    my $multichanges = "${package}_${version}_multi.changes";
+    stat $multichanges or fail "$multichanges: $!";
+    print "build successful, results in $multichanges\n" or die $!;
+}    
+
 sub cmd_quilt_fixup {
     badusage "incorrect arguments to dgit quilt-fixup";
     my $clogp = parsechangelog();
 sub cmd_quilt_fixup {
     badusage "incorrect arguments to dgit quilt-fixup";
     my $clogp = parsechangelog();
diff --git a/dgit.1 b/dgit.1
index eb5b2c11d6702aa1451663747117e08d72913bfe..14b7d1ed42e88973a68e841557390e39a867db3c 100644 (file)
--- a/dgit.1
+++ b/dgit.1
@@ -12,8 +12,8 @@ dgit \- git integration with the Debian archive
 [\fIsuite\fP]
 .br
 .B dgit
 [\fIsuite\fP]
 .br
 .B dgit
-[\fIdgit\-opts\fP] \fBbuild\fP
-[\fIgit\-buildpackage\-opts\fP|\fIdpkg\-buildpackage\-opts\fp]
+[\fIdgit\-opts\fP] \fBbuild\fP|\fBsbuild\fP
+[\fIbuild\-opts\fp]
 .br
 .B dgit
 [\fIdgit\-opts\fP] \fBpush\fP [\fIdgit\-opts\fP]
 .br
 .B dgit
 [\fIdgit\-opts\fP] \fBpush\fP [\fIdgit\-opts\fP]
@@ -78,13 +78,21 @@ into the current branch.
 \fBdgit build\fR ...
 Runs
 .B git-buildpackage
 \fBdgit build\fR ...
 Runs
 .B git-buildpackage
-with some suitable options.  Options and argumments after
-.B build
+with some suitable options.  Options and argumments after build
 will be passed on to git-buildpackage.  It is not necessary to use
 dgit build when using dgit; it is OK to use any approach which ensures
 that the generated source package corresponds to the relevant git
 commit.  Tagging and signing should be left to dgit push.
 .TP
 will be passed on to git-buildpackage.  It is not necessary to use
 dgit build when using dgit; it is OK to use any approach which ensures
 that the generated source package corresponds to the relevant git
 commit.  Tagging and signing should be left to dgit push.
 .TP
+\fBdgit sbuild\fR ...
+Constructs the source package, and uses sbuild to do a binary
+build, and uses mergechanges to merge the source and binary
+changes files.  Options and argumments after sbuild will be passed on
+to sbuild.  Changes files matching
+.IB package _ version _*.changes
+in the parent directory will be removed; the output is left in
+.IR package \fB_\fR version \fB_multi.changes\fR.
+.TP
 .B dgit push
 Does an `upload', pushing the current HEAD to the archive (as a source
 package) and to dgit-repos (as git commits).  The package must already
 .B dgit push
 Does an `upload', pushing the current HEAD to the archive (as a source
 package) and to dgit-repos (as git commits).  The package must already
@@ -285,13 +293,26 @@ more output (currently, up to -DD is meaningfully different).
 Specifies a git configuration option.  dgit itself is also controlled
 by git configuration options.
 .TP
 Specifies a git configuration option.  dgit itself is also controlled
 by git configuration options.
 .TP
-.RI \fB--dget=\fR program |\fB--dput=\fR program |\fB--debsign=\fR program
-Specifies alternative programs to use instead of dget, dput
-or debsign.
-.TP
-.RI \fB--dget:\fR option |\fB--dput:\fR option |\fB--debsign:\fR option
-Specifies a single additional option to pass to dget, dput or
-debsign.  Use repeatedly if multiple additional options are required.
+.RI \fB--dget=\fR program |\fB--dput=\fR program |...
+Specifies alternative programs to use instead of
+.BR dget ,
+.BR dput ,
+.BR debsign ,
+.BR dpkg-buildpackage
+.BR sbuild ,
+or
+.BR mergechanges .
+.TP
+.RI \fB--dget:\fR option |\fB--dput:\fR option |...
+Specifies a single additional option to pass to
+.BR dget ,
+.BR dput ,
+.BR debsign ,
+.BR dpkg-buildpackage
+.BR sbuild ,
+or
+.BR mergechanges .
+Can be repeated as necessary.
 .TP
 .BI -C changesfile
 Specifies the .changes file which is to be uploaded.  By default
 .TP
 .BI -C changesfile
 Specifies the .changes file which is to be uploaded.  By default