static void test_get_commit_tree_in_graph(const char *gitdir, const char *worktree, const struct object_id *commit_oid) { struct repository r; struct commit *c; struct tree *tree; setup_git_env(gitdir); if (repo_init(&r, gitdir, worktree)) die("Couldn't init repo"); c = lookup_commit(&r, commit_oid); /* * get_commit_tree_in_graph does not automatically parse the commit, so * parse it first. */ if (!parse_commit_in_graph(&r, c)) die("Couldn't parse commit"); tree = get_commit_tree_in_graph(&r, c); if (!tree) die("Couldn't get commit tree"); printf("%s\n", oid_to_hex(&tree->object.oid)); repo_clear(&r); }
/* * Initialize 'repo' based on the provided 'gitdir'. * Return 0 upon success and a non-zero value upon failure. */ int repo_init(struct repository *repo, const char *gitdir, const char *worktree) { struct repository_format format; memset(repo, 0, sizeof(*repo)); repo->objects = raw_object_store_new(); if (repo_init_gitdir(repo, gitdir)) goto error; if (read_and_verify_repository_format(&format, repo->commondir)) goto error; repo_set_hash_algo(repo, format.hash_algo); if (worktree) repo_set_worktree(repo, worktree); return 0; error: repo_clear(repo); return -1; }
static void test_parse_commit_in_graph(const char *gitdir, const char *worktree, const struct object_id *commit_oid) { struct repository r; struct commit *c; struct commit_list *parent; setup_git_env(gitdir); if (repo_init(&r, gitdir, worktree)) die("Couldn't init repo"); c = lookup_commit(&r, commit_oid); if (!parse_commit_in_graph(&r, c)) die("Couldn't parse commit"); printf("%"PRItime, c->date); for (parent = c->parents; parent; parent = parent->next) printf(" %s", oid_to_hex(&parent->item->object.oid)); printf("\n"); repo_clear(&r); }
static int grep_submodule(struct grep_opt *opt, struct repository *superproject, const struct pathspec *pathspec, const struct object_id *oid, const char *filename, const char *path) { struct repository submodule; int hit; if (!is_submodule_active(superproject, path)) return 0; if (repo_submodule_init(&submodule, superproject, path)) return 0; repo_read_gitmodules(&submodule); /* * NEEDSWORK: This adds the submodule's object directory to the list of * alternates for the single in-memory object store. This has some bad * consequences for memory (processed objects will never be freed) and * performance (this increases the number of pack files git has to pay * attention to, to the sum of the number of pack files in all the * repositories processed so far). This can be removed once the object * store is no longer global and instead is a member of the repository * object. */ grep_read_lock(); add_to_alternates_memory(submodule.objectdir); grep_read_unlock(); if (oid) { struct object *object; struct tree_desc tree; void *data; unsigned long size; struct strbuf base = STRBUF_INIT; object = parse_object_or_die(oid, oid_to_hex(oid)); grep_read_lock(); data = read_object_with_reference(object->oid.hash, tree_type, &size, NULL); grep_read_unlock(); if (!data) die(_("unable to read tree (%s)"), oid_to_hex(&object->oid)); strbuf_addstr(&base, filename); strbuf_addch(&base, '/'); init_tree_desc(&tree, data, size); hit = grep_tree(opt, pathspec, &tree, &base, base.len, object->type == OBJ_COMMIT, &submodule); strbuf_release(&base); free(data); } else { hit = grep_cache(opt, &submodule, pathspec, 1); } repo_clear(&submodule); return hit; }