mirror of
https://git.proxmox.com/git/libgit2
synced 2025-07-03 04:55:45 +00:00
Merge pull request #1141 from ben/clone-empty-repo
Allow clone to handle empty repos
This commit is contained in:
commit
69a402d46c
2
examples/.gitignore
vendored
2
examples/.gitignore
vendored
@ -1,2 +1,4 @@
|
|||||||
general
|
general
|
||||||
showindex
|
showindex
|
||||||
|
diff
|
||||||
|
*.dSYM
|
||||||
|
@ -14,3 +14,7 @@ OBJECTS = \
|
|||||||
|
|
||||||
all: $(OBJECTS)
|
all: $(OBJECTS)
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o git2 $(OBJECTS)
|
$(CC) $(CFLAGS) $(LDFLAGS) -o git2 $(OBJECTS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) $(OBJECTS)
|
||||||
|
$(RM) git2
|
||||||
|
@ -42,6 +42,7 @@ static int add_ref(transport_local *t, const char *name)
|
|||||||
git_remote_head *head;
|
git_remote_head *head;
|
||||||
git_object *obj = NULL, *target = NULL;
|
git_object *obj = NULL, *target = NULL;
|
||||||
git_buf buf = GIT_BUF_INIT;
|
git_buf buf = GIT_BUF_INIT;
|
||||||
|
int error;
|
||||||
|
|
||||||
head = git__calloc(1, sizeof(git_remote_head));
|
head = git__calloc(1, sizeof(git_remote_head));
|
||||||
GITERR_CHECK_ALLOC(head);
|
GITERR_CHECK_ALLOC(head);
|
||||||
@ -49,10 +50,17 @@ static int add_ref(transport_local *t, const char *name)
|
|||||||
head->name = git__strdup(name);
|
head->name = git__strdup(name);
|
||||||
GITERR_CHECK_ALLOC(head->name);
|
GITERR_CHECK_ALLOC(head->name);
|
||||||
|
|
||||||
if (git_reference_name_to_id(&head->oid, t->repo, name) < 0) {
|
error = git_reference_name_to_id(&head->oid, t->repo, name);
|
||||||
|
if (error < 0) {
|
||||||
git__free(head->name);
|
git__free(head->name);
|
||||||
git__free(head);
|
git__free(head);
|
||||||
return -1;
|
if (!strcmp(name, GIT_HEAD_FILE) && error == GIT_ENOTFOUND) {
|
||||||
|
/* This is actually okay. Empty repos often have a HEAD that points to
|
||||||
|
* a nonexistent "refs/heads/master". */
|
||||||
|
giterr_clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (git_vector_insert(&t->refs, head) < 0)
|
if (git_vector_insert(&t->refs, head) < 0)
|
||||||
|
67
tests-clar/clone/empty.c
Normal file
67
tests-clar/clone/empty.c
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#include "clar_libgit2.h"
|
||||||
|
|
||||||
|
#include "git2/clone.h"
|
||||||
|
#include "repository.h"
|
||||||
|
|
||||||
|
static git_clone_options g_options;
|
||||||
|
static git_remote *g_origin;
|
||||||
|
static git_repository *g_repo;
|
||||||
|
|
||||||
|
void test_clone_empty__initialize(void)
|
||||||
|
{
|
||||||
|
git_repository *sandbox = cl_git_sandbox_init("empty_bare.git");
|
||||||
|
cl_git_remove_placeholders(git_repository_path(sandbox), "dummy-marker.txt");
|
||||||
|
|
||||||
|
g_repo = NULL;
|
||||||
|
|
||||||
|
memset(&g_options, 0, sizeof(git_clone_options));
|
||||||
|
g_options.version = GIT_CLONE_OPTIONS_VERSION;
|
||||||
|
cl_git_pass(git_remote_new(&g_origin, NULL, "origin", cl_git_fixture_url("testrepo.git"), GIT_REMOTE_DEFAULT_FETCH));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_empty__cleanup(void)
|
||||||
|
{
|
||||||
|
git_remote_free(g_origin);
|
||||||
|
cl_git_sandbox_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cleanup_repository(void *path)
|
||||||
|
{
|
||||||
|
cl_fixture_cleanup((const char *)path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_empty__can_clone_an_empty_local_repo_barely(void)
|
||||||
|
{
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./empty");
|
||||||
|
|
||||||
|
git_remote_free(g_origin);
|
||||||
|
cl_git_pass(git_remote_new(&g_origin, NULL, "origin", "./empty_bare.git", GIT_REMOTE_DEFAULT_FETCH));
|
||||||
|
|
||||||
|
g_options.bare = true;
|
||||||
|
cl_git_pass(git_clone(&g_repo, g_origin, "./empty", &g_options));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_empty__can_clone_an_empty_local_repo(void)
|
||||||
|
{
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./empty");
|
||||||
|
|
||||||
|
git_remote_free(g_origin);
|
||||||
|
cl_git_pass(git_remote_new(&g_origin, NULL, "origin", "./empty_bare.git", GIT_REMOTE_DEFAULT_FETCH));
|
||||||
|
|
||||||
|
cl_git_pass(git_clone(&g_repo, g_origin, "./empty", &g_options));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_clone_empty__can_clone_an_empty_standard_repo(void)
|
||||||
|
{
|
||||||
|
cl_git_sandbox_cleanup();
|
||||||
|
g_repo = cl_git_sandbox_init("empty_standard_repo");
|
||||||
|
cl_git_remove_placeholders(git_repository_path(g_repo), "dummy-marker.txt");
|
||||||
|
git_repository_free(g_repo);
|
||||||
|
|
||||||
|
git_remote_free(g_origin);
|
||||||
|
cl_git_pass(git_remote_new(&g_origin, NULL, "origin", "./empty_standard_repo", GIT_REMOTE_DEFAULT_FETCH));
|
||||||
|
|
||||||
|
cl_set_cleanup(&cleanup_repository, "./empty");
|
||||||
|
|
||||||
|
cl_git_pass(git_clone(&g_repo, g_origin, "./empty", &g_options));
|
||||||
|
}
|
@ -63,8 +63,7 @@ static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fet
|
|||||||
git_remote_disconnect(remote);
|
git_remote_disconnect(remote);
|
||||||
git_remote_free(remote);
|
git_remote_free(remote);
|
||||||
|
|
||||||
cl_git_pass(git_futils_readbuffer(&fetchhead_buf,
|
cl_git_pass(git_futils_readbuffer(&fetchhead_buf, "./foo/.git/FETCH_HEAD"));
|
||||||
"./test1/.git/FETCH_HEAD"));
|
|
||||||
|
|
||||||
equals = (strcmp(fetchhead_buf.ptr, expected_fetchhead) == 0);
|
equals = (strcmp(fetchhead_buf.ptr, expected_fetchhead) == 0);
|
||||||
|
|
||||||
|
@ -211,6 +211,10 @@ void test_network_push__cleanup(void)
|
|||||||
{
|
{
|
||||||
if (_remote)
|
if (_remote)
|
||||||
git_remote_free(_remote);
|
git_remote_free(_remote);
|
||||||
|
_remote = NULL;
|
||||||
|
|
||||||
|
/* Freed by cl_git_sandbox_cleanup */
|
||||||
|
_repo = NULL;
|
||||||
|
|
||||||
record_callbacks_data_clear(&_record_cbs_data);
|
record_callbacks_data_clear(&_record_cbs_data);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user