static int check_ancestors(const char *prefix) { struct rev_info revs; struct object_array pending_copy; int res; bisect_rev_setup(&revs, prefix, "^%s", "%s", 0); /* Save pending objects, so they can be cleaned up later. */ pending_copy = revs.pending; revs.leak_pending = 1; /* * bisect_common calls prepare_revision_walk right away, which * (together with .leak_pending = 1) makes us the sole owner of * the list of pending objects. */ bisect_common(&revs); res = (revs.commits != NULL); /* Clean up objects used, as they will be reused. */ clear_commit_marks_for_object_array(&pending_copy, ALL_REV_FLAGS); free(pending_copy.objects); return res; }
int verify_bundle(struct bundle_header *header, int verbose) { /* * Do fast check, then if any prereqs are missing then go line by line * to be verbose about the errors */ struct ref_list *p = &header->prerequisites; struct rev_info revs; const char *argv[] = {NULL, "--all", NULL}; struct object_array refs; struct commit *commit; int i, ret = 0, req_nr; const char *message = "Repository lacks these prerequisite commits:"; init_revisions(&revs, NULL); for (i = 0; i < p->nr; i++) { struct ref_list_entry *e = p->list + i; struct object *o = parse_object(e->sha1); if (o) { o->flags |= PREREQ_MARK; add_pending_object(&revs, o, e->name); continue; } if (++ret == 1) error("%s", message); error("%s %s", sha1_to_hex(e->sha1), e->name); } if (revs.pending.nr != p->nr) return ret; req_nr = revs.pending.nr; setup_revisions(2, argv, &revs, NULL); refs = revs.pending; revs.leak_pending = 1; if (prepare_revision_walk(&revs)) die("revision walk setup failed"); i = req_nr; while (i && (commit = get_revision(&revs))) if (commit->object.flags & PREREQ_MARK) i--; for (i = 0; i < req_nr; i++) if (!(refs.objects[i].item->flags & SHOWN)) { if (++ret == 1) error("%s", message); error("%s %s", sha1_to_hex(refs.objects[i].item->sha1), refs.objects[i].name); } clear_commit_marks_for_object_array(&refs, ALL_REV_FLAGS); free(refs.objects); if (verbose) { struct ref_list *r; r = &header->references; printf("The bundle contains %d ref%s\n", r->nr, (1 < r->nr) ? "s" : ""); list_refs(r, 0, NULL); r = &header->prerequisites; printf("The bundle requires these %d ref%s\n", r->nr, (1 < r->nr) ? "s" : ""); list_refs(r, 0, NULL); } return ret; }