mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 13:04:42 +00:00
submodule: catch when submodule is not staged on update
When calling `git_submodule_update` on a submodule, we have to retrieve the ID of the submodule entry in the index. If the function is called on a submodule which is only partly initialized, the submodule entry may not be added to the index yet. This leads to an assert when trying to look up the blob later on. Fix the issue by checking if the index actually holds the submodule's ID and erroring out if it does not.
This commit is contained in:
parent
53454be87f
commit
32ecc98e51
@ -1212,6 +1212,8 @@ int git_submodule_update(git_submodule *sm, int init, git_submodule_update_optio
|
|||||||
(error = git_checkout_head(sub_repo, &update_options.checkout_opts)) != 0)
|
(error = git_checkout_head(sub_repo, &update_options.checkout_opts)) != 0)
|
||||||
goto done;
|
goto done;
|
||||||
} else {
|
} else {
|
||||||
|
const git_oid *oid;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Work dir is initialized - look up the commit in the parent repository's index,
|
* Work dir is initialized - look up the commit in the parent repository's index,
|
||||||
* update the workdir contents of the subrepository, and set the subrepository's
|
* update the workdir contents of the subrepository, and set the subrepository's
|
||||||
@ -1220,8 +1222,14 @@ int git_submodule_update(git_submodule *sm, int init, git_submodule_update_optio
|
|||||||
if ((error = git_submodule_open(&sub_repo, sm)) < 0)
|
if ((error = git_submodule_open(&sub_repo, sm)) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
if ((oid = git_submodule_index_id(sm)) == NULL) {
|
||||||
|
giterr_set(GITERR_SUBMODULE, "could not get ID of submodule in index");
|
||||||
|
error = -1;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
/* Look up the target commit in the submodule. */
|
/* Look up the target commit in the submodule. */
|
||||||
if ((error = git_object_lookup(&target_commit, sub_repo, git_submodule_index_id(sm), GIT_OBJ_COMMIT)) < 0) {
|
if ((error = git_object_lookup(&target_commit, sub_repo, oid, GIT_OBJ_COMMIT)) < 0) {
|
||||||
/* If it isn't found then fetch and try again. */
|
/* If it isn't found then fetch and try again. */
|
||||||
if (error != GIT_ENOTFOUND || !update_options.allow_fetch ||
|
if (error != GIT_ENOTFOUND || !update_options.allow_fetch ||
|
||||||
(error = lookup_default_remote(&remote, sub_repo)) < 0 ||
|
(error = lookup_default_remote(&remote, sub_repo)) < 0 ||
|
||||||
|
Loading…
Reference in New Issue
Block a user