зеркало из https://github.com/microsoft/git.git
101 строка
2.4 KiB
C
101 строка
2.4 KiB
C
#include "test-tool.h"
|
|
#include "cache.h"
|
|
#include "commit-graph.h"
|
|
#include "commit.h"
|
|
#include "config.h"
|
|
#include "object-store.h"
|
|
#include "object.h"
|
|
#include "repository.h"
|
|
#include "tree.h"
|
|
|
|
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);
|
|
|
|
memset(the_repository, 0, sizeof(*the_repository));
|
|
|
|
if (repo_init(&r, gitdir, worktree))
|
|
die("Couldn't init repo");
|
|
|
|
repo_set_hash_algo(the_repository, hash_algo_by_ptr(r.hash_algo));
|
|
|
|
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 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);
|
|
|
|
memset(the_repository, 0, sizeof(*the_repository));
|
|
|
|
if (repo_init(&r, gitdir, worktree))
|
|
die("Couldn't init repo");
|
|
|
|
repo_set_hash_algo(the_repository, hash_algo_by_ptr(r.hash_algo));
|
|
|
|
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);
|
|
}
|
|
|
|
int cmd__repository(int argc, const char **argv)
|
|
{
|
|
int nongit_ok = 0;
|
|
|
|
setup_git_directory_gently(&nongit_ok);
|
|
|
|
if (argc < 2)
|
|
die("must have at least 2 arguments");
|
|
if (!strcmp(argv[1], "parse_commit_in_graph")) {
|
|
struct object_id oid;
|
|
if (argc < 5)
|
|
die("not enough arguments");
|
|
if (parse_oid_hex(argv[4], &oid, &argv[4]))
|
|
die("cannot parse oid '%s'", argv[4]);
|
|
test_parse_commit_in_graph(argv[2], argv[3], &oid);
|
|
} else if (!strcmp(argv[1], "get_commit_tree_in_graph")) {
|
|
struct object_id oid;
|
|
if (argc < 5)
|
|
die("not enough arguments");
|
|
if (parse_oid_hex(argv[4], &oid, &argv[4]))
|
|
die("cannot parse oid '%s'", argv[4]);
|
|
test_get_commit_tree_in_graph(argv[2], argv[3], &oid);
|
|
} else {
|
|
die("unrecognized '%s'", argv[1]);
|
|
}
|
|
return 0;
|
|
}
|