diff options
author | Vicent Marti <vicent@github.com> | 2014-03-10 18:16:56 +0100 |
---|---|---|
committer | Vicent Marti <vicent@github.com> | 2014-03-10 18:16:56 +0100 |
commit | fc78488b3da2b5f6c3acf8eafda82d47bebf748d (patch) | |
tree | b8cd3e70a4dbc5038c7253cc454849bd6a187b62 | |
parent | 4a8692f63321e77bc4faa73d1aedd933cea99bd5 (diff) | |
parent | 52fba18f4e73a0342b28428cc7d783423b6d19c0 (diff) | |
download | libgit2-fc78488b3da2b5f6c3acf8eafda82d47bebf748d.tar.gz |
Merge pull request #2175 from Yogu/submodule-resolve-url
Add git_submodule_resolve_url()
-rw-r--r-- | include/git2/submodule.h | 10 | ||||
-rw-r--r-- | 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 @@ -272,6 +272,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. * * @param submodule Pointer to submodule object 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); |