diff options
author | Ben Straub <bstraub@github.com> | 2012-06-15 13:14:43 -0700 |
---|---|---|
committer | Ben Straub <bstraub@github.com> | 2012-06-21 09:53:44 -0700 |
commit | 764df57e82c337a70f55e320bf31acb50c6ffacd (patch) | |
tree | 8d8deca8f9c6a4d8fe67e2ab715725e8da34c5af /tests-clar/clone/clone.c | |
parent | 9311423c34bbd369928152c6a2b669204276ddd1 (diff) | |
download | libgit2-764df57e82c337a70f55e320bf31acb50c6ffacd.tar.gz |
Add git_clone and git_clone_bare.
So far they only create a repo, setup the "origin"
remote, and fetch. The API probably needs work as
well; there's no way to get progress information
at this point.
Also uncovered a shortcoming; git_remote_download
doesn't fetch over local transport.
Diffstat (limited to 'tests-clar/clone/clone.c')
-rw-r--r-- | tests-clar/clone/clone.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tests-clar/clone/clone.c b/tests-clar/clone/clone.c new file mode 100644 index 000000000..f60ffb5a1 --- /dev/null +++ b/tests-clar/clone/clone.c @@ -0,0 +1,101 @@ +#include "clar_libgit2.h" + +#include "git2/clone.h" +#include "repository.h" + +static git_repository *g_repo; + +void test_clone_clone__initialize(void) +{ + g_repo = NULL; +} + +void test_clone_clone__cleanup(void) +{ + if (g_repo) { + git_repository_free(g_repo); + g_repo = NULL; + } +} + +// TODO: This is copy/pasted from network/remotelocal.c. +static void build_local_file_url(git_buf *out, const char *fixture) +{ + const char *in_buf; + + git_buf path_buf = GIT_BUF_INIT; + + cl_git_pass(git_path_prettify_dir(&path_buf, fixture, NULL)); + cl_git_pass(git_buf_puts(out, "file://")); + +#ifdef _MSC_VER + /* + * A FILE uri matches the following format: file://[host]/path + * where "host" can be empty and "path" is an absolute path to the resource. + * + * In this test, no hostname is used, but we have to ensure the leading triple slashes: + * + * *nix: file:///usr/home/... + * Windows: file:///C:/Users/... + */ + cl_git_pass(git_buf_putc(out, '/')); +#endif + + in_buf = git_buf_cstr(&path_buf); + + /* + * A very hacky Url encoding that only takes care of escaping the spaces + */ + while (*in_buf) { + if (*in_buf == ' ') + cl_git_pass(git_buf_puts(out, "%20")); + else + cl_git_pass(git_buf_putc(out, *in_buf)); + + in_buf++; + } + + git_buf_free(&path_buf); +} + + +void test_clone_clone__bad_url(void) +{ + /* Clone should clean up the mess if the URL isn't a git repository */ + cl_git_fail(git_clone(&g_repo, "not_a_repo", "./foo")); + cl_assert(!git_path_exists("./foo")); + cl_git_fail(git_clone_bare(&g_repo, "not_a_repo", "./foo.git")); + cl_assert(!git_path_exists("./foo")); +} + + +void test_clone_clone__local(void) +{ + git_buf src = GIT_BUF_INIT; + build_local_file_url(&src, cl_fixture("testrepo.git")); + + cl_git_pass(git_clone(&g_repo, git_buf_cstr(&src), "./local")); + git_repository_free(g_repo); + git_futils_rmdir_r("./local", GIT_DIRREMOVAL_FILES_AND_DIRS); + cl_git_pass(git_clone_bare(&g_repo, git_buf_cstr(&src), "./local.git")); + git_futils_rmdir_r("./local.git", GIT_DIRREMOVAL_FILES_AND_DIRS); +} + + +void test_clone_clone__network(void) +{ + cl_git_pass(git_clone(&g_repo, + "https://github.com/libgit2/libgit2.git", + "./libgit2.git")); + git_futils_rmdir_r("./libgit2.git", GIT_DIRREMOVAL_FILES_AND_DIRS); +} + + +void test_clone_clone__already_exists(void) +{ + mkdir("./foo", GIT_DIR_MODE); + cl_git_fail(git_clone(&g_repo, + "https://github.com/libgit2/libgit2.git", + "./foo")); + git_futils_rmdir_r("./foo", GIT_DIRREMOVAL_FILES_AND_DIRS); +} |