summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2023-06-14 21:31:13 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2023-06-14 22:00:31 +0100
commit2d914614233cd755166d63d0551d11c027516519 (patch)
treeaca57274ef183a28d35e84e0f7d117d24f23ca5a
parent75f51308ebf63bc743f75eade60f719c5540eb4c (diff)
Abolish dgit-badcommit-fixup
git 2.40 rejects the bad commits. This means we can no longer conveniently test this script. And it also means it is not likely that such a bug would be reintroduced. So: * Delete the script. * Delete its test case and remove it from debian/tests/control. * No longer install it. * Remove the lintian suppression for its lack of manpage. Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-rw-r--r--Makefile2
-rw-r--r--debian/changelog4
-rw-r--r--debian/dgit.lintian-overrides1
-rw-r--r--debian/tests/control2
-rwxr-xr-xdgit-badcommit-fixup333
-rwxr-xr-xtests/tests/badcommit-rewrite62
6 files changed, 5 insertions, 399 deletions
diff --git a/Makefile b/Makefile
index 87cff8b..e1d3236 100644
--- a/Makefile
+++ b/Makefile
@@ -34,7 +34,7 @@ infraexamplesdir=$(prefix)/share/doc/dgit-infrastructure/examples
txtdocdir=$(prefix)/share/doc/dgit
absurddir=$(prefix)/share/dgit/absurd
-PROGRAMS=dgit dgit-badcommit-fixup git-playtree-setup
+PROGRAMS=dgit git-playtree-setup
MAN1PAGES=dgit.1
MAN7PAGES=dgit.7 \
diff --git a/debian/changelog b/debian/changelog
index 9effcee..258f25b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,8 @@
dgit (10.8~) unstable; urgency=medium
- *
+ * Abolish dgit-badcommit-fixup (the remedial script for #849041).
+ If ancient repositories are found which need fixing, install
+ dgit.deb 10.7 or earlier (eg from Debian bookworm and earlier).
--
diff --git a/debian/dgit.lintian-overrides b/debian/dgit.lintian-overrides
index 2f7a968..b6287d2 100644
--- a/debian/dgit.lintian-overrides
+++ b/debian/dgit.lintian-overrides
@@ -1,2 +1 @@
manpage-has-errors-from-man usr/share/man/man1/dgit.1.gz file '<standard input>', around line 51:
-binary-without-manpage usr/bin/dgit-badcommit-fixup
diff --git a/debian/tests/control b/debian/tests/control
index a22400b..f26a396 100644
--- a/debian/tests/control
+++ b/debian/tests/control
@@ -100,7 +100,7 @@ Tests: trustingpolicy-replay
Tests-Directory: tests/tests
Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl, dput-ng
-Tests: absurd-gitapply badcommit-rewrite build-modes build-modes-long build-modes-source checkout clone-clogsigpipe debpolicy-dbretry debpolicy-newreject debpolicy-quilt-gbp debpolicy-taintrm defdistro-rpush defdistro-setup distropatches-reject dpkgsourceignores-correct drs-push-masterupdate drs-push-rejects dsd-divert fetch-localgitonly fetch-somegit-notlast forcesplit-linear forcesplit-overwrite gbp-orig gitconfig gitworktree import-dsc import-maintmangle import-native import-nonnative import-tarbomb inarchivecopy mismatches-contents mismatches-dscchanges multisuite orig-include-exclude orig-include-exclude-chkquery overwrite-chkclog overwrite-junk overwrite-splitbrains overwrite-version pbuilder protocol-compat push-buildproductsdir push-newpackage push-newrepeat push-nextdgit push-source push-source-with-changes quilt quilt-gbp quilt-gbp-build-modes quilt-include-binaries quilt-singlepatch quilt-splitbrains quilt-useremail rpush rpush-quilt rpush-source sourceonlypolicy tag-updates unrepresentable unrepresentable-single-dpkg unrepresentable-single-git version-opt
+Tests: absurd-gitapply build-modes build-modes-long build-modes-source checkout clone-clogsigpipe debpolicy-dbretry debpolicy-newreject debpolicy-quilt-gbp debpolicy-taintrm defdistro-rpush defdistro-setup distropatches-reject dpkgsourceignores-correct drs-push-masterupdate drs-push-rejects dsd-divert fetch-localgitonly fetch-somegit-notlast forcesplit-linear forcesplit-overwrite gbp-orig gitconfig gitworktree import-dsc import-maintmangle import-native import-nonnative import-tarbomb inarchivecopy mismatches-contents mismatches-dscchanges multisuite orig-include-exclude orig-include-exclude-chkquery overwrite-chkclog overwrite-junk overwrite-splitbrains overwrite-version pbuilder protocol-compat push-buildproductsdir push-newpackage push-newrepeat push-nextdgit push-source push-source-with-changes quilt quilt-gbp quilt-gbp-build-modes quilt-include-binaries quilt-singlepatch quilt-splitbrains quilt-useremail rpush rpush-quilt rpush-source sourceonlypolicy tag-updates unrepresentable unrepresentable-single-dpkg unrepresentable-single-git version-opt
Tests-Directory: tests/tests
Depends: dgit, dgit-infrastructure, devscripts, debhelper (>=8), fakeroot, build-essential, chiark-utils-bin, bc, faketime, liburi-perl
diff --git a/dgit-badcommit-fixup b/dgit-badcommit-fixup
deleted file mode 100755
index 3e4a718..0000000
--- a/dgit-badcommit-fixup
+++ /dev/null
@@ -1,333 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Script to help with fallout from #849041.
-#
-# usage:
-# dgit-badcommit-fixup --check
-# dgit-badcommit-fixup --test
-# dgit-badcommit-fixup --real
-
-# Update procedure, from server operator's point of view:
-#
-# 1. Test in an offline tree that this DTRT
-#
-# 2. Announce a transition time. Tell everyone that between
-# the transition time and their next upload, they must
-# run this script.
-#
-# 3. At the transition time, run this script in every repo.
-#
-# 4. Run the mirror script to push changes, if necessary.
-
-END { $? = $Debian::Dgit::ExitStatus::desired // -1; };
-use Debian::Dgit::ExitStatus;
-
-use strict;
-
-use POSIX;
-use IPC::Open2;
-use Data::Dumper;
-
-our $our_version = 'UNRELEASED'; ###substituted###
-
-my $real;
-
-foreach my $a (@ARGV) {
- if ($a eq '--test') {
- $real = 0;
- } elsif ($a eq '--real') {
- $real = 1;
- } elsif ($a eq '--check') {
- $real = -1;
- } else {
- die "$a ?";
- }
-}
-
-die unless defined $real;
-
-my $gcfpid = open2 \*GCFO, \*GCFI, 'git cat-file --batch' or die $!;
-
-our %count;
-
-no warnings qw(recursion);
-
-sub runcmd {
- system @_ and die "@_ $! $?";
-}
-
-$!=0; $?=0;
-my $bare = `git rev-parse --is-bare-repository`;
-die "$? $!" if $?;
-chomp $bare or die;
-
-our @configs;
-foreach my $k (qw(core.sharedRepository)) {
- $?=0; $!=0; my $v = `set -x; git config --local $k`;
- if (defined $v && $?==0 && chomp $v) {
- push @configs, [ $k, $v ];
- } elsif (defined $v && $?==256 && $v eq '') {
- } else {
- die "git-config --local $k => $v $? $! ?";
- }
-}
-
-sub getobj ($$) {
- my ($obj, $type) = @_;
- print GCFI $obj, "\n" or die $!;
- my $x = <GCFO>;
- my ($gtype, $gsize) = $x =~ m/^\w+ (\w+) (\d+)\n/ or die "$obj ?";
- $gtype eq $type or die "$obj $gtype != $type ?";
- my $gdata;
- (read GCFO, $gdata, $gsize) == $gsize or die "$obj $!";
- $x = <GCFO>;
- $x eq "\n" or die "$obj ($_) $!";
- $count{inspected}++;
- return $gdata;
-}
-
-sub hashobj ($$) {
- my ($data,$type) = @_;
- my $gwopid = open2 \*GWO, \*GWI,
- "git hash-object -w -t $type --stdin"
- or die $!;
- print GWI $data or die $!;
- close GWI or die $!;
- $_ = <GWO>;
- close GWO or die $!;
- waitpid $gwopid,0 == $gwopid or die $!;
- die $? if $?;
- m/^(\w+)\n/ or die "$_ ?";
- $count{"rewritten $type"}++;
- return $1;
-}
-
-our %memo;
-
-sub rewrite_commit ($);
-sub rewrite_commit ($) {
- my ($obj) = @_;
- my $m = \ $memo{$obj};
- return $$m if defined $$m;
- my $olddata = getobj $obj, 'commit';
- $olddata =~ m/(?<=\n)(?=\n)/ or die "$obj ?";
- my $msg = $';
- local $_ = $`;
- s{^(parent )(\w+)$}{ $1 . rewrite_commit($2) }gme;
- $count{'fix overwrite'} += s{^commiter }{committer }gm;
- if (!m{^author }m && !m{^committer }m) {
- m{^parent (\w+)}m or die "$obj ?";
- my $parent = getobj $1, 'commit';
- $parent =~ m/^(?:.+\n)+(author .*\ncommitter .*\n)/;
- m/\n$/ or die "$obj ?";
- $_ .= $1;
- $count{'fix import'}++;
- }
- my $newdata = $_.$msg;
- my $newobj;
- if ($newdata eq $olddata) {
- $newobj = $obj;
- $count{unchanged}++;
-#print STDERR "UNCHANGED $obj\n";
- } else {
- $newobj = hashobj $newdata, 'commit';
-#print STDERR "REWRITTEN $obj $newobj\n";
- }
- $$m= $newobj;
- return $newobj;
-}
-
-our @updates;
-
-sub filter_updates () {
- @updates = grep { $_->[1] ne $_->[2] } @updates;
-}
-
-sub rewrite_tag ($) {
- my ($obj) = @_;
- $_ = getobj $obj, 'tag';
- m/^type (\w+)\n/m or die "$obj ?";
- if ($1 ne 'commit') {
- $count{"oddtags $1"}++;
- return $obj;
- }
- m/^object (\w+)\n/m or die "$obj ?";
- my $oldref = $1;
- my $newref = rewrite_commit $oldref;
- if ($oldref eq $newref) {
- return $obj;
- }
- s/^(object )\w+$/ $1.$newref /me or die "$obj ($_) ?";
- s/^-----BEGIN PGP SIGNATURE-----\n.*^-----END PGP SIGNATURE-----\n$//sm;
- return hashobj $_, 'tag';
-}
-
-sub edit_rewrite_map ($) {
- my ($old) = @_;
-
- filter_updates();
- return $old unless @updates;
-
- my $td = 'dgit-broken-fixup.tmp';
- runcmd qw(rm -rf), $td;
- mkdir $td, 0700 or die "$td $!";
- chdir $td or die $!;
- runcmd qw(git init -q);
- runcmd qw(git config gc.auto 0);
- runcmd qw(rm -rf .git/objects);
- symlink "../../objects", ".git/objects" or die $!;
- foreach my $c (@configs) {
- runcmd qw(git config), $c->[0], $c->[1];
- }
-
- my %map;
-
- if ($old) {
- runcmd qw(git checkout -q), $old;
- open M, "map" or die $!;
- while (<M>) {
- m/^(\w+)(?:\s+(\w+))?$/ or die;
- $map{$1} = $2;
- $count{rewrite_map_previous}++;
- }
- M->error and die $!;
- close M or die $!;
- }
-
- foreach my $oldc (keys %memo) {
- my $newc = $memo{$oldc};
- next if $oldc eq $newc;
- $map{$oldc} = $newc;
- }
- foreach my $up (@updates) { # catches tags
- $map{ $up->[1] } = $up->[2];
- }
-
- open M, ">", "map" or die $!;
- printf M "%s%s\n",
- $_, (defined $map{$_} ? " $map{$_}" : "")
- or die $!
- foreach keys %map;
- close M or die $!;
-
- if (!$old) {
- runcmd qw(git add map);
- }
-
- runcmd qw(git commit -q), qw(-m), <<END, qw(map);
-dgit-badcommit-fixup
-
-[dgit-badcommit-fixup $our_version]
-END
-
- $!=0; $?=0;
- my $new = `git rev-parse HEAD`;
- die "$? $!" if $?;
- chomp $new or die;
-
- chdir '..' or die $!;
- runcmd qw(rm -rf), $td;
-
- $count{rewrite_map_updated}++;
-
- return $new;
-}
-
-$!=0; $?=0;
-my $refs=`git for-each-ref`;
-die "$? $!" if $?;
-
-chomp $refs;
-
-our $org_rewrite_map;
-
-foreach my $rline (split /\n/, $refs) {
- my ($obj, $type, $refname) =
- $rline =~ m/^(\w+)\s+(\w+)\s+(\S.*)/
- or die "$_ ?";
- if ($refname eq 'refs/dgit-rewrite/map') {
- $org_rewrite_map = $obj;
- next;
- }
- next if $refname =~ m{^refs/dgit-(?:badcommit|badfixuptest)/};
-
- $!=0; $?=0;
- system qw(sh -ec),
- 'exec >/dev/null git symbolic-ref -q "$1"', qw(x),
- $refname;
- if ($?==0) {
- $count{symrefs_ignored}++;
- next;
- }
- die "$? $!" unless $?==256;
-
- my $rewrite;
- if ($type eq 'commit') {
- $rewrite = rewrite_commit($obj);
- } elsif ($type eq 'tag') {
- $rewrite = rewrite_tag($obj);
- } else {
- warn "ref $refname refers to $type\n";
- next;
- }
- push @updates, [ $refname, $obj, $rewrite ];
-}
-
-if ($bare eq 'true') {
- my $new_rewrite_map = edit_rewrite_map($org_rewrite_map);
- push @updates, [ 'refs/dgit-rewrite/map',
- ($org_rewrite_map // '0'x40),
- ($new_rewrite_map // '0'x40),
- 1 ];
-}
-
-filter_updates();
-
-if (!@updates) {
- print Dumper(\%count), "all is well - nothing to do\n";
- finish 0;
-}
-
-#print Dumper(\@updates);
-
-open U, "|git update-ref -m 'dgit bad commit fixup' --stdin" or die $!
- if $real >= 0;
-
-for my $up (@updates) {
- my ($ref, $old, $new, $nobackup) = @$up;
- my $otherref = $ref;
- $otherref =~ s{^refs/}{};
- if ($real > 0) {
- print U <<END or die $! unless $nobackup;
-create refs/dgit-badcommit/$otherref $old
-END
- print U <<END or die $!;
-update $ref $new $old
-END
- } elsif ($real==0) {
- print U <<END or die $!;
-update refs/dgit-badfixuptest/$otherref $new
-END
- } else {
- print "found trouble in history of $ref\n" or die $!;
- }
-}
-
-if ($real >= 0) {
- $?=0; $!=0;
- close U or die "$? $!";
- die $? if $?;
-}
-
-print Dumper(\%count);
-
-if ($real >= 0) {
- print "old values saved in refs/dgit-badcommit/\n" or die $!;
-} elsif ($real == 0) {
- print "testing output saved in refs/dgit-badfixuptest/\n" or die $!;
-} else {
- print STDERR "found work to do, exiting status 2\n";
- finish 2;
-}
-
-finish 0;
diff --git a/tests/tests/badcommit-rewrite b/tests/tests/badcommit-rewrite
deleted file mode 100755
index f116723..0000000
--- a/tests/tests/badcommit-rewrite
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-set -e
-. tests/lib
-
-t-setup-import examplegit
-t-tstunt-parsechangelog
-
-cd $tmp/git/$p.git
-git config core.sharedRepository true
-chmod -R g+w objects
-umask 022
-
-cd $tmp/example
-
-suite=stable
-
-t-commit 'No changes, just send to stable' '' stable
-
-t-make-badcommit
-git reset --hard $badcommit
-
-t-dgit -wgf build
-t-dgit push-built --overwrite=1.2 stable
-t-archive-process-incoming stable
-
-rstable=refs/remotes/dgit/dgit/stable
-
-t-dgit fetch stable
-t-has-parent-or-is $rstable $badcommit
-
-fixup=${DGIT_BADCOMMIT_FIXUP-dgit-badcommit-fixup}
-
-cd $tmp/git/$p.git
-git gc --aggressive --prune=all
-rmdir objects/* ||:
-
-$fixup --real
-
-cd $tmp/$p
-git symbolic-ref HEAD >../sym.before
-git rev-parse HEAD >../ref.before
-
-$fixup --real
-
-git symbolic-ref HEAD >../sym.after
-git rev-parse HEAD >../ref.after
-diff ../sym.before ../sym.after
-set +e; diff ../ref.before ../ref.after; rc=$?; set -e; test $rc = 1
-
-t-dgit fetch stable
-
-t-expect-fail "child $rstable lacks parent $badcommit" \
-t-has-parent-or-is $rstable $badcommit
-
-check_shared () {
- find "$1" -perm -200 \! -perm -020 -ls |tee $tmp/badperm
- test -f $tmp/badperm -a ! -s $tmp/badperm
-}
-
-check_shared $tmp/git/$p.git/objects
-
-t-ok