summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2014-04-03 11:29:08 -0700
committerRussell Belfer <rb@github.com>2014-04-03 11:29:08 -0700
commit18cc7d28c4c5ad4c9ecf7bfeab98a035500fd9d7 (patch)
tree4358522f777e6e0a8e8942f66ec24a4c6d5cd6f1 /src
parentf2fb4bac68e7ab38cf6082655b2da153866a012d (diff)
downloadlibgit2-18cc7d28c4c5ad4c9ecf7bfeab98a035500fd9d7.tar.gz
Minor code cleanup
Diffstat (limited to 'src')
-rw-r--r--src/submodule.c125
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;
}