X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=dgit;h=13ed4b6cfef05775c7f65fe3fd5236a80d9d67f6;hb=53cff81bf89593f3ba347e2d8003197a6cd4bb01;hp=149345dd23073630b932e9953d955b072750d898;hpb=5307140c7bb2a71334522ed0d88e78efcaa210be;p=dgit.git diff --git a/dgit b/dgit index 149345dd..13ed4b6c 100755 --- a/dgit +++ b/dgit @@ -4495,7 +4495,7 @@ END if (quiltmode_splitbrain()) { $do_split_brain = 1; changedir $playground; - quilt_make_fake_dsc($upstreamversion); + quilt_need_fake_dsc($upstreamversion); my $cachekey; ($dgithead, $cachekey) = quilt_check_splitbrain_cache($actualhead, $upstreamversion); @@ -5794,35 +5794,6 @@ sub build_maybe_quilt_fixup () { my $headref = git_rev_parse('HEAD'); my $symref = git_get_symref(); - if ($quilt_mode eq 'linear' - && !$fopts->{'single-debian-patch'} - && branch_is_gdr($headref)) { - # This is much faster. It also makes patches that gdr - # likes better for future updates without laundering. - # - # However, it can fail in some casses where we would - # succeed: if there are existing patches, which correspond - # to a prefix of the branch, but are not in gbp/gdr - # format, gdr will fail (exiting status 7), but we might - # be able to figure out where to start linearising. That - # will be slower so hopefully there's not much to do. - my @cmd = (@git_debrebase, - qw(--noop-ok -funclean-mixed -funclean-ordering - make-patches --quiet-would-amend)); - # We tolerate soe snags that gdr wouldn't, by default. - if (act_local()) { - debugcmd "+",@cmd; - $!=0; $?=-1; - failedcmd @cmd - if system @cmd - and not ($? == 7*256 or - $? == -1 && $!==ENOENT); - } else { - dryrun_report @cmd; - } - $headref = git_rev_parse('HEAD'); - } - prep_ud(); changedir $playground; @@ -5850,12 +5821,18 @@ END } } -sub unpack_playtree_mk_cd_work ($) { +sub unpack_playtree_need_cd_work ($) { my ($headref) = @_; - mkdir "work" or confess "$!"; - changedir "work"; - mktree_in_ud_here(); + # prep_ud() must have been called already. + if (!chdir "work") { + # Check in the filesystem because sometimes we run prep_ud + # in between multiple calls to unpack_playtree_need_cd_work. + confess "$!" unless $!==ENOENT; + mkdir "work" or confess "$!"; + changedir "work"; + mktree_in_ud_here(); + } runcmd @git, qw(reset -q --hard), $headref; } @@ -5904,7 +5881,7 @@ sub quilt_fixup_singlepatch ($$$) { # necessary to build the source package. unpack_playtree_linkorigs($upstreamversion, sub { }); - unpack_playtree_mk_cd_work($headref); + unpack_playtree_need_cd_work($headref); rmtree("debian/patches"); @@ -5920,9 +5897,14 @@ sub quilt_fixup_singlepatch ($$$) { commit_quilty_patch(); } -sub quilt_make_fake_dsc ($) { +sub quilt_need_fake_dsc ($) { + # cwd should be playground my ($upstreamversion) = @_; + return if stat_exists "fake.dsc"; + # ^ OK to test this as a sentinel because if we created it + # we must either have done the rest too, or crashed. + my $fakeversion="$upstreamversion-~~DGITFAKE"; my $fakedsc=new IO::File 'fake.dsc', '>' or confess "$!"; @@ -5966,7 +5948,7 @@ END sub quilt_fakedsc2unapplied ($$) { my ($headref, $upstreamversion) = @_; # must be run in the playground - # quilt_make_fake_dsc must have been called + # quilt_need_fake_dsc must have been called runcmd qw(sh -ec), 'exec dpkg-source --no-check --skip-patches -x fake.dsc >/dev/null'; @@ -6026,7 +6008,7 @@ sub quilt_check_splitbrain_cache ($$) { "refs/$splitbraincache", $splitbrain_cachekey; if ($cachehit) { - unpack_playtree_mk_cd_work($headref); + unpack_playtree_need_cd_work($headref); my $saved = maybe_split_brain_save $headref, $cachehit, "cache-hit"; if ($cachehit ne $headref) { progress f_ "dgit view: found cached (%s)", $saved; @@ -6119,7 +6101,40 @@ sub quilt_fixup_multipatch ($$$) { my $splitbrain_cachekey; - quilt_make_fake_dsc($upstreamversion); + if ($quilt_mode eq 'linear' + && branch_is_gdr($headref)) { + # This is much faster. It also makes patches that gdr + # likes better for future updates without laundering. + # + # However, it can fail in some casses where we would + # succeed: if there are existing patches, which correspond + # to a prefix of the branch, but are not in gbp/gdr + # format, gdr will fail (exiting status 7), but we might + # be able to figure out where to start linearising. That + # will be slower so hopefully there's not much to do. + + unpack_playtree_need_cd_work $headref; + + my @cmd = (@git_debrebase, + qw(--noop-ok -funclean-mixed -funclean-ordering + make-patches --quiet-would-amend)); + # We tolerate soe snags that gdr wouldn't, by default. + if (act_local()) { + debugcmd "+",@cmd; + $!=0; $?=-1; + failedcmd @cmd + if system @cmd + and not ($? == 7*256 or + $? == -1 && $!==ENOENT); + } else { + dryrun_report @cmd; + } + $headref = git_rev_parse('HEAD'); + + chdir '..'; + } + + quilt_need_fake_dsc($upstreamversion); if (quiltmode_splitbrain()) { my $cachehit; @@ -6145,7 +6160,7 @@ END changedir '..'; - unpack_playtree_mk_cd_work($headref); + unpack_playtree_need_cd_work($headref); my $mustdeletepc=0; if (stat_exists ".pc") { @@ -6722,7 +6737,7 @@ sub build_source { unless ($split_brain) { my $upstreamversion = upstreamversion $version; unpack_playtree_linkorigs($upstreamversion, sub { }); - unpack_playtree_mk_cd_work($headref); + unpack_playtree_need_cd_work($headref); changedir '..'; } } else { @@ -6888,7 +6903,7 @@ sub cmd_print_unapplied_treeish { prep_ud(); changedir $playground; my $uv = upstreamversion $version; - quilt_make_fake_dsc($uv); + quilt_need_fake_dsc($uv); my $u = quilt_fakedsc2unapplied($headref, $uv); print $u, "\n" or confess "$!"; }