Skip to content

Commit

Permalink
Merge pull request libgit2#1141 from ben/clone-empty-repo
Browse files Browse the repository at this point in the history
Allow clone to handle empty repos
  • Loading branch information
Vicent Martí committed Dec 17, 2012
2 parents 71131b5 + c4e3e79 commit 69a402d
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 4 deletions.
2 changes: 2 additions & 0 deletions examples/.gitignore
@@ -1,2 +1,4 @@
general
showindex
diff
*.dSYM
4 changes: 4 additions & 0 deletions examples/network/Makefile
Expand Up @@ -14,3 +14,7 @@ OBJECTS = \

all: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) -o git2 $(OBJECTS)

clean:
$(RM) $(OBJECTS)
$(RM) git2
12 changes: 10 additions & 2 deletions src/transports/local.c
Expand Up @@ -42,17 +42,25 @@ static int add_ref(transport_local *t, const char *name)
git_remote_head *head;
git_object *obj = NULL, *target = NULL;
git_buf buf = GIT_BUF_INIT;
int error;

head = git__calloc(1, sizeof(git_remote_head));
GITERR_CHECK_ALLOC(head);

head->name = git__strdup(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);
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)
Expand Down
67 changes: 67 additions & 0 deletions tests-clar/clone/empty.c
@@ -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));
}
3 changes: 1 addition & 2 deletions tests-clar/fetchhead/network.c
Expand Up @@ -63,8 +63,7 @@ static void fetchhead_test_fetch(const char *fetchspec, const char *expected_fet
git_remote_disconnect(remote);
git_remote_free(remote);

cl_git_pass(git_futils_readbuffer(&fetchhead_buf,
"./test1/.git/FETCH_HEAD"));
cl_git_pass(git_futils_readbuffer(&fetchhead_buf, "./foo/.git/FETCH_HEAD"));

equals = (strcmp(fetchhead_buf.ptr, expected_fetchhead) == 0);

Expand Down
4 changes: 4 additions & 0 deletions tests-clar/network/push.c
Expand Up @@ -211,6 +211,10 @@ void test_network_push__cleanup(void)
{
if (_remote)
git_remote_free(_remote);
_remote = NULL;

/* Freed by cl_git_sandbox_cleanup */
_repo = NULL;

record_callbacks_data_clear(&_record_cbs_data);

Expand Down

0 comments on commit 69a402d

Please sign in to comment.