mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 13:52:17 +00:00
Clone: trust but verify
This commit is contained in:
parent
b412d56389
commit
621b50e4d5
@ -295,6 +295,9 @@ static int create_and_configure_origin(
|
|||||||
(error = git_remote_set_pushurl(origin, options->pushurl)) < 0)
|
(error = git_remote_set_pushurl(origin, options->pushurl)) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
|
if ((error = git_remote_save(origin)) < 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
*out = origin;
|
*out = origin;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -142,3 +142,66 @@ void test_clone_network__can_checkout_a_cloned_repo(void)
|
|||||||
git_reference_free(head);
|
git_reference_free(head);
|
||||||
git_buf_free(&path);
|
git_buf_free(&path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int update_tips(const char *refname, const git_oid *a, const git_oid *b, void *payload)
|
||||||
|
{
|
||||||
|
int *callcount = (int*)payload;
|
||||||
|
GIT_UNUSED(refname); GIT_UNUSED(a); GIT_UNUSED(b);
|
||||||
|
*callcount = *callcount + 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_network__custom_remote_callbacks(void)
|
||||||
|
{
|
||||||
|
git_remote_callbacks remote_callbacks = GIT_REMOTE_CALLBACKS_INIT;
|
||||||
|
int callcount = 0;
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
|
||||||
|
g_options.remote_callbacks = &remote_callbacks;
|
||||||
|
remote_callbacks.update_tips = update_tips;
|
||||||
|
remote_callbacks.payload = &callcount;
|
||||||
|
|
||||||
|
cl_git_pass(git_clone(&g_repo, LIVE_REPO_URL, "./foo", &g_options));
|
||||||
|
cl_assert(callcount > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cred_user_pass {
|
||||||
|
const char *user;
|
||||||
|
const char *pass;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int cred_acquire(
|
||||||
|
git_cred **cred,
|
||||||
|
const char *url,
|
||||||
|
unsigned int allowed_types,
|
||||||
|
void *payload)
|
||||||
|
{
|
||||||
|
struct cred_user_pass *user_pass = (struct cred_user_pass*)payload;
|
||||||
|
|
||||||
|
GIT_UNUSED(url);
|
||||||
|
if ((GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) == 0 ||
|
||||||
|
git_cred_userpass_plaintext_new(cred, user_pass->user, user_pass->pass) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_network__credentials(void)
|
||||||
|
{
|
||||||
|
/* Remote URL environment variable must be set. User and password are optional. */
|
||||||
|
const char *remote_url = cl_getenv("GITTEST_REMOTE_URL");
|
||||||
|
struct cred_user_pass user_pass = {
|
||||||
|
cl_getenv("GITTEST_REMOTE_USER"),
|
||||||
|
cl_getenv("GITTEST_REMOTE_PASS")
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!remote_url) return;
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
|
||||||
|
g_options.cred_acquire_cb = cred_acquire;
|
||||||
|
g_options.cred_acquire_payload = &user_pass;
|
||||||
|
|
||||||
|
cl_git_pass(git_clone(&g_repo, remote_url, "./foo", &g_options));
|
||||||
|
}
|
||||||
|
@ -74,3 +74,84 @@ void test_clone_nonetwork__fail_with_already_existing_but_non_empty_directory(vo
|
|||||||
cl_git_mkfile("./foo/bar", "Baz!");
|
cl_git_mkfile("./foo/bar", "Baz!");
|
||||||
cl_git_fail(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
cl_git_fail(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_clone_nonetwork__custom_origin_name(void)
|
||||||
|
{
|
||||||
|
git_remote *remote;
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
g_options.remote_name = "my_origin";
|
||||||
|
cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
||||||
|
|
||||||
|
cl_git_pass(git_remote_load(&remote, g_repo, "my_origin"));
|
||||||
|
|
||||||
|
git_remote_free(remote);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_nonetwork__custom_push_url(void)
|
||||||
|
{
|
||||||
|
git_remote *remote;
|
||||||
|
const char *url = "http://example.com";
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
g_options.pushurl = url;
|
||||||
|
cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
||||||
|
|
||||||
|
cl_git_pass(git_remote_load(&remote, g_repo, "origin"));
|
||||||
|
cl_assert_equal_s(url, git_remote_pushurl(remote));
|
||||||
|
|
||||||
|
git_remote_free(remote);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_nonetwork__custom_fetch_spec(void)
|
||||||
|
{
|
||||||
|
git_remote *remote;
|
||||||
|
git_reference *master;
|
||||||
|
const git_refspec *actual_fs;
|
||||||
|
const char *spec = "+refs/heads/master:refs/heads/foo";
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
g_options.fetch_spec = spec;
|
||||||
|
cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
||||||
|
|
||||||
|
cl_git_pass(git_remote_load(&remote, g_repo, "origin"));
|
||||||
|
actual_fs = git_remote_fetchspec(remote);
|
||||||
|
cl_assert_equal_s("refs/heads/master", git_refspec_src(actual_fs));
|
||||||
|
cl_assert_equal_s("refs/heads/foo", git_refspec_dst(actual_fs));
|
||||||
|
|
||||||
|
cl_git_pass(git_reference_lookup(&master, g_repo, "refs/heads/foo"));
|
||||||
|
git_reference_free(master);
|
||||||
|
|
||||||
|
git_remote_free(remote);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_nonetwork__custom_push_spec(void)
|
||||||
|
{
|
||||||
|
git_remote *remote;
|
||||||
|
const git_refspec *actual_fs;
|
||||||
|
const char *spec = "+refs/heads/master:refs/heads/foo";
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
g_options.push_spec = spec;
|
||||||
|
cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
||||||
|
|
||||||
|
cl_git_pass(git_remote_load(&remote, g_repo, "origin"));
|
||||||
|
actual_fs = git_remote_pushspec(remote);
|
||||||
|
cl_assert_equal_s("refs/heads/master", git_refspec_src(actual_fs));
|
||||||
|
cl_assert_equal_s("refs/heads/foo", git_refspec_dst(actual_fs));
|
||||||
|
|
||||||
|
git_remote_free(remote);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_nonetwork__custom_autotag(void)
|
||||||
|
{
|
||||||
|
git_strarray tags = {0};
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./foo");
|
||||||
|
g_options.remote_autotag = GIT_REMOTE_DOWNLOAD_TAGS_NONE;
|
||||||
|
cl_git_pass(git_clone(&g_repo, cl_git_fixture_url("testrepo.git"), "./foo", &g_options));
|
||||||
|
|
||||||
|
cl_git_pass(git_tag_list(&tags, g_repo));
|
||||||
|
cl_assert_equal_i(0, tags.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user