Commit 8340dd5d by Ben Straub

Clone: remove fragile path-handling code.

Also standardized on 3-space indentation. Sorry
about that.
parent da73fb70
...@@ -19,10 +19,23 @@ ...@@ -19,10 +19,23 @@
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;
} }
/* /*
...@@ -36,49 +49,60 @@ static int setup_remotes_and_fetch(git_repository *repo, ...@@ -36,49 +49,60 @@ static int setup_remotes_and_fetch(git_repository *repo,
const char *origin_url, const char *origin_url,
git_indexer_stats *stats) git_indexer_stats *stats)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
git_remote *origin = NULL; git_remote *origin = NULL;
git_off_t bytes = 0; git_off_t bytes = 0;
git_indexer_stats dummy_stats; git_indexer_stats dummy_stats;
if (!stats) stats = &dummy_stats; if (!stats) stats = &dummy_stats;
if (!git_remote_add(&origin, repo, "origin", origin_url)) { /* Create the "origin" remote */
if (!git_remote_connect(origin, GIT_DIR_FETCH)) { if (!git_remote_add(&origin, repo, "origin", origin_url)) {
if (!git_remote_download(origin, &bytes, stats)) { /* Connect and download everything */
if (!git_remote_update_tips(origin, NULL)) { if (!git_remote_connect(origin, GIT_DIR_FETCH)) {
retcode = 0; if (!git_remote_download(origin, &bytes, stats)) {
} /* Create "origin/foo" branches for all remote branches */
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;
}
}
}
git_remote_disconnect(origin);
} }
git_remote_disconnect(origin); git_remote_free(origin);
} }
git_remote_free(origin);
}
return retcode; return retcode;
} }
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)) {
if ((retcode = setup_remotes_and_fetch(repo, origin_url, stats)) < 0) { giterr_set(GITERR_INVALID, "Path '%s' already exists.", path);
/* Failed to fetch; clean up */ return GIT_ERROR;
git_repository_free(repo); }
git_futils_rmdir_r(fullpath, GIT_DIRREMOVAL_FILES_AND_DIRS);
} else { if (!(retcode = git_repository_init(&repo, path, is_bare))) {
*out = repo; if ((retcode = setup_remotes_and_fetch(repo, origin_url, stats)) < 0) {
retcode = 0; /* Failed to fetch; clean up */
} git_repository_free(repo);
} git_futils_rmdir_r(path, GIT_DIRREMOVAL_FILES_AND_DIRS);
} else {
return retcode; *out = repo;
retcode = 0;
}
}
return retcode;
} }
int git_clone_bare(git_repository **out, int git_clone_bare(git_repository **out,
...@@ -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);
} }
...@@ -103,22 +119,13 @@ int git_clone(git_repository **out, ...@@ -103,22 +119,13 @@ int git_clone(git_repository **out,
const char *workdir_path, const char *workdir_path,
git_indexer_stats *stats) git_indexer_stats *stats)
{ {
int retcode = GIT_ERROR; int retcode = GIT_ERROR;
char fullpath[512] = {0};
if (!(retcode = clone_internal(out, origin_url, workdir_path, stats, 0))) {
p_realpath(workdir_path, fullpath); retcode = git_checkout_force(*out);
if (git_path_exists(fullpath)) { }
giterr_set(GITERR_INVALID, "Destination already exists: %s", fullpath);
return GIT_ERROR; return retcode;
}
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;
} }
......
...@@ -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