We disabled the checksum check because it was rather expensive, but actually we also store timestamps in packing-lists
This is a first draft at a better check. What this does: - compare the fs timestamp with the packing-list timestamp. This should be very cheap in most cases, since we're already inthe directory ready to delete the file. - IF the timestamp doesn't match, we go run the checksum before deleting the file. There might be some fringe cases I haven't seen, so see this more as a POC than a finished diff, but I'm curious if there are still many packages that diddle their installed bits after install. feedback welcome. Index: OpenBSD/Delete.pm =================================================================== RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/Delete.pm,v retrieving revision 1.160 diff -u -p -r1.160 Delete.pm --- OpenBSD/Delete.pm 24 Jul 2019 18:05:26 -0000 1.160 +++ OpenBSD/Delete.pm 30 Oct 2021 15:57:38 -0000 @@ -432,7 +432,21 @@ sub is_intact $state->log("Couldn't delete #1 (no checksum)", $realname); return 0; } - return 1 unless $state->defines('checksum'); + my $force_checksum = 0; + if (defined $self->{ts}) { + my @s = stat $realname; + if (@s == 0) { + $state->say("Couldn't stat #1", $realname); + return 0; + } + if ($s[9] != $self->{ts}) { + $force_checksum = 1; + $state->say("Found possibly modified file #1", $realname); + } + } + if (!$force_checksum) { + return 1 unless $state->defines('checksum'); + } my $d = $self->compute_digest($realname, $self->{d}); return 1 if $d->equals($self->{d}); if ($self->fullname eq $realname) {