X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=0e99eb5dbb197ce146cffa5b02853a89b0e3964c;hp=5dfd97c7fdc45d3a0f4b9f2f53d67669845d8681;hb=fbf96e6c1449973cf4a8375fa0b0fca40a2e3fa9;hpb=1d74cb1f1941d3a95a9fb0b9180c796f16c0d5b1 diff --git a/dgit b/dgit index 5dfd97c7..0e99eb5d 100755 --- a/dgit +++ b/dgit @@ -537,6 +537,8 @@ our %defcfg = ('dgit.default.distro' => 'debian', # old means "repo server accepts pushes with old dgit tags" # new means "repo server accepts pushes with new dgit tags" # maint means "repo server accepts split brain pushes" + # hist means "repo server may have old pushes without new tag" + # ("hist" is implied by "old") 'dgit-distro.debian.archive-query' => 'ftpmasterapi:', 'dgit-distro.debian.git-check' => 'url', 'dgit-distro.debian.git-check-suffix' => '/info/refs', @@ -2395,6 +2397,44 @@ $anc->[1] ($anc->[0]) .. $desc->[1] ($desc->[0]) is not fast forward END }; +sub pseudomerge_version_check ($$) { + my ($clogp, $archive_hash) = @_; + + my $arch_clogp = commit_getclogp $archive_hash; + my $i_arch_v = [ (getfield $arch_clogp, 'Version'), + 'version currently in archive' ]; + if (defined $overwrite_version) { + infopair_cond_equal([ $overwrite_version, '--overwrite= version' ], + $i_arch_v); + } + + printdebug "pseudomerge_version_check i_arch_v @$i_arch_v\n"; + return $i_arch_v; +} + +sub pseudomerge_make_commit ($$$$$) { + my ($clogp, $dgitview, $archive_hash, $i_arch_v, $msg) = @_; + progress "Declaring that HEAD inciudes all changes in $i_arch_v->[0]..."; + + my $tree = cmdoutput qw(git rev-parse), "${dgitview}:"; + my $authline = clogp_authline $clogp; + + mkpath '.git/dgit'; + my $pmf = ".git/dgit/pseudomerge"; + open MC, ">", $pmf or die "$pmf $!"; + print MC < $merged_dgitview @@ -2411,20 +2451,13 @@ sub splitbrain_pseudomerge ($$$$) { # this: $dgitview' # - my $arch_clogp = commit_getclogp $archive_hash; - my $i_arch_v = [ (getfield $arch_clogp, 'Version'), - 'version currently in archive' ]; - - printdebug "splitbrain_pseudomerge i_arch_v @$i_arch_v\n"; + printdebug "splitbrain_pseudomerge...\n"; + + my $i_arch_v = pseudomerge_version_check($clogp, $archive_hash); return $dgitview unless defined $archive_hash; - if (defined $overwrite_version) { - progress "Declaring that HEAD inciudes all changes in archive..."; - progress "Checking that $overwrite_version does so..."; - infopair_cond_equal([ $overwrite_version, '--overwrite= version' ], - $i_arch_v); - } else { + if (!defined $overwrite_version) { progress "Checking that HEAD inciudes all changes in archive..."; } @@ -2442,39 +2475,56 @@ sub splitbrain_pseudomerge ($$$$) { infopair_cond_ff($i_dep14, $i_dgit); $overwrite_version // infopair_cond_ff($i_dep14, [ $maintview, 'HEAD' ]); - my $tree = cmdoutput qw(git rev-parse), "${dgitview}:"; - my $authline = clogp_authline $clogp; - - mkpath '.git/dgit'; - my $pmf = ".git/dgit/pseudomerge"; - open MC, ">", $pmf or die "$pmf $!"; - print MC <[0] [dgit --quilt=$quilt_mode] -END - } - close MC or die $!; +END_MAKEFF - progress "Making pseudo-merge of $i_arch_v->[0] into dgit view."; - return make_commit($pmf); + progress "Made pseudo-merge of $i_arch_v->[0] into dgit view."; + return $r; } +sub plain_overwrite_pseudomerge ($$$) { + my ($clogp, $head, $archive_hash) = @_; + + printdebug "plain_overwrite_pseudomerge..."; + + my $i_arch_v = pseudomerge_version_check($clogp, $archive_hash); + + my @tagformats = access_cfg_tagformats(); + my @t_overwr = + map { $_->($overwrite_version, access_basedistro) } + (grep { m/^(?:old|hist)$/ } @tagformats) + ? \&debiantags : \&debiantag_new; + my $i_overwr = infopair_lrf_tag_lookup \@t_overwr, "previous version tag"; + my $i_archive = [ $archive_hash, "current archive contents" ]; + + infopair_cond_equal($i_overwr, $i_archive); + + return $head if is_fast_fwd $archive_hash, $head; + + my $m = "Declare fast forward from $overwrite_version"; + + my $r = pseudomerge_make_commit + $clogp, $head, $archive_hash, $i_arch_v, <[0] into your HEAD."; + return $r; +} + sub push_parse_changelog ($) { my ($clogpfn) = @_; @@ -2702,6 +2752,12 @@ END } } + if (defined $overwrite_version && !defined $maintviewhead) { + $dgithead = plain_overwrite_pseudomerge($clogp, + $dgithead, + $archive_hash); + } + check_not_dirty(); my $forceflag = '';