X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=ae75cb9be9a127cc6b2438b544ba4164fcd683f4;hp=e59060d240d2d3977a76d0319008f57c1f0f728b;hb=ecbd050d62ca87c4298a1344c805db0b93c392e0;hpb=a4877226404a1a34181bb93c513af716834d7cb4 diff --git a/dgit b/dgit index e59060d2..ae75cb9b 100755 --- a/dgit +++ b/dgit @@ -113,6 +113,7 @@ our $keyid; autoflush STDOUT 1; our $supplementary_message = ''; +our $need_split_build_invocation = 0; END { local ($@, $?); @@ -2779,7 +2780,7 @@ sub quilt_fixup_mkwork ($) { mkdir "work" or die $!; changedir "work"; mktree_in_ud_here(); - runcmd @git, qw(reset --hard), $headref; + runcmd @git, qw(reset -q --hard), $headref; } sub quilt_fixup_linkorigs ($$) { @@ -3058,33 +3059,73 @@ sub changesopts () { sub massage_dbp_args ($;$) { my ($cmd,$xargs) = @_; - if ($cleanmode eq 'dpkg-source') { + # We need to: + # + # - if we're going to split the source build out so we can + # do strange things to it, massage the arguments to dpkg-buildpackage + # so that the main build doessn't build source (or add an argument + # to stop it building source by default). + # + # - add -nc to stop dpkg-source cleaning the source tree, + # unless we're not doing a split build and want dpkg-source + # as cleanmode, in which case we can do nothing + # + # return values: + # 0 - source will NOT need to be built separately by caller + # +1 - source will need to be built separately by caller + # +2 - source will need to be built separately by caller AND + # dpkg-buildpackage should not in fact be run at all! + debugcmd '#massaging#', @$cmd if $debuglevel>1; +#print STDERR "MASS0 ",Dumper($cmd, $xargs, $need_split_build_invocation); + if ($cleanmode eq 'dpkg-source' && !$need_split_build_invocation) { $suppress_clean = 1; - return; + return 0; } - debugcmd '#massaging#', @$cmd if $debuglevel>1; - my @newcmd = shift @$cmd; # -nc has the side effect of specifying -b if nothing else specified - push @newcmd, '-nc'; # and some combinations of -S, -b, et al, are errors, rather than - # later simply overriding earlier - push @newcmd, '-F' unless grep { m/^-[bBASFgG]$/ } (@$cmd, @$xargs); - push @newcmd, @$cmd; - @$cmd = @newcmd; + # later simply overriding earlie. So we need to: + # - search the command line for these options + # - pick the last one + # - perhaps add our own as a default + # - perhaps adjust it to the corresponding non-source-building version + my $dmode = '-F'; + foreach my $l ($cmd, $xargs) { + next unless $l; + @$l = grep { !(m/^-[SgGFABb]$/s and $dmode=$_) } @$l; + } + push @$cmd, '-nc'; +#print STDERR "MASS1 ",Dumper($cmd, $xargs, $dmode); + my $r = 0; + if ($need_split_build_invocation) { + $r = $dmode =~ m/[S]/ ? +2 : + $dmode =~ y/gGF/ABb/ ? +1 : + $dmode =~ m/[ABb]/ ? 0 : + die "$dmode ?"; + } + push @$cmd, $dmode; +#print STDERR "MASS2 ",Dumper($cmd, $xargs, $r); + return $r; } sub cmd_build { my @dbp = (@dpkgbuildpackage, qw(-us -uc), changesopts_initial(), @ARGV); - massage_dbp_args \@dbp; - build_prep(); - push @dbp, changesopts_version(); - runcmd_ordryrun_local @dbp; + my $wantsrc = massage_dbp_args \@dbp; + if ($wantsrc > 0) { + build_source(); + } else { + build_prep(); + } + if ($wantsrc < 2) { + push @dbp, changesopts_version(); + runcmd_ordryrun_local @dbp; + } printdone "build successful\n"; } sub cmd_gbp_build { my @dbp = @dpkgbuildpackage; - massage_dbp_args \@dbp, \@ARGV; + + my $wantsrc = massage_dbp_args \@dbp, \@ARGV; my @cmd; if (length executable_on_path('git-buildpackage')) { @@ -3094,18 +3135,22 @@ sub cmd_gbp_build { } push @cmd, (qw(-us -uc --git-no-sign-tags), "--git-builder=@dbp"); - if ($cleanmode eq 'dpkg-source') { - $suppress_clean = 1; + if ($wantsrc > 0) { + build_source(); } else { - push @cmd, '--git-cleaner=true'; + if (!$suppress_clean) { + push @cmd, '--git-cleaner=true'; + } + build_prep(); } - build_prep(); - unless (grep { m/^--git-debian-branch|^--git-ignore-branch/ } @ARGV) { - canonicalise_suite(); - push @cmd, "--git-debian-branch=".lbranch(); + if ($wantsrc < 2) { + unless (grep { m/^--git-debian-branch|^--git-ignore-branch/ } @ARGV) { + canonicalise_suite(); + push @cmd, "--git-debian-branch=".lbranch(); + } + push @cmd, changesopts(); + runcmd_ordryrun_local @cmd, @ARGV; } - push @cmd, changesopts(); - runcmd_ordryrun_local @cmd, @ARGV; printdone "build successful\n"; } sub cmd_git_build { cmd_gbp_build(); } # compatibility with <= 1.0 @@ -3149,16 +3194,20 @@ sub cmd_build_source { sub cmd_sbuild { build_source(); - changedir ".."; my $pat = changespat $version; + if (!$rmchanges) { + my @unwanted = map { s#^\.\./##; $_; } glob "../$pat"; + @unwanted = grep { $_ ne changespat $version,'source' } @unwanted; + fail "changes files other than source matching $pat". + " already present (@unwanted);". + " building would result in ambiguity about the intended results" + if @unwanted; + } + changedir ".."; if (act_local()) { stat_exists $dscfn or fail "$dscfn (in parent directory): $!"; stat_exists $sourcechanges or fail "$sourcechanges (in parent directory): $!"; - foreach my $cf (glob $pat) { - next if $cf eq $sourcechanges; - unlink $cf or fail "remove $cf: $!"; - } } runcmd_ordryrun_local @sbuild, qw(-d), $isuite, @ARGV, $dscfn; my @changesfiles = glob $pat; @@ -3348,6 +3397,10 @@ sub parseopts () { } elsif (m/^--deliberately-($deliberately_re)$/s) { push @ropts, $_; push @deliberatelies, $&; + } elsif (m/^--always-split-source-build$/s) { + # undocumented, for testing + push @ropts, $_; + $need_split_build_invocation = 1; } elsif (m/^(--[-0-9a-z]+)(=|$)/ && ($oi = $valopts_long{$1})) { $val = $2 ? $' : undef; #'; $valopt->($oi->{Long});