Commit 8340dd5d by Ben Straub

Clone: remove fragile path-handling code.

Also standardized on 3-space indentation. Sorry
about that.
parent da73fb70
...@@ -19,12 +19,25 @@ ...@@ -19,12 +19,25 @@
GIT_BEGIN_DECL GIT_BEGIN_DECL
static int git_checkout_branch(git_repository *repo, const char *branchname) static int git_checkout_force(git_repository *repo)
{ {
/* TODO */ /* TODO */
return 0; return 0;
} }
static int update_head_to_remote(git_repository *repo, git_remote *remote)
{
int retcode = 0;
/* Get the remote's HEAD. This is always the first ref in remote->refs. */
git_buf remote_default_branch = GIT_BUF_INIT;
/* TODO */
git_buf_free(&remote_default_branch);
return retcode;
}
/* /*
* submodules? * submodules?
* filemodes? * filemodes?
...@@ -43,13 +56,19 @@ static int setup_remotes_and_fetch(git_repository *repo, ...@@ -43,13 +56,19 @@ static int setup_remotes_and_fetch(git_repository *repo,
if (!stats) stats = &dummy_stats; if (!stats) stats = &dummy_stats;
/* Create the "origin" remote */
if (!git_remote_add(&origin, repo, "origin", origin_url)) { if (!git_remote_add(&origin, repo, "origin", origin_url)) {
/* Connect and download everything */
if (!git_remote_connect(origin, GIT_DIR_FETCH)) { if (!git_remote_connect(origin, GIT_DIR_FETCH)) {
if (!git_remote_download(origin, &bytes, stats)) { if (!git_remote_download(origin, &bytes, stats)) {
/* Create "origin/foo" branches for all remote branches */
if (!git_remote_update_tips(origin, NULL)) { if (!git_remote_update_tips(origin, NULL)) {
/* Point HEAD to the same ref as the remote's head */
if (!update_head_to_remote(repo, origin)) {
retcode = 0; retcode = 0;
} }
} }
}
git_remote_disconnect(origin); git_remote_disconnect(origin);
} }
git_remote_free(origin); git_remote_free(origin);
...@@ -60,18 +79,23 @@ static int setup_remotes_and_fetch(git_repository *repo, ...@@ -60,18 +79,23 @@ static int setup_remotes_and_fetch(git_repository *repo,
static int clone_internal(git_repository **out, static int clone_internal(git_repository **out,
const char *origin_url, const char *origin_url,
const char *fullpath, const char *path,
git_indexer_stats *stats, git_indexer_stats *stats,
int is_bare) int is_bare)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_repository *repo = NULL; git_repository *repo = NULL;
if (!(retcode = git_repository_init(&repo, fullpath, is_bare))) { if (git_path_exists(path)) {
giterr_set(GITERR_INVALID, "Path '%s' already exists.", path);
return GIT_ERROR;
}
if (!(retcode = git_repository_init(&repo, path, is_bare))) {
if ((retcode = setup_remotes_and_fetch(repo, origin_url, stats)) < 0) { if ((retcode = setup_remotes_and_fetch(repo, origin_url, stats)) < 0) {
/* Failed to fetch; clean up */ /* Failed to fetch; clean up */
git_repository_free(repo); git_repository_free(repo);
git_futils_rmdir_r(fullpath, GIT_DIRREMOVAL_FILES_AND_DIRS); git_futils_rmdir_r(path, GIT_DIRREMOVAL_FILES_AND_DIRS);
} else { } else {
*out = repo; *out = repo;
retcode = 0; retcode = 0;
...@@ -86,15 +110,7 @@ int git_clone_bare(git_repository **out, ...@@ -86,15 +110,7 @@ int git_clone_bare(git_repository **out,
const char *dest_path, const char *dest_path,
git_indexer_stats *stats) git_indexer_stats *stats)
{ {
char fullpath[512] = {0}; return clone_internal(out, origin_url, dest_path, stats, 1);
p_realpath(dest_path, fullpath);
if (git_path_exists(fullpath)) {
giterr_set(GITERR_INVALID, "Destination already exists: %s", fullpath);
return GIT_ERROR;
}
return clone_internal(out, origin_url, fullpath, stats, 1);
} }
...@@ -104,18 +120,9 @@ int git_clone(git_repository **out, ...@@ -104,18 +120,9 @@ int git_clone(git_repository **out,
git_indexer_stats *stats) git_indexer_stats *stats)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
char fullpath[512] = {0};
p_realpath(workdir_path, fullpath); if (!(retcode = clone_internal(out, origin_url, workdir_path, stats, 0))) {
if (git_path_exists(fullpath)) { retcode = git_checkout_force(*out);
giterr_set(GITERR_INVALID, "Destination already exists: %s", fullpath);
return GIT_ERROR;
}
if (!clone_internal(out, origin_url, workdir_path, stats, 0)) {
char default_branch_name[256] = "master";
/* TODO */
retcode = git_checkout_branch(*out, default_branch_name);
} }
return retcode; return retcode;
......
...@@ -86,16 +86,22 @@ void test_clone_clone__local(void) ...@@ -86,16 +86,22 @@ void test_clone_clone__local(void)
} }
void test_clone_clone__network(void) void test_clone_clone__network_full(void)
{ {
#if 0 #if 0
cl_git_pass(git_clone(&g_repo, cl_git_pass(git_clone(&g_repo,
"https://github.com/libgit2/libgit2.git", "https://github.com/libgit2/libgit2.git",
"./libgit2", NULL)); "./libgit2", NULL));
git_futils_rmdir_r("./libgit2", GIT_DIRREMOVAL_FILES_AND_DIRS);
#endif
}
void test_clone_clone__network_bare(void)
{
#if 0
cl_git_pass(git_clone_bare(&g_repo, cl_git_pass(git_clone_bare(&g_repo,
"https://github.com/libgit2/libgit2.git", "https://github.com/libgit2/libgit2.git",
"./libgit2.git", NULL)); "./libgit2.git", NULL));
git_futils_rmdir_r("./libgit2", GIT_DIRREMOVAL_FILES_AND_DIRS);
git_futils_rmdir_r("./libgit2.git", GIT_DIRREMOVAL_FILES_AND_DIRS); git_futils_rmdir_r("./libgit2.git", GIT_DIRREMOVAL_FILES_AND_DIRS);
#endif #endif
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment