diff options
author | Russell Belfer <rb@github.com> | 2014-04-03 11:29:08 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2014-04-03 11:29:08 -0700 |
commit | 18cc7d28c4c5ad4c9ecf7bfeab98a035500fd9d7 (patch) | |
tree | 4358522f777e6e0a8e8942f66ec24a4c6d5cd6f1 /src/submodule.c | |
parent | f2fb4bac68e7ab38cf6082655b2da153866a012d (diff) | |
download | libgit2-18cc7d28c4c5ad4c9ecf7bfeab98a035500fd9d7.tar.gz |
Minor code cleanup
Diffstat (limited to 'src/submodule.c')
-rw-r--r-- | src/submodule.c | 125 |
1 files changed, 47 insertions, 78 deletions
diff --git a/src/submodule.c b/src/submodule.c index 24f250aa1..e49f09699 100644 --- a/src/submodule.c +++ b/src/submodule.c @@ -92,9 +92,7 @@ static void submodule_cache_free(git_submodule_cache *cache); static git_config_backend *open_gitmodules(git_submodule_cache *, int gitmod); static int get_url_base(git_buf *url, git_repository *repo); -static int lookup_default_remote(git_remote **remote, git_repository *repo); static int lookup_head_remote_key(git_buf *remote_key, git_repository *repo); -static int lookup_head_remote(git_remote **remote, git_repository *repo); static int submodule_get(git_submodule **, git_submodule_cache *, const char *, const char *); static int submodule_load_from_config(const git_config_entry *, void *); static int submodule_load_from_wd_lite(git_submodule *); @@ -1797,108 +1795,79 @@ static int submodule_cache_init(git_repository *repo, int cache_refresh) return error; } -static int get_url_base(git_buf *url, git_repository *repo) +/* Lookup name of remote of the local tracking branch HEAD points to */ +static int lookup_head_remote_key(git_buf *remote_name, git_repository *repo) { int error; - git_remote *remote; - error = lookup_default_remote(&remote, repo); - const char *url_ptr; - - assert(url && repo); - - if (!error) { - url_ptr = git_remote_url(remote); - } else if (error == GIT_ENOTFOUND) { - /* if repository does not have a default remote, use workdir instead */ - giterr_clear(); - error = 0; - url_ptr = git_repository_workdir(repo); + git_reference *head = NULL; + git_buf upstream_name = GIT_BUF_INIT; + + /* lookup and dereference HEAD */ + if ((error = git_repository_head(&head, repo)) < 0) + return error; + + /* lookup remote tracking branch of HEAD */ + if (!(error = git_branch_upstream_name( + &upstream_name, repo, git_reference_name(head)))) + { + /* lookup remote of remote tracking branch */ + error = git_branch_remote_name(remote_name, repo, upstream_name.ptr); + + git_buf_free(&upstream_name); } - - if (error < 0) - goto cleanup; - - error = git_buf_sets(url, url_ptr); -cleanup: - git_remote_free(remote); + git_reference_free(head); return error; } -/** - * Lookup the remote that is considered the default remote in the current state - */ -static int lookup_default_remote(git_remote **remote, git_repository *repo) +/* Lookup the remote of the local tracking branch HEAD points to */ +static int lookup_head_remote(git_remote **remote, git_repository *repo) { int error; - error = lookup_head_remote(remote, repo); - - assert(remote && repo); + git_buf remote_name = GIT_BUF_INIT; - // if that failed, use 'origin' instead - if (error == GIT_ENOTFOUND) { - error = git_remote_load(remote, repo, "origin"); - } + /* lookup remote of remote tracking branch name */ + if (!(error = lookup_head_remote_key(&remote_name, repo))) + error = git_remote_load(remote, repo, remote_name.ptr); - if (error == GIT_ENOTFOUND) { - giterr_set(GITERR_SUBMODULE, - "Neither HEAD points to a local tracking branch, nor does origin exist"); - } + git_buf_free(&remote_name); return error; } -/** - * Lookup name of remote of the local tracking branch HEAD points to - */ -static int lookup_head_remote_key(git_buf *remote_name, git_repository *repo) +/* Lookup remote, either from HEAD or fall back on origin */ +static int lookup_default_remote(git_remote **remote, git_repository *repo) { - int error; - git_reference *head = NULL; - git_buf upstream_name = GIT_BUF_INIT; - - /* lookup and dereference HEAD */ - if ((error = git_repository_head(&head, repo) < 0)) - goto cleanup; + int error = lookup_head_remote(remote, repo); - /* lookup remote tracking branch of HEAD */ - if ((error = git_branch_upstream_name(&upstream_name, repo, git_reference_name(head))) < 0) - goto cleanup; + /* if that failed, use 'origin' instead */ + if (error == GIT_ENOTFOUND) + error = git_remote_load(remote, repo, "origin"); - /* lookup remote of remote tracking branch */ - if ((error = git_branch_remote_name(remote_name, repo, upstream_name.ptr)) < 0) - goto cleanup; - -cleanup: - git_buf_free(&upstream_name); - if (head) - git_reference_free(head); + if (error == GIT_ENOTFOUND) + giterr_set( + GITERR_SUBMODULE, + "Cannot get default remote for submodule - no local tracking " + "branch for HEAD and origin does not exist"); return error; } -/** - * Lookup the remote of the local tracking branch HEAD points to - */ -static int lookup_head_remote(git_remote **remote, git_repository *repo) +static int get_url_base(git_buf *url, git_repository *repo) { int error; - git_buf remote_name = GIT_BUF_INIT; - - assert(remote && repo); - - /* should be NULL in case of error */ - *remote = NULL; - - /* lookup remote of remote tracking branch name */ - if ((error = lookup_head_remote_key(&remote_name, repo)) < 0) - goto cleanup; + git_remote *remote = NULL; - error = git_remote_load(remote, repo, remote_name.ptr); - -cleanup: - git_buf_free(&remote_name); + if (!(error = lookup_default_remote(&remote, repo))) { + error = git_buf_sets(url, git_remote_url(remote)); + git_remote_free(remote); + } + else if (error == GIT_ENOTFOUND) { + /* if repository does not have a default remote, use workdir instead */ + giterr_clear(); + error = git_buf_sets(url, git_repository_workdir(repo)); + } return error; } |