Subject: [PATCH v3 0/7] fetch: improve atomicity of `--atomic` flag

From: Patrick Steinhardt <[email-masked]>
Date: Mon, 21 Feb 2022 09:02:06 +0100

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 is the third version of this patch series fixing these issues. The
only change compared to v2 is a clarification in a comment to better
point out which type of backfilling is being tested.

Patrick

Patrick Steinhardt (7):
  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
  refs: add interface to iterate over queued transactional updates
  fetch: make `--atomic` flag cover backfilling of tags
  fetch: make `--atomic` flag cover pruning of refs

 builtin/fetch.c      | 192 +++++++++++++++++++++++++++++--------------
 refs.c               |  16 ++++
 refs.h               |  14 ++++
 t/t5503-tagfollow.sh |  74 +++++++++++++++++
 t/t5510-fetch.sh     |  29 +++++++
 5 files changed, 263 insertions(+), 62 deletions(-)

Range-diff against v2:
1:  b4ca3f1f3b ! 1:  081174b7a0 fetch: increase test coverage of fetches
    @@ t/t5503-tagfollow.sh: test_expect_success 'new clone fetch main and tags' '
     +test_expect_success 'atomic fetch with failing backfill' '
     +	git init clone3 &&
     +
    -+	# We want to test whether a failure when backfilling tags correctly
    ++	# We want to test whether a failure in `backfill_tags()` correctly
     +	# aborts the complete transaction when `--atomic` is passed: we should
     +	# neither create the branch nor should we create the tag when either
     +	# one of both fails to update correctly.
2:  b0a067bbc1 = 2:  9867e76ac7 fetch: backfill tags before setting upstream
3:  0b9d04622d = 3:  7c36ecbcf4 fetch: control lifecycle of FETCH_HEAD in a single place
4:  bc1e396ae0 = 4:  a7e005dd48 fetch: report errors when backfilling tags fails
5:  fac2e3555a = 5:  0316d770e9 refs: add interface to iterate over queued transactional updates
6:  331ee40e57 = 6:  2f98e34c84 fetch: make `--atomic` flag cover backfilling of tags
7:  2ad16530e5 = 7:  7292de826b fetch: make `--atomic` flag cover pruning of refs
-- 
2.35.1