chiark / gitweb /
Provide "dgit sbuild".
[dgit.git] / dgit
diff --git a/dgit b/dgit
index b136ed98a81ed45a5b96eac0ff5815992ec3bd87..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 $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,
-                    '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';
@@ -63,6 +71,8 @@ sub lrref () { return "refs/remotes/$remotename/$csuite"; }
 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"; }
@@ -719,13 +729,17 @@ sub dopush () {
     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";
     $dsc = parsecontrol("../$dscfn","$dscfn");
+    my $dscpackage = getfield $dsc, 'Source';
     my $format = getfield $dsc, 'Format';
     my $dversion = getfield $dsc, 'Version';
+    ($dscpackage eq $package && $dversion eq $cversion)
+       fail "$dsc is for $dscpackage $dversion".
+           " but debian/changelog is for $package $cversion";
     print DEBUG "format $format\n";
     if ($format eq '3.0 (quilt)') {
        print "Format \`$format', urgh\n";
@@ -757,11 +771,6 @@ sub dopush () {
 #        (uploadbranch());
     $dsc->{$ourdscfield} = rev_parse('HEAD');
     $dsc->save("../$dscfn.tmp") or die $!;
-    if (!$dryrun) {
-       rename "../$dscfn.tmp","../$dscfn" or die "$dscfn $!";
-    } else {
-       print "[new .dsc left in $dscfn.tmp]\n";
-    }
     if (!$changesfile) {
        my $pat = "${package}_c$version_*.changes";
        my @cs = glob "../$pat";
@@ -775,6 +784,11 @@ sub dopush () {
        create_remote_git_repo();
     }
     runcmd_ordryrun @git, qw(push),access_giturl(),"HEAD:".rrref();
+    if (!$dryrun) {
+       rename "../$dscfn.tmp","../$dscfn" or die "$dscfn $!";
+    } else {
+       print "[new .dsc left in $dscfn.tmp]\n";
+    }
     if ($sign) {
        my @tag_cmd = (@git, qw(tag -s -m),
                       "Release $dversion for $csuite [dgit]");
@@ -887,14 +901,39 @@ sub cmd_build {
     $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;
+    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();