[PATCH v4 0/5] fetch: implement support for atomic reference updates
From: Patrick Steinhardt <hidden>
Date: 2021-01-12 12:29:03
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 [off-list ref]
+
## 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
Attachments
- signature.asc [application/pgp-signature] 833 bytes