summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2012-12-14 02:41:53 +0100
committerVicent Marti <tanoku@gmail.com>2012-12-14 02:41:53 +0100
commitb0b9fd32450227e36e2deae75e86a844ee34bd01 (patch)
tree2adc1737ed58462fa7b88109156a5e64f678c021 /src
parent44f5f777aeca736a3ccbd2e099a608cc2687b508 (diff)
parent2b10a2b0e8f658af52ee806f1ab7e46eca37772f (diff)
downloadlibgit2-b0b9fd32450227e36e2deae75e86a844ee34bd01.tar.gz
Merge remote-tracking branch 'origin/clone-auth' into development
Diffstat (limited to 'src')
-rw-r--r--src/clone.c24
-rw-r--r--src/remote.c115
2 files changed, 86 insertions, 53 deletions
diff --git a/src/clone.c b/src/clone.c
index 7d49b398b..aa6c43f86 100644
--- a/src/clone.c
+++ b/src/clone.c
@@ -262,15 +262,14 @@ cleanup:
static int setup_remotes_and_fetch(
git_repository *repo,
- const char *origin_url,
+ git_remote *origin,
git_transfer_progress_callback progress_cb,
void *progress_payload)
{
int retcode = GIT_ERROR;
- git_remote *origin = NULL;
- /* Create the "origin" remote */
- if (!git_remote_add(&origin, repo, GIT_REMOTE_ORIGIN, origin_url)) {
+ /* Add the origin remote */
+ if (!git_remote_set_repository(origin, repo) && !git_remote_save(origin)) {
/*
* Don't write FETCH_HEAD, we'll check out the remote tracking
* branch ourselves based on the server's default.
@@ -290,7 +289,6 @@ static int setup_remotes_and_fetch(
}
git_remote_disconnect(origin);
}
- git_remote_free(origin);
}
return retcode;
@@ -325,7 +323,7 @@ static bool should_checkout(
static int clone_internal(
git_repository **out,
- const char *origin_url,
+ git_remote *origin_remote,
const char *path,
git_transfer_progress_callback fetch_progress_cb,
void *fetch_progress_payload,
@@ -340,7 +338,7 @@ static int clone_internal(
}
if (!(retcode = git_repository_init(&repo, path, is_bare))) {
- if ((retcode = setup_remotes_and_fetch(repo, origin_url,
+ if ((retcode = setup_remotes_and_fetch(repo, origin_remote,
fetch_progress_cb, fetch_progress_payload)) < 0) {
/* Failed to fetch; clean up */
git_repository_free(repo);
@@ -359,16 +357,16 @@ static int clone_internal(
int git_clone_bare(
git_repository **out,
- const char *origin_url,
+ git_remote *origin_remote,
const char *dest_path,
git_transfer_progress_callback fetch_progress_cb,
void *fetch_progress_payload)
{
- assert(out && origin_url && dest_path);
+ assert(out && origin_remote && dest_path);
return clone_internal(
out,
- origin_url,
+ origin_remote,
dest_path,
fetch_progress_cb,
fetch_progress_payload,
@@ -379,17 +377,17 @@ int git_clone_bare(
int git_clone(
git_repository **out,
- const char *origin_url,
+ git_remote *origin_remote,
const char *workdir_path,
git_checkout_opts *checkout_opts,
git_transfer_progress_callback fetch_progress_cb,
void *fetch_progress_payload)
{
- assert(out && origin_url && workdir_path);
+ assert(out && origin_remote && workdir_path);
return clone_internal(
out,
- origin_url,
+ origin_remote,
workdir_path,
fetch_progress_cb,
fetch_progress_payload,
diff --git a/src/remote.c b/src/remote.c
index 670904b17..28ce88a93 100644
--- a/src/remote.c
+++ b/src/remote.c
@@ -86,9 +86,11 @@ cleanup:
int git_remote_new(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch)
{
git_remote *remote;
+ git_buf fetchbuf = GIT_BUF_INIT;
+ int error = -1;
/* name is optional */
- assert(out && repo && url);
+ assert(out && url);
remote = git__calloc(1, sizeof(git_remote));
GITERR_CHECK_ALLOC(remote);
@@ -98,20 +100,26 @@ int git_remote_new(git_remote **out, git_repository *repo, const char *name, con
remote->update_fetchhead = 1;
if (git_vector_init(&remote->refs, 32, NULL) < 0)
- return -1;
+ goto on_error;
remote->url = git__strdup(url);
GITERR_CHECK_ALLOC(remote->url);
if (name != NULL) {
- int error;
if ((error = ensure_remote_name_is_valid(name)) < 0) {
- git_remote_free(remote);
- return error;
+ error = GIT_EINVALIDSPEC;
+ goto on_error;
}
remote->name = git__strdup(name);
GITERR_CHECK_ALLOC(remote->name);
+
+ /* An empty name indicates to use a sensible default for the fetchspec. */
+ if (fetch && !(*fetch)) {
+ if (git_buf_printf(&fetchbuf, "+refs/heads/*:refs/remotes/%s/*", remote->name) < 0)
+ goto on_error;
+ fetch = git_buf_cstr(&fetchbuf);
+ }
}
if (fetch != NULL) {
@@ -125,11 +133,26 @@ int git_remote_new(git_remote **out, git_repository *repo, const char *name, con
}
*out = remote;
+ git_buf_free(&fetchbuf);
return 0;
on_error:
git_remote_free(remote);
- return -1;
+ git_buf_free(&fetchbuf);
+ return error;
+}
+
+int git_remote_set_repository(git_remote *remote, git_repository *repo)
+{
+ assert(repo);
+
+ if (remote->repo) {
+ giterr_set(GITERR_INVALID, "Remotes can't change repositiories.");
+ return GIT_ERROR;
+ }
+
+ remote->repo = repo;
+ return 0;
}
int git_remote_load(git_remote **out, git_repository *repo, const char *name)
@@ -289,6 +312,11 @@ int git_remote_save(const git_remote *remote)
assert(remote);
+ if (!remote->repo) {
+ giterr_set(GITERR_INVALID, "Can't save a dangling remote.");
+ return GIT_ERROR;
+ }
+
if ((error = ensure_remote_name_is_valid(remote->name)) < 0)
return error;
@@ -543,7 +571,7 @@ int git_remote__get_http_proxy(git_remote *remote, bool use_ssl, char **proxy_ur
assert(remote);
- if (!proxy_url)
+ if (!proxy_url || !remote->repo)
return -1;
*proxy_url = NULL;
@@ -745,6 +773,11 @@ int git_remote_update_tips(git_remote *remote)
assert(remote);
+ if (!remote->repo) {
+ giterr_set(GITERR_INVALID, "Can't update tips on a dangling remote.");
+ return GIT_ERROR;
+ }
+
spec = &remote->fetch;
if (git_repository_odb__weakptr(&odb, remote->repo) < 0)
@@ -1293,49 +1326,51 @@ int git_remote_rename(
assert(remote && new_name);
- if ((error = ensure_remote_doesnot_exist(remote->repo, new_name)) < 0)
- return error;
-
if ((error = ensure_remote_name_is_valid(new_name)) < 0)
return error;
- if (!remote->name) {
- if ((error = rename_fetch_refspecs(
- remote,
- new_name,
- callback,
- payload)) < 0)
+ if (remote->repo) {
+ if ((error = ensure_remote_doesnot_exist(remote->repo, new_name)) < 0)
return error;
- remote->name = git__strdup(new_name);
+ if (!remote->name) {
+ if ((error = rename_fetch_refspecs(
+ remote,
+ new_name,
+ callback,
+ payload)) < 0)
+ return error;
- return git_remote_save(remote);
- }
+ remote->name = git__strdup(new_name);
- if ((error = rename_remote_config_section(
- remote->repo,
- remote->name,
- new_name)) < 0)
- return error;
+ return git_remote_save(remote);
+ }
- if ((error = update_branch_remote_config_entry(
- remote->repo,
- remote->name,
- new_name)) < 0)
- return error;
+ if ((error = rename_remote_config_section(
+ remote->repo,
+ remote->name,
+ new_name)) < 0)
+ return error;
- if ((error = rename_remote_references(
- remote->repo,
- remote->name,
- new_name)) < 0)
- return error;
+ if ((error = update_branch_remote_config_entry(
+ remote->repo,
+ remote->name,
+ new_name)) < 0)
+ return error;
- if ((error = rename_fetch_refspecs(
- remote,
- new_name,
- callback,
- payload)) < 0)
- return error;
+ if ((error = rename_remote_references(
+ remote->repo,
+ remote->name,
+ new_name)) < 0)
+ return error;
+
+ if ((error = rename_fetch_refspecs(
+ remote,
+ new_name,
+ callback,
+ payload)) < 0)
+ return error;
+ }
git__free(remote->name);
remote->name = git__strdup(new_name);