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

[PATCH 1/3] add quieter versions of parse_{tree,commit}

From
Jeff King <peff@peff.net>
Date
Jun 1, 2015, 09:56 UTC
Message-ID
<20150601095625.GA31389@peff.net>
In-Reply-To
<20150601095410.GA16976@peff.net>

When we call parse_commit, it will complain to stderr if the object does not exist or cannot be read. This means that we may produce useless error messages if this situation is expected (e.g., because the object is marked UNINTERESTING, or because revs->ignore_missing_links is set).

We can fix this by adding a new "parse_X_gently" form that takes a flag to suppress the messages. The existing "parse_X" form is already gentle in the sense that it returns an error rather than dying, and we could in theory just add a "quiet" flag to it (with existing callers passing "0"). But doing it this way means we do not have to disturb existing callers.

Note also that the new flag is "quiet_on_missing", and not just "quiet". We could add a flag to suppress _all_ errors, but besides being a more invasive change (we would have to pass the flag down to sub-functions, too), there is a good reason not to: we would never want to use it. Missing a linked object is expected in some circumstances, but it is never expected to have a malformed commit, or to get a tree when we wanted a commit. We should always complain about these corruptions.

Signed-off-by: Jeff King <peff@peff.net>
---
 commit.c | 5 +++--
 commit.h | 6 +++++-
 tree.c   | 5 +++--
 tree.h   | 6 +++++-
 4 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/commit.c b/commit.c
index 2d9de80..6e2103c 100644
--- a/commit.c
+++ b/commit.c
@@ -357,7 +357,7 @@ int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long s
 	return 0;
 }
 
-int parse_commit(struct commit *item)
+int parse_commit_gently(struct commit *item, int quiet_on_missing)
 {
 	enum object_type type;
 	void *buffer;
@@ -370,7 +370,8 @@ int parse_commit(struct commit *item)
 		return 0;
 	buffer = read_sha1_file(item->object.sha1, &type, &size);
 	if (!buffer)
-		return error("Could not read %s",
+		return quiet_on_missing ? -1 :
+			error("Could not read %s",
 			     sha1_to_hex(item->object.sha1));
 	if (type != OBJ_COMMIT) {
 		free(buffer);
diff --git a/commit.h b/commit.h
index ed3a1d5..9a1fa96 100644
--- a/commit.h
+++ b/commit.h
@@ -59,7 +59,11 @@ struct commit *lookup_commit_reference_by_name(const char *name);
 struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name);
 
 int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size);
-int parse_commit(struct commit *item);
+int parse_commit_gently(struct commit *item, int quiet_on_missing);
+static inline int parse_commit(struct commit *item)
+{
+	return parse_commit_gently(item, 0);
+}
 void parse_commit_or_die(struct commit *item);
 
 /*
diff --git a/tree.c b/tree.c
index 58ebfce..413a5b1 100644
--- a/tree.c
+++ b/tree.c
@@ -204,7 +204,7 @@ int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size)
 	return 0;
 }
 
-int parse_tree(struct tree *item)
+int parse_tree_gently(struct tree *item, int quiet_on_missing)
 {
 	 enum object_type type;
 	 void *buffer;
@@ -214,7 +214,8 @@ int parse_tree(struct tree *item)
 		return 0;
 	buffer = read_sha1_file(item->object.sha1, &type, &size);
 	if (!buffer)
-		return error("Could not read %s",
+		return quiet_on_missing ? -1 :
+			error("Could not read %s",
 			     sha1_to_hex(item->object.sha1));
 	if (type != OBJ_TREE) {
 		free(buffer);
diff --git a/tree.h b/tree.h
index d24125f..d24786c 100644
--- a/tree.h
+++ b/tree.h
@@ -16,7 +16,11 @@ struct tree *lookup_tree(const unsigned char *sha1);
 
 int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size);
 
-int parse_tree(struct tree *tree);
+int parse_tree_gently(struct tree *tree, int quiet_on_missing);
+static inline int parse_tree(struct tree *tree)
+{
+	return parse_tree_gently(tree, 0);
+}
 void free_tree_buffer(struct tree *tree);
 
 /* Parses and returns the tree in the given ent, chasing tags and commits. */
-- 
2.4.2.690.g2a79674
Previous: Jeff KingNext: Jeff King
Message 10 of 15 in “git gc gives "error: Could not read..."”
  1. Stefan NäweJun 1, 2015
  2. Jeff KingJun 1, 2015
  3. Stefan NäweJun 1, 2015
  4. Jeff KingJun 1, 2015
  5. Stefan NäweJun 1, 2015
  6. Jeff KingJun 1, 2015
  7. Stefan NäweJun 1, 2015
  8. Jeff KingJun 1, 2015
  9. 0/3 silence missing-link warnings in some casesJeff King, Jun 1, 2015
  10. 1/3 add quieter versions of parse_{tree,commit}Jeff King, Jun 1, 2015
  11. 2/3 silence broken link warnings with revs->ignore_missing_linksJeff King, Jun 1, 2015
  12. 3/3 suppress errors on missing UNINTERESTING linksJeff King, Jun 1, 2015
  13. Junio C HamanoJun 1, 2015
  14. Jeff KingJun 1, 2015
  15. Junio C HamanoJun 1, 2015

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.