Signed-off-by: Stefan Beller <[email protected]>
---
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