Skip to content

Commit 9cc2b07

Browse files
peffgitster
authored andcommitted
add quieter versions of parse_{tree,commit}
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent fdf96a2 commit 9cc2b07

File tree

4 files changed

+16
-6
lines changed

4 files changed

+16
-6
lines changed

commit.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long s
353353
return 0;
354354
}
355355

356-
int parse_commit(struct commit *item)
356+
int parse_commit_gently(struct commit *item, int quiet_on_missing)
357357
{
358358
enum object_type type;
359359
void *buffer;
@@ -366,7 +366,8 @@ int parse_commit(struct commit *item)
366366
return 0;
367367
buffer = read_sha1_file(item->object.sha1, &type, &size);
368368
if (!buffer)
369-
return error("Could not read %s",
369+
return quiet_on_missing ? -1 :
370+
error("Could not read %s",
370371
sha1_to_hex(item->object.sha1));
371372
if (type != OBJ_COMMIT) {
372373
free(buffer);

commit.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ struct commit *lookup_commit_reference_by_name(const char *name);
5959
struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name);
6060

6161
int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size);
62-
int parse_commit(struct commit *item);
62+
int parse_commit_gently(struct commit *item, int quiet_on_missing);
63+
static inline int parse_commit(struct commit *item)
64+
{
65+
return parse_commit_gently(item, 0);
66+
}
6367
void parse_commit_or_die(struct commit *item);
6468

6569
/*

tree.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size)
198198
return 0;
199199
}
200200

201-
int parse_tree(struct tree *item)
201+
int parse_tree_gently(struct tree *item, int quiet_on_missing)
202202
{
203203
enum object_type type;
204204
void *buffer;
@@ -208,7 +208,8 @@ int parse_tree(struct tree *item)
208208
return 0;
209209
buffer = read_sha1_file(item->object.sha1, &type, &size);
210210
if (!buffer)
211-
return error("Could not read %s",
211+
return quiet_on_missing ? -1 :
212+
error("Could not read %s",
212213
sha1_to_hex(item->object.sha1));
213214
if (type != OBJ_TREE) {
214215
free(buffer);

tree.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ struct tree *lookup_tree(const unsigned char *sha1);
1515

1616
int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size);
1717

18-
int parse_tree(struct tree *tree);
18+
int parse_tree_gently(struct tree *tree, int quiet_on_missing);
19+
static inline int parse_tree(struct tree *tree)
20+
{
21+
return parse_tree_gently(tree, 0);
22+
}
1923
void free_tree_buffer(struct tree *tree);
2024

2125
/* Parses and returns the tree in the given ent, chasing tags and commits. */

0 commit comments

Comments
 (0)