From: Ian Jackson Date: Fri, 21 Aug 2015 16:27:40 +0000 (+0100) Subject: dgit: Internal change: Support forcing split source builds X-Git-Tag: archive/debian/2.0~342 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=commitdiff_plain;h=79194f4a7a74b1d6fce6812e379315e0b0984833;hp=ae636a9fe059f5f6f75be64e9bc48d842986172f;ds=sidebyside dgit: Internal change: Support forcing split source builds We are going to start handling weirder kinds of git tree, which will require a kind of `split brain': the dgit-using maintainer's view will be a git tree which is not a dgit git tree. dgit will convert them during push. For this to work we will have to have dgit always (in these cases) generate the source package itself (with a separate invocation of dpkg-source). This will involve some dis- and re-entangling of the way we generate arguments to dpkg-buildpackage. We can profitably split this up into this pre-patch, which has no overall functional change for normal users. We do here provide a new --always-split-source-build option which allows the new approach to be explicitly requested. This allows us to use the test suite to not only test that we didn't break any of the existing building strategies, but also that the new strategies all do what we expect. But this option is not really semantically useful for users so we do not document it. --- diff --git a/dgit b/dgit index 6a153935..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 ($@, $?); @@ -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 @@ -3352,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});