Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- submodule.c | 27 +++++++++++++++++++++++++++ submodule.h | 6 ++++++ 2 files changed, 33 insertions(+) diff --git a/submodule.c b/submodule.c index 4fcb64469e..68b123eb13 100644 --- a/submodule.c +++ b/submodule.c @@ -2074,6 +2074,33 @@ const char *get_superproject_working_tree(void) return ret; } +/* + * Returns 0 when the gitlink is found in the superprojects index, + * the value will be found in `oid`. Otherwise return -1. + */ +int get_superproject_gitlink(struct object_id *oid) +{ + struct child_process cp = CHILD_PROCESS_INIT; + struct strbuf sb = STRBUF_INIT; + const char *hash; + + if (start_ls_files_dot_dot(&cp, &sb) < 0) + return -1; + + if (!skip_prefix(sb.buf, "160000 ", &hash)) + /* + * superproject doesn't have a gitlink at submodule position or + * output is gibberish + */ + return -1; + + if (get_oid_hex(hash, oid)) + /* could not parse the object name */ + return -1; + + return 0; +} + /* * Put the gitdir for a submodule (given relative to the main * repository worktree) into `buf`, or return -1 on error. diff --git a/submodule.h b/submodule.h index f0da0277a4..5fc602f0c7 100644 --- a/submodule.h +++ b/submodule.h @@ -137,4 +137,10 @@ extern void absorb_git_dir_into_superproject(const char *prefix, */ extern const char *get_superproject_working_tree(void); +/* + * Returns 0 when the gitlink is found in the superprojects index, + * the value will be found in `oid`. Otherwise return -1. + */ +extern int get_superproject_gitlink(struct object_id *oid); + #endif -- 2.15.0.128.g40905b34bf.dirty