diff options
| author | Vicent Marti <tanoku@gmail.com> | 2012-12-14 02:41:53 +0100 |
|---|---|---|
| committer | Vicent Marti <tanoku@gmail.com> | 2012-12-14 02:41:53 +0100 |
| commit | b0b9fd32450227e36e2deae75e86a844ee34bd01 (patch) | |
| tree | 2adc1737ed58462fa7b88109156a5e64f678c021 /src | |
| parent | 44f5f777aeca736a3ccbd2e099a608cc2687b508 (diff) | |
| parent | 2b10a2b0e8f658af52ee806f1ab7e46eca37772f (diff) | |
| download | libgit2-b0b9fd32450227e36e2deae75e86a844ee34bd01.tar.gz | |
Merge remote-tracking branch 'origin/clone-auth' into development
Diffstat (limited to 'src')
| -rw-r--r-- | src/clone.c | 24 | ||||
| -rw-r--r-- | src/remote.c | 115 |
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); |
