'dgit.default.archive-query' => 'madison:',
'dgit.default.sshpsql-dbname' => 'service=projectb',
'dgit.default.dgit-tag-format' => 'old,new,maint',
+ # 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',
die 'bug' if $tagformatfn && $tagformat_want;
# ... $tagformat_want assigned after previous select_tagformat
- my (@supported) = grep { $_ ne 'maint' } access_cfg_tagformats();
+ my (@supported) = grep { $_ =~ m/^(?:old|new)$/ } access_cfg_tagformats();
printdebug "select_tagformat supported @supported\n";
$tagformat_want //= [ $supported[0], "distro access configuration", 0 ];
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 <<END, $msg or die $!;
+tree $tree
+parent $dgitview
+parent $archive_hash
+author $authline
+commiter $authline
+
+END
+ close MC or die $!;
+
+ return make_commit($pmf);
+}
+
sub splitbrain_pseudomerge ($$$$) {
my ($clogp, $maintview, $dgitview, $archive_hash) = @_;
# => $merged_dgitview
# 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...";
}
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 <<END or die $!;
-tree $tree
-parent $dgitview
-parent $archive_hash
-author $authline
-commiter $authline
-
-END
- if (defined $overwrite_version) {
- print MC <<END;
+ my $r = pseudomerge_make_commit
+ $clogp, $dgitview, $archive_hash, $i_arch_v,
+ (defined $overwrite_version ? <<END_OVERWR : <<END_MAKEFF);
Declare fast forward from $overwrite_version
[dgit --quilt=$quilt_mode --overwrite-version=$overwrite_version]
-END
- } else {
- print MC <<END;
+END_OVERWR
Make fast forward from $i_arch_v->[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, <<END;
+$m
+
+[dgit --overwrite-version=$overwrite_version]
+END
+
+ runcmd @git, qw(update-ref -m), $m, 'HEAD', $r, $head;
+
+ progress "Make pseudo-merge of $i_arch_v->[0] into your HEAD.";
+ return $r;
+}
+
sub push_parse_changelog ($) {
my ($clogpfn) = @_;
}
}
+ if (defined $overwrite_version && !defined $maintviewhead) {
+ $dgithead = plain_overwrite_pseudomerge($clogp,
+ $dgithead,
+ $archive_hash);
+ }
+
check_not_dirty();
my $forceflag = '';