submodule: fix NULL correctness in renamed broken submodules

When fetching with recursing into submodules, the fetch logic inspects
the superproject which submodules actually need to be fetched. This is
tricky for submodules that were renamed in the fetched range of commits.
This was implemented in c68f837576 (implement fetching of moved
submodules, 2017-10-16), and this patch fixes a mistake in the logic
there.

When the warning is printed, the `name` might be NULL as
default_name_or_path can return NULL, so fix the warning to use the path
as obtained from the diff machinery, as that is not NULL.

While at it, make sure we only attempt to load the submodule if a git
directory of the submodule is found as default_name_or_path will return
NULL in case the git directory cannot be found. Note that passing NULL
to submodule_from_name is just a semantic error, as submodule_from_name
accepts NULL as a value, but then the return value is not the submodule
that was asked for, but some arbitrary other submodule. (Cf. 'config_from'
in submodule-config.c: "If any parameter except the cache is a NULL
pointer just return the first submodule. Can be used to check whether
there are any submodules parsed.")

Reported-by: Duy Nguyen <pclouds@gmail.com>
Helped-by: Duy Nguyen <pclouds@gmail.com>
Helped-by: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Stefan Beller <sbeller@google.com>
Acked-by: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2018-06-14 10:31:07 -07:00 committed by Junio C Hamano
parent 68372c8879
commit 5fc84755f1

View File

@ -740,12 +740,14 @@ static void collect_changed_submodules_cb(struct diff_queue_struct *q,
else { else {
name = default_name_or_path(p->two->path); name = default_name_or_path(p->two->path);
/* make sure name does not collide with existing one */ /* make sure name does not collide with existing one */
submodule = submodule_from_name(the_repository, commit_oid, name); if (name)
submodule = submodule_from_name(the_repository,
commit_oid, name);
if (submodule) { if (submodule) {
warning("Submodule in commit %s at path: " warning("Submodule in commit %s at path: "
"'%s' collides with a submodule named " "'%s' collides with a submodule named "
"the same. Skipping it.", "the same. Skipping it.",
oid_to_hex(commit_oid), name); oid_to_hex(commit_oid), p->two->path);
name = NULL; name = NULL;
} }
} }