tree: simplify parse_tree_indirect()
authorRené Scharfe <l.s.r@web.de>
Thu, 29 Aug 2019 19:06:22 +0000 (21:06 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 3 Sep 2019 22:10:53 +0000 (15:10 -0700)
Reduce code duplication by turning parse_tree_indirect() into a wrapper
of repo_peel_to_type(). This avoids a segfault when handling a broken
tag where ->tagged is NULL. The new version also checks the return
value of parse_object() that was ignored by the old one.

Initial-patch-by: Stefan Sperling <stsp@stsp.name>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
tree.c
diff --git a/tree.c b/tree.c
index 4720945e6a68c4311458cc60e22c25edb07c375e..1466bcc6a8cf093970dc3d39e5554a61112548fd 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -244,19 +244,7 @@ void free_tree_buffer(struct tree *tree)
 
 struct tree *parse_tree_indirect(const struct object_id *oid)
 {
-       struct object *obj = parse_object(the_repository, oid);
-       do {
-               if (!obj)
-                       return NULL;
-               if (obj->type == OBJ_TREE)
-                       return (struct tree *) obj;
-               else if (obj->type == OBJ_COMMIT)
-                       obj = &(get_commit_tree(((struct commit *)obj))->object);
-               else if (obj->type == OBJ_TAG)
-                       obj = ((struct tag *) obj)->tagged;
-               else
-                       return NULL;
-               if (!obj->parsed)
-                       parse_object(the_repository, &obj->oid);
-       } while (1);
+       struct repository *r = the_repository;
+       struct object *obj = parse_object(r, oid);
+       return (struct tree *)repo_peel_to_type(r, NULL, 0, obj, OBJ_TREE);
 }