Hi, this is the fourth version of my patch series to implement support for atomic reference updates for git-fetch(1). It's similar to `git push --atomic`, only that it applies to the local side. That is the fetch will either succeed and update all remote references or it will fail and update none. Changes compared to v3: - Fixed indentation of the switch statement in 1/5. - Added my missing SOB to 2/5 and fixed a typo in the commit message. Please see the attached range-diff for more details. Patrick Patrick Steinhardt (5): fetch: extract writing to FETCH_HEAD fetch: use strbuf to format FETCH_HEAD updates fetch: refactor `s_update_ref` to use common exit path fetch: allow passing a transaction to `s_update_ref()` fetch: implement support for atomic reference updates Documentation/fetch-options.txt | 4 + builtin/fetch.c | 228 +++++++++++++++++++++++--------- remote.h | 2 +- t/t5510-fetch.sh | 168 +++++++++++++++++++++++ 4 files changed, 342 insertions(+), 60 deletions(-) Range-diff against v3: 1: 61dc19a1ca ! 1: 9fcc8b54de fetch: extract writing to FETCH_HEAD @@ builtin/fetch.c: static int iterate_ref_map(void *cb_data, struct object_id *oid + return; + + switch (fetch_head_status) { -+ case FETCH_HEAD_NOT_FOR_MERGE: -+ merge_status_marker = "not-for-merge"; -+ break; -+ case FETCH_HEAD_MERGE: -+ merge_status_marker = ""; -+ break; -+ default: -+ /* do not write anything to FETCH_HEAD */ -+ return; ++ case FETCH_HEAD_NOT_FOR_MERGE: ++ merge_status_marker = "not-for-merge"; ++ break; ++ case FETCH_HEAD_MERGE: ++ merge_status_marker = ""; ++ break; ++ default: ++ /* do not write anything to FETCH_HEAD */ ++ return; + } + + fprintf(fetch_head->fp, "%s\t%s\t%s", 2: a19762690e ! 2: fb8542270a fetch: use strbuf to format FETCH_HEAD updates @@ Commit message This commit refactors `append_fetch_head()` to use a `struct strbuf` for formatting the update which we're about to append to the FETCH_HEAD file. While the refactoring doesn't have much of a benefit right now, it - servers as a preparatory step to implement atomic fetches where we need + serves as a preparatory step to implement atomic fetches where we need to buffer all updates to FETCH_HEAD and only flush them out if all reference updates succeeded. No change in behaviour is expected from this commit. + Signed-off-by: Patrick Steinhardt + ## builtin/fetch.c ## @@ builtin/fetch.c: static int iterate_ref_map(void *cb_data, struct object_id *oid) @@ builtin/fetch.c: static int open_fetch_head(struct fetch_head *fetch_head) fetch_head->fp = NULL; } @@ builtin/fetch.c: static void append_fetch_head(struct fetch_head *fetch_head, - return; + return; } - fprintf(fetch_head->fp, "%s\t%s\t%s", 3: c411f30e09 = 3: ba6908aa8c fetch: refactor `s_update_ref` to use common exit path 4: 865d357ba7 = 4: 7f820f6f83 fetch: allow passing a transaction to `s_update_ref()` 5: 6a79e7adcc = 5: 0b57d7a651 fetch: implement support for atomic reference updates -- 2.30.0