From 52fba18f4e73a0342b28428cc7d783423b6d19c0 Mon Sep 17 00:00:00 2001 From: Jan Melcher Date: Mon, 10 Mar 2014 18:16:10 +0100 Subject: [PATCH] Add git_submodule_resolve_url() --- include/git2/submodule.h | 10 ++++++++++ src/submodule.c | 30 ++++++++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/include/git2/submodule.h b/include/git2/submodule.h index d72432610..ac0abc0a4 100644 --- a/include/git2/submodule.h +++ b/include/git2/submodule.h @@ -271,6 +271,16 @@ GIT_EXTERN(const char *) git_submodule_path(git_submodule *submodule); */ GIT_EXTERN(const char *) git_submodule_url(git_submodule *submodule); +/** + * Resolve a submodule url relative to the given repository. + * + * @param out buffer to store the absolute submodule url in + * @param repository Pointer to repository object + * @param url Relative url + * @return 0 or an error code + */ +GIT_EXTERN(int) git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *url); + /** * Get the branch for the submodule. * diff --git a/src/submodule.c b/src/submodule.c index 2388bd144..2fe7f1dcb 100644 --- a/src/submodule.c +++ b/src/submodule.c @@ -229,16 +229,7 @@ int git_submodule_add_setup( } /* resolve parameters */ - - if (url[0] == '.' && (url[1] == '/' || (url[1] == '.' && url[2] == '/'))) { - if (!(error = lookup_head_remote(&real_url, repo))) - error = git_path_apply_relative(&real_url, url); - } else if (strchr(url, ':') != NULL || url[0] == '/') { - error = git_buf_sets(&real_url, url); - } else { - giterr_set(GITERR_SUBMODULE, "Invalid format for submodule URL"); - error = -1; - } + error = git_submodule_resolve_url(&real_url, repo, url); if (error) goto cleanup; @@ -533,6 +524,25 @@ const char *git_submodule_url(git_submodule *submodule) return submodule->url; } +int git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *url) +{ + assert(url); + + int error = 0; + + if (url[0] == '.' && (url[1] == '/' || (url[1] == '.' && url[2] == '/'))) { + if (!(error = lookup_head_remote(out, repo))) + error = git_path_apply_relative(out, url); + } else if (strchr(url, ':') != NULL || url[0] == '/') { + error = git_buf_sets(out, url); + } else { + giterr_set(GITERR_SUBMODULE, "Invalid format for submodule URL"); + error = -1; + } + + return error; +} + const char *git_submodule_branch(git_submodule *submodule) { assert(submodule);