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

[PATCH 22/25] remote rm/prune: print a message when writing packed-refs fails

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Oct 15, 2014, 00:54 UTC
Message-ID
<20141015005448.GZ32245@google.com>
In-Reply-To
<20141015004522.GD32245@google.com>
From: Ronnie Sahlberg <sahlberg@google.com>
Date: Thu, 11 Sep 2014 08:42:57 -0700

Until v2.1.0-rc0~22^2~11 (refs.c: add an err argument to repack_without_refs, 2014-06-20), repack_without_refs forgot to provide an error message when commit_packed_refs fails. Even today, it only provides a message for callers that pass a non-NULL err parameter. Internal callers in refs.c pass non-NULL err but "git remote" does not.

That means that "git remote rm" and "git remote prune" can fail without printing a message about why. Fix them by passing in a non-NULL err parameter and printing the returned message.

This is the last caller to a ref handling function passing err == NULL. A later patch can drop support for err == NULL, avoiding such problems in the future.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 builtin/remote.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/builtin/remote.c b/builtin/remote.c
index 42a533a..7f28f92 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -749,13 +749,16 @@ static int mv(int argc, const char **argv)
 
 static int remove_branches(struct string_list *branches)
 {
+	struct strbuf err = STRBUF_INIT;
 	const char **branch_names;
 	int i, result = 0;
 
 	branch_names = xmalloc(branches->nr * sizeof(*branch_names));
 	for (i = 0; i < branches->nr; i++)
 		branch_names[i] = branches->items[i].string;
-	result |= repack_without_refs(branch_names, branches->nr, NULL);
+	if (repack_without_refs(branch_names, branches->nr, &err))
+		result |= error("%s", err.buf);
+	strbuf_release(&err);
 	free(branch_names);
 
 	for (i = 0; i < branches->nr; i++) {
@@ -1332,9 +1335,13 @@ static int prune_remote(const char *remote, int dry_run)
 		delete_refs = xmalloc(states.stale.nr * sizeof(*delete_refs));
 		for (i = 0; i < states.stale.nr; i++)
 			delete_refs[i] = states.stale.items[i].util;
-		if (!dry_run)
-			result |= repack_without_refs(delete_refs,
-						      states.stale.nr, NULL);
+		if (!dry_run) {
+			struct strbuf err = STRBUF_INIT;
+			if (repack_without_refs(delete_refs, states.stale.nr,
+						&err))
+				result |= error("%s", err.buf);
+			strbuf_release(&err);
+		}
 		free(delete_refs);
 	}
 
-- 
2.1.0.rc2.206.gedb03e5
Previous: Jonathan NiederNext: Jonathan Nieder
Message 23 of 28 in “rs/ref-transaction ("Use ref transactions", part 3)”
  1. 0/25 rs/ref-transaction ("Use ref transactions", part 3)Jonathan Nieder, Oct 15, 2014
  2. 01/25 mv test: recreate mod/ directory instead of relying on stale copyJonathan Nieder, Oct 15, 2014
  3. 02/25 wrapper.c: remove/unlink_or_warn: simplify, treat ENOENT as successJonathan Nieder, Oct 15, 2014
  4. 03/25 refs.c: lock_ref_sha1_basic is used for all refsJonathan Nieder, Oct 15, 2014
  5. 04/25 wrapper.c: add a new function unlink_or_msgJonathan Nieder, Oct 15, 2014
  6. 05/25 refs.c: add an err argument to delete_ref_looseJonathan Nieder, Oct 15, 2014
  7. 06/25 refs.c: pass the ref log message to _create/delete/update instead of _commitJonathan Nieder, Oct 15, 2014
  8. 07/25 rename_ref: don't ask read_ref_full where the ref came fromJonathan Nieder, Oct 15, 2014
  9. 08/25 refs.c: refuse to lock badly named refs in lock_ref_sha1_basicJonathan Nieder, Oct 15, 2014
  10. 09/25 refs.c: call lock_ref_sha1_basic directly from commitJonathan Nieder, Oct 15, 2014
  11. 10/25 refs.c: pass a list of names to skip to is_refname_availableJonathan Nieder, Oct 15, 2014
  12. 11/25 refs.c: ref_transaction_commit: distinguish name conflicts from other errorsJonathan Nieder, Oct 15, 2014
  13. 12/25 fetch.c: change s_update_ref to use a ref transactionJonathan Nieder, Oct 15, 2014
  14. 13/25 refs.c: make write_ref_sha1 staticJonathan Nieder, Oct 15, 2014
  15. 14/25 refs.c: change resolve_ref_unsafe reading argument to be a flags fieldJonathan Nieder, Oct 15, 2014
  16. 15/25 reflog test: test interaction with detached HEADJonathan Nieder, Oct 15, 2014
  17. 16/25 branch -d: avoid repeated symref resolutionJonathan Nieder, Oct 15, 2014
  18. 17/25 branch -d: simplify by using RESOLVE_REF_READINGJonathan Nieder, Oct 15, 2014
  19. 18/25 packed-ref cache: forbid dot-components in refnamesJonathan Nieder, Oct 15, 2014
  20. 19/25 test: put tests for handling of bad ref names in one placeJonathan Nieder, Oct 15, 2014
  21. 20/25 refs.c: allow listing and deleting badly named refsJonathan Nieder, Oct 15, 2014
  22. 21/25 for-each-ref: skip and warn about broken ref namesJonathan Nieder, Oct 15, 2014
  23. 22/25 remote rm/prune: print a message when writing packed-refs failsJonathan Nieder, Oct 15, 2014
  24. 23/25 refs.c: do not permit err == NULLJonathan Nieder, Oct 15, 2014
  25. 24/25 lockfile: remove unable_to_lock_errorJonathan Nieder, Oct 15, 2014
  26. 25/25 ref_transaction_commit: bail out on failure to remove a refJonathan Nieder, Oct 15, 2014
  27. Junio C HamanoOct 15, 2014
  28. Michael HaggertyOct 16, 2014

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.