This is basically the extended version of resolve_gitlink_ref() where we have access to more info from the underlying resolve_ref_recursively() call. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- refs.c | 20 ++++++++++++++------ refs.h | 3 +++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/refs.c b/refs.c index cd36b64ed9..02e35d83f3 100644 --- a/refs.c +++ b/refs.c @@ -1325,18 +1325,18 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags, resolve_flags, sha1, flags); } -int resolve_gitlink_ref(const char *submodule, const char *refname, - unsigned char *sha1) +const char *resolve_ref_submodule(const char *submodule, const char *refname, + int resolve_flags, unsigned char *sha1, + int *flags) { size_t len = strlen(submodule); struct ref_store *refs; - int flags; while (len && submodule[len - 1] == '/') len--; if (!len) - return -1; + return NULL; if (submodule[len]) { /* We need to strip off one or more trailing slashes */ @@ -1349,9 +1349,17 @@ int resolve_gitlink_ref(const char *submodule, const char *refname, } if (!refs) - return -1; + return NULL; + + return resolve_ref_recursively(refs, refname, resolve_flags, sha1, flags); +} + +int resolve_gitlink_ref(const char *submodule, const char *refname, + unsigned char *sha1) +{ + int flags; - if (!resolve_ref_recursively(refs, refname, 0, sha1, &flags) || + if (!resolve_ref_submodule(submodule, refname, 0, sha1, &flags) || is_null_sha1(sha1)) return -1; return 0; diff --git a/refs.h b/refs.h index 9fbff90e79..74542468d8 100644 --- a/refs.h +++ b/refs.h @@ -88,6 +88,9 @@ int peel_ref(const char *refname, unsigned char *sha1); */ int resolve_gitlink_ref(const char *submodule, const char *refname, unsigned char *sha1); +const char *resolve_ref_submodule(const char *submodule, const char *refname, + int resolve_flags, unsigned char *sha1, + int *flags); /* * Return true iff abbrev_name is a possible abbreviation for -- 2.11.0.157.gd943d85