1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-07 02:16:09 +02:00

submodule: make static functions read submodules from commits

A future commit will teach "fetch --recurse-submodules" to fetch
unpopulated submodules. To prepare for this, teach the necessary static
functions how to read submodules from superproject commits using a
"treeish_name" argument (instead of always reading from the index and
filesystem) but do not actually change where submodules are read from.
Submodules will be read from commits when we fetch unpopulated
submodules.

Signed-off-by: Glen Choo <chooglen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Glen Choo 2022-03-07 16:14:27 -08:00 committed by Junio C Hamano
parent d1d1572e75
commit 7c2f8cc58c

View File

@ -932,6 +932,7 @@ struct has_commit_data {
struct repository *repo;
int result;
const char *path;
const struct object_id *super_oid;
};
static int check_has_commit(const struct object_id *oid, void *data)
@ -940,7 +941,7 @@ static int check_has_commit(const struct object_id *oid, void *data)
struct repository subrepo;
enum object_type type;
if (repo_submodule_init(&subrepo, cb->repo, cb->path, null_oid())) {
if (repo_submodule_init(&subrepo, cb->repo, cb->path, cb->super_oid)) {
cb->result = 0;
goto cleanup;
}
@ -968,9 +969,15 @@ static int check_has_commit(const struct object_id *oid, void *data)
static int submodule_has_commits(struct repository *r,
const char *path,
const struct object_id *super_oid,
struct oid_array *commits)
{
struct has_commit_data has_commit = { r, 1, path };
struct has_commit_data has_commit = {
.repo = r,
.result = 1,
.path = path,
.super_oid = super_oid
};
/*
* Perform a cheap, but incorrect check for the existence of 'commits'.
@ -1017,7 +1024,7 @@ static int submodule_needs_pushing(struct repository *r,
const char *path,
struct oid_array *commits)
{
if (!submodule_has_commits(r, path, commits))
if (!submodule_has_commits(r, path, null_oid(), commits))
/*
* NOTE: We do consider it safe to return "no" here. The
* correct answer would be "We do not know" instead of
@ -1277,7 +1284,7 @@ static void calculate_changed_submodule_paths(struct repository *r,
if (!path)
continue;
if (submodule_has_commits(r, path, commits)) {
if (submodule_has_commits(r, path, null_oid(), commits)) {
oid_array_clear(commits);
*name->string = '\0';
}
@ -1402,12 +1409,13 @@ static const struct submodule *get_non_gitmodules_submodule(const char *path)
}
static struct fetch_task *fetch_task_create(struct repository *r,
const char *path)
const char *path,
const struct object_id *treeish_name)
{
struct fetch_task *task = xmalloc(sizeof(*task));
memset(task, 0, sizeof(*task));
task->sub = submodule_from_path(r, null_oid(), path);
task->sub = submodule_from_path(r, treeish_name, path);
if (!task->sub) {
/*
* No entry in .gitmodules? Technically not a submodule,
@ -1439,11 +1447,12 @@ static void fetch_task_release(struct fetch_task *p)
}
static struct repository *get_submodule_repo_for(struct repository *r,
const char *path)
const char *path,
const struct object_id *treeish_name)
{
struct repository *ret = xmalloc(sizeof(*ret));
if (repo_submodule_init(ret, r, path, null_oid())) {
if (repo_submodule_init(ret, r, path, treeish_name)) {
free(ret);
return NULL;
}
@ -1464,7 +1473,7 @@ static int get_next_submodule(struct child_process *cp,
if (!S_ISGITLINK(ce->ce_mode))
continue;
task = fetch_task_create(spf->r, ce->name);
task = fetch_task_create(spf->r, ce->name, null_oid());
if (!task)
continue;
@ -1487,7 +1496,7 @@ static int get_next_submodule(struct child_process *cp,
continue;
}
task->repo = get_submodule_repo_for(spf->r, task->sub->path);
task->repo = get_submodule_repo_for(spf->r, task->sub->path, null_oid());
if (task->repo) {
struct strbuf submodule_prefix = STRBUF_INIT;
child_process_init(cp);