git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 4/7] fetch: report errors when backfilling tags fails

From
Patrick Steinhardt <ps@pks.im>
Date
Feb 21, 2022, 08:02 UTC
Message-ID
<a7e005dd482fe620839fe02b74b4bc55ae5b8850.1645430423.git.ps@pks.im>
In-Reply-To
<cover.1645430423.git.ps@pks.im>

When the backfilling of tags fails we do not report this error to the caller, but only report it implicitly at a later point when reporting updated references. This leaves callers unable to act upon the information of whether the backfilling succeeded or not.

Refactor the function to return an error code and pass it up the callstack. This causes us to correctly propagate the error back to the user of git-fetch(1).

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/fetch.c      | 26 ++++++++++++++++++--------
 t/t5503-tagfollow.sh |  4 +---
 2 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/builtin/fetch.c b/builtin/fetch.c
index f8adb40b45..d304314f16 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -1495,12 +1495,12 @@ static struct transport *prepare_transport(struct remote *remote, int deepen)
 	return transport;
 }
 
-static void backfill_tags(struct transport *transport,
-			  struct ref *ref_map,
-			  struct fetch_head *fetch_head,
-			  struct worktree **worktrees)
+static int backfill_tags(struct transport *transport,
+			 struct ref *ref_map,
+			 struct fetch_head *fetch_head,
+			 struct worktree **worktrees)
 {
-	int cannot_reuse;
+	int retcode, cannot_reuse;
 
 	/*
 	 * Once we have set TRANS_OPT_DEEPEN_SINCE, we can't unset it
@@ -1519,12 +1519,14 @@ static void backfill_tags(struct transport *transport,
 	transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, NULL);
 	transport_set_option(transport, TRANS_OPT_DEPTH, "0");
 	transport_set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, NULL);
-	fetch_and_consume_refs(transport, ref_map, fetch_head, worktrees);
+	retcode = fetch_and_consume_refs(transport, ref_map, fetch_head, worktrees);
 
 	if (gsecondary) {
 		transport_disconnect(gsecondary);
 		gsecondary = NULL;
 	}
+
+	return retcode;
 }
 
 static int do_fetch(struct transport *transport,
@@ -1632,8 +1634,16 @@ static int do_fetch(struct transport *transport,
 		struct ref *tags_ref_map = NULL, **tail = &tags_ref_map;
 
 		find_non_local_tags(remote_refs, &tags_ref_map, &tail);
-		if (tags_ref_map)
-			backfill_tags(transport, tags_ref_map, &fetch_head, worktrees);
+		if (tags_ref_map) {
+			/*
+			 * If backfilling of tags fails then we want to tell
+			 * the user so, but we have to continue regardless to
+			 * populate upstream information of the references we
+			 * have already fetched above.
+			 */
+			if (backfill_tags(transport, tags_ref_map, &fetch_head, worktrees))
+				retcode = 1;
+		}
 
 		free_refs(tags_ref_map);
 	}
diff --git a/t/t5503-tagfollow.sh b/t/t5503-tagfollow.sh
index 7dadaafd4b..27a1dfa3c0 100755
--- a/t/t5503-tagfollow.sh
+++ b/t/t5503-tagfollow.sh
@@ -233,9 +233,7 @@ test_expect_success 'backfill failure causes command to fail' '
 		done
 	EOF
 
-	# Even though we fail to create refs/tags/tag1 the below command
-	# unexpectedly succeeds.
-	git -C clone5 fetch .. $B:refs/heads/something &&
+	test_must_fail git -C clone5 fetch .. $B:refs/heads/something &&
 	test $B = $(git -C clone5 rev-parse --verify refs/heads/something) &&
 	test $S = $(git -C clone5 rev-parse --verify tag2) &&
 	test_must_fail git -C clone5 rev-parse --verify tag1
-- 
2.35.1
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 32 of 35 in “fetch: improve atomicity of `--atomic` flag”
  1. 0/7 fetch: improve atomicity of `--atomic` flagPatrick Steinhardt, Feb 17, 2022
  2. 1/7 fetch: increase test coverage of fetchesPatrick Steinhardt, Feb 17, 2022
  3. Christian CouderFeb 17, 2022
  4. Patrick SteinhardtFeb 21, 2022
  5. Junio C HamanoFeb 17, 2022
  6. Junio C HamanoFeb 17, 2022
  7. Patrick SteinhardtFeb 18, 2022
  8. Junio C HamanoFeb 18, 2022
  9. Junio C HamanoMar 3, 2022
  10. Patrick SteinhardtMar 3, 2022
  11. 2/7 fetch: backfill tags before setting upstreamPatrick Steinhardt, Feb 17, 2022
  12. Junio C HamanoFeb 17, 2022
  13. 3/7 fetch: control lifecycle of FETCH_HEAD in a single placePatrick Steinhardt, Feb 17, 2022
  14. Junio C HamanoFeb 17, 2022
  15. 4/7 fetch: report errors when backfilling tags failsPatrick Steinhardt, Feb 17, 2022
  16. Junio C HamanoFeb 17, 2022
  17. 6/7 fetch: make `--atomic` flag cover backfilling of tagsPatrick Steinhardt, Feb 17, 2022
  18. Junio C HamanoFeb 17, 2022
  19. 5/7 refs: add interface to iterate over queued transactional updatesPatrick Steinhardt, Feb 17, 2022
  20. 7/7 fetch: make `--atomic` flag cover pruning of refsPatrick Steinhardt, Feb 17, 2022
  21. Christian CouderFeb 17, 2022
  22. Junio C HamanoFeb 17, 2022
  23. 0/7 fetch: improve atomicity of `--atomic` flagPatrick Steinhardt, Feb 21, 2022
  24. 1/7 fetch: increase test coverage of fetchesPatrick Steinhardt, Feb 21, 2022
  25. Junio C HamanoMar 3, 2022
  26. Junio C HamanoMar 3, 2022
  27. Patrick SteinhardtMar 3, 2022
  28. Junio C HamanoMar 3, 2022
  29. Patrick SteinhardtMar 3, 2022
  30. 2/7 fetch: backfill tags before setting upstreamPatrick Steinhardt, Feb 21, 2022
  31. 3/7 fetch: control lifecycle of FETCH_HEAD in a single placePatrick Steinhardt, Feb 21, 2022
  32. 4/7 fetch: report errors when backfilling tags failsPatrick Steinhardt, Feb 21, 2022
  33. 5/7 refs: add interface to iterate over queued transactional updatesPatrick Steinhardt, Feb 21, 2022
  34. 6/7 fetch: make `--atomic` flag cover backfilling of tagsPatrick Steinhardt, Feb 21, 2022
  35. 7/7 fetch: make `--atomic` flag cover pruning of refsPatrick Steinhardt, Feb 21, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.