rev-list: handle missing tree objects properly
[gitweb.git] / list-objects.c
index ccc529e5e3e690cb9f5815e27d47cff3f7e9e7bf..243192af5352752472908ab9a61e80fb2b138829 100644 (file)
@@ -143,8 +143,7 @@ static void process_tree(struct traversal_context *ctx,
        struct rev_info *revs = ctx->revs;
        int baselen = base->len;
        enum list_objects_filter_result r = LOFR_MARK_SEEN | LOFR_DO_SHOW;
-       int gently = revs->ignore_missing_links ||
-                    revs->exclude_promisor_objects;
+       int failed_parse;
 
        if (!revs->tree_objects)
                return;
@@ -152,7 +151,9 @@ static void process_tree(struct traversal_context *ctx,
                die("bad tree object");
        if (obj->flags & (UNINTERESTING | SEEN))
                return;
-       if (parse_tree_gently(tree, gently) < 0) {
+
+       failed_parse = parse_tree_gently(tree, 1);
+       if (failed_parse) {
                if (revs->ignore_missing_links)
                        return;
 
@@ -165,7 +166,8 @@ static void process_tree(struct traversal_context *ctx,
                    is_promisor_object(&obj->oid))
                        return;
 
-               die("bad tree object %s", oid_to_hex(&obj->oid));
+               if (!revs->do_not_die_on_missing_tree)
+                       die("bad tree object %s", oid_to_hex(&obj->oid));
        }
 
        strbuf_addstr(base, name);
@@ -180,7 +182,8 @@ static void process_tree(struct traversal_context *ctx,
        if (base->len)
                strbuf_addch(base, '/');
 
-       process_tree_contents(ctx, tree, base);
+       if (!failed_parse)
+               process_tree_contents(ctx, tree, base);
 
        if (!(obj->flags & USER_GIVEN) && ctx->filter_fn) {
                r = ctx->filter_fn(LOFS_END_TREE, obj,