diff options
-rw-r--r-- | include/git2/remote.h | 10 | ||||
-rw-r--r-- | src/remote.c | 13 | ||||
-rw-r--r-- | tests-clar/network/remotes.c | 8 |
3 files changed, 29 insertions, 2 deletions
diff --git a/include/git2/remote.h b/include/git2/remote.h index 153bd1e42..6649b3a46 100644 --- a/include/git2/remote.h +++ b/include/git2/remote.h @@ -52,6 +52,16 @@ typedef int (*git_remote_rename_problem_cb)(const char *problematic_refspec, voi GIT_EXTERN(int) git_remote_new(git_remote **out, git_repository *repo, const char *name, const char *url, const char *fetch); /** + * Sets the owning repository for the remote. This is only allowed on + * dangling remotes. + * + * @param remote the remote to configure + * @param repo the repository that will own the remote + * @return 0 or an error code + */ +GIT_EXTERN(int) git_remote_set_repository(git_remote *remote, git_repository *repo); + +/** * Get the information for a particular remote * * The name will be checked for validity. diff --git a/src/remote.c b/src/remote.c index 3101ff7ba..f430cd03a 100644 --- a/src/remote.c +++ b/src/remote.c @@ -132,6 +132,19 @@ on_error: return -1; } +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) { git_remote *remote; diff --git a/tests-clar/network/remotes.c b/tests-clar/network/remotes.c index d3f9ff80f..b2ed8e7f2 100644 --- a/tests-clar/network/remotes.c +++ b/tests-clar/network/remotes.c @@ -330,9 +330,13 @@ void test_network_remotes__check_structure_version(void) void test_network_remotes__dangling(void) { cl_git_pass(git_remote_new(&_remote, NULL, "upstream", "git://github.com/libgit2/libgit2", NULL)); - cl_git_fail(git_remote_save(_remote)); - cl_git_fail(git_remote_update_tips(_remote)); cl_git_pass(git_remote_rename(_remote, "newname", NULL, NULL)); cl_assert_equal_s(git_remote_name(_remote), "newname"); + + cl_git_fail(git_remote_save(_remote)); + cl_git_fail(git_remote_update_tips(_remote)); + + cl_git_pass(git_remote_set_repository(_remote, _repo)); + cl_git_pass(git_remote_save(_remote)); } |