Hi, in c7b190dabd (fetch: implement support for atomic reference updates, 2021-01-12), I have added a new `--atomic` flag to git-fetch(1) which is supposed to make it an all-or-nothing operation: either all refs are updated, or none is. I have recently discovered though that there were two oversights: neither pruning of refs via `--prune` nor the tag backfill mechanism are currently covered by this flag, which breaks the promise. This patch series extends coverage of the `--atomic` flag to fix my oversights. It applies on top of ps/avoid-unnecessary-hook-invocation-with-packed-refs merged to v2.35.1 due to a semantic conflict in tests: I use the reftx hook to verify some things work as expected, and above branch causes us to not execute the hook for packed-refs anymore. It is structured as follows: - Patch 1 adds multiple tests which demonstrate issues with backfilling and the lacking atomicity. - Patch 2 and 3 do some preliminary refactorings which set the stage for improved atomicity. - Patch 4 fixes a bug with backfilling tags: we don't return an error code to the user if the backfill fails. - Patch 5 and 6 then finally extend the atomicity guarantees. I'm not yet all that happy with patch 5: it currently has to reach into the `ref_transaction` struct to be able to filter out any updates which have already been queued such that we don't accidentally queue the same tag update twice. I first wanted to get some feedback on this patch series though, and in case it is agreed that it fixes a real issue I may introduce a new non-internal API which allows iterating over queued updates. Patrick Patrick Steinhardt (6): fetch: increase test coverage of fetches fetch: backfill tags before setting upstream fetch: control lifecycle of FETCH_HEAD in a single place fetch: report errors when backfilling tags fails fetch: make `--atomic` flag cover backfilling of tags fetch: make `--atomic` flag cover pruning of refs builtin/fetch.c | 190 +++++++++++++++++++++++++++++-------------- t/t5503-tagfollow.sh | 78 ++++++++++++++++++ t/t5510-fetch.sh | 31 +++++++ 3 files changed, 236 insertions(+), 63 deletions(-) -- 2.35.1
Attachment:
signature.asc
Description: PGP signature