mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 20:42:23 +00:00
Merge pull request #1192 from arrbee/fix-win32-checkout-test
Fix win32 checkout test
This commit is contained in:
commit
7511d8b42d
84
tests-clar/checkout/checkout_helpers.c
Normal file
84
tests-clar/checkout/checkout_helpers.c
Normal file
@ -0,0 +1,84 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "checkout_helpers.h"
|
||||
#include "refs.h"
|
||||
#include "fileops.h"
|
||||
|
||||
/* this is essentially the code from git__unescape modified slightly */
|
||||
void strip_cr_from_buf(git_buf *buf)
|
||||
{
|
||||
char *scan, *pos = buf->ptr, *end = pos + buf->size;
|
||||
|
||||
for (scan = pos; scan < end; pos++, scan++) {
|
||||
if (*scan == '\r')
|
||||
scan++; /* skip '\r' */
|
||||
if (pos != scan)
|
||||
*pos = *scan;
|
||||
}
|
||||
|
||||
*pos = '\0';
|
||||
buf->size = (pos - buf->ptr);
|
||||
}
|
||||
|
||||
void assert_on_branch(git_repository *repo, const char *branch)
|
||||
{
|
||||
git_reference *head;
|
||||
git_buf bname = GIT_BUF_INIT;
|
||||
|
||||
cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE));
|
||||
cl_assert_(git_reference_type(head) == GIT_REF_SYMBOLIC, branch);
|
||||
|
||||
cl_git_pass(git_buf_joinpath(&bname, "refs/heads", branch));
|
||||
cl_assert_equal_s(bname.ptr, git_reference_symbolic_target(head));
|
||||
|
||||
git_reference_free(head);
|
||||
git_buf_free(&bname);
|
||||
}
|
||||
|
||||
void reset_index_to_treeish(git_object *treeish)
|
||||
{
|
||||
git_object *tree;
|
||||
git_index *index;
|
||||
git_repository *repo = git_object_owner(treeish);
|
||||
|
||||
cl_git_pass(git_object_peel(&tree, treeish, GIT_OBJ_TREE));
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_read_tree(index, (git_tree *)tree));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_object_free(tree);
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
static void test_file_contents_internal(
|
||||
const char *path, const char *expectedcontents, bool strip_cr)
|
||||
{
|
||||
int fd;
|
||||
char data[1024] = {0};
|
||||
git_buf buf = GIT_BUF_INIT;
|
||||
size_t expectedlen = strlen(expectedcontents);
|
||||
|
||||
fd = p_open(path, O_RDONLY);
|
||||
cl_assert(fd >= 0);
|
||||
|
||||
buf.ptr = data;
|
||||
buf.size = p_read(fd, buf.ptr, 1024);
|
||||
|
||||
cl_git_pass(p_close(fd));
|
||||
|
||||
if (strip_cr)
|
||||
strip_cr_from_buf(&buf);
|
||||
|
||||
cl_assert_equal_i((int)expectedlen, (int)buf.size);
|
||||
cl_assert_equal_s(expectedcontents, buf.ptr);
|
||||
}
|
||||
|
||||
void test_file_contents(const char *path, const char *expected)
|
||||
{
|
||||
test_file_contents_internal(path, expected, false);
|
||||
}
|
||||
|
||||
void test_file_contents_nocr(const char *path, const char *expected)
|
||||
{
|
||||
test_file_contents_internal(path, expected, true);
|
||||
}
|
9
tests-clar/checkout/checkout_helpers.h
Normal file
9
tests-clar/checkout/checkout_helpers.h
Normal file
@ -0,0 +1,9 @@
|
||||
#include "buffer.h"
|
||||
#include "git2/object.h"
|
||||
#include "git2/repository.h"
|
||||
|
||||
extern void strip_cr_from_buf(git_buf *buf);
|
||||
extern void assert_on_branch(git_repository *repo, const char *branch);
|
||||
extern void reset_index_to_treeish(git_object *treeish);
|
||||
extern void test_file_contents(const char *path, const char *expected);
|
||||
extern void test_file_contents_nocr(const char *path, const char *expected);
|
@ -1,25 +1,11 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "checkout_helpers.h"
|
||||
|
||||
#include "git2/checkout.h"
|
||||
#include "repository.h"
|
||||
|
||||
static git_repository *g_repo;
|
||||
|
||||
static void reset_index_to_treeish(git_object *treeish)
|
||||
{
|
||||
git_object *tree;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(git_object_peel(&tree, treeish, GIT_OBJ_TREE));
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
cl_git_pass(git_index_read_tree(index, (git_tree *)tree));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_object_free(tree);
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_checkout_index__initialize(void)
|
||||
{
|
||||
git_tree *tree;
|
||||
@ -41,23 +27,6 @@ void test_checkout_index__cleanup(void)
|
||||
cl_git_sandbox_cleanup();
|
||||
}
|
||||
|
||||
static void test_file_contents(const char *path, const char *expectedcontents)
|
||||
{
|
||||
int fd;
|
||||
char buffer[1024] = {0};
|
||||
size_t expectedlen, actuallen;
|
||||
|
||||
fd = p_open(path, O_RDONLY);
|
||||
cl_assert(fd >= 0);
|
||||
|
||||
expectedlen = strlen(expectedcontents);
|
||||
actuallen = p_read(fd, buffer, 1024);
|
||||
cl_git_pass(p_close(fd));
|
||||
|
||||
cl_assert_equal_sz(actuallen, expectedlen);
|
||||
cl_assert_equal_s(buffer, expectedcontents);
|
||||
}
|
||||
|
||||
void test_checkout_index__cannot_checkout_a_bare_repository(void)
|
||||
{
|
||||
test_checkout_index__cleanup();
|
||||
@ -501,6 +470,10 @@ void test_checkout_index__can_update_prefixed_files(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
|
||||
cl_assert_equal_i(false, git_path_isfile("./testrepo/README"));
|
||||
cl_assert_equal_i(false, git_path_isfile("./testrepo/branch_file.txt"));
|
||||
cl_assert_equal_i(false, git_path_isfile("./testrepo/new.txt"));
|
||||
|
||||
cl_git_mkfile("./testrepo/READ", "content\n");
|
||||
cl_git_mkfile("./testrepo/README.after", "content\n");
|
||||
cl_git_pass(p_mkdir("./testrepo/branch_file", 0777));
|
||||
@ -508,13 +481,17 @@ void test_checkout_index__can_update_prefixed_files(void)
|
||||
cl_git_mkfile("./testrepo/branch_file/contained_file", "content\n");
|
||||
cl_git_pass(p_mkdir("./testrepo/branch_file.txt.after", 0777));
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_FORCE | GIT_CHECKOUT_REMOVE_UNTRACKED;
|
||||
opts.checkout_strategy =
|
||||
GIT_CHECKOUT_SAFE_CREATE | GIT_CHECKOUT_REMOVE_UNTRACKED;
|
||||
|
||||
cl_git_pass(git_checkout_index(g_repo, NULL, &opts));
|
||||
|
||||
test_file_contents("./testrepo/README", "hey there\n");
|
||||
test_file_contents("./testrepo/branch_file.txt", "hi\nbye!\n");
|
||||
test_file_contents("./testrepo/new.txt", "my new file\n");
|
||||
/* remove untracked will remove the .gitattributes file before the blobs
|
||||
* were created, so they will have had crlf filtering applied on Windows
|
||||
*/
|
||||
test_file_contents_nocr("./testrepo/README", "hey there\n");
|
||||
test_file_contents_nocr("./testrepo/branch_file.txt", "hi\nbye!\n");
|
||||
test_file_contents_nocr("./testrepo/new.txt", "my new file\n");
|
||||
|
||||
cl_assert(!git_path_exists("testrepo/READ"));
|
||||
cl_assert(!git_path_exists("testrepo/README.after"));
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "checkout_helpers.h"
|
||||
|
||||
#include "git2/checkout.h"
|
||||
#include "repository.h"
|
||||
@ -137,21 +138,6 @@ void test_checkout_tree__doesnt_write_unrequested_files_to_worktree(void)
|
||||
cl_assert_equal_i(false, git_path_isfile("testrepo/readme.txt"));
|
||||
}
|
||||
|
||||
static void assert_on_branch(git_repository *repo, const char *branch)
|
||||
{
|
||||
git_reference *head;
|
||||
git_buf bname = GIT_BUF_INIT;
|
||||
|
||||
cl_git_pass(git_reference_lookup(&head, repo, GIT_HEAD_FILE));
|
||||
cl_assert_(git_reference_type(head) == GIT_REF_SYMBOLIC, branch);
|
||||
|
||||
cl_git_pass(git_buf_joinpath(&bname, "refs/heads", branch));
|
||||
cl_assert_equal_s(bname.ptr, git_reference_symbolic_target(head));
|
||||
|
||||
git_reference_free(head);
|
||||
git_buf_free(&bname);
|
||||
}
|
||||
|
||||
void test_checkout_tree__can_switch_branches(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
@ -241,28 +227,11 @@ void test_checkout_tree__can_remove_ignored(void)
|
||||
cl_assert(!git_path_isfile("testrepo/ignored_file"));
|
||||
}
|
||||
|
||||
/* this is essentially the code from git__unescape modified slightly */
|
||||
static void strip_cr_from_buf(git_buf *buf)
|
||||
{
|
||||
char *scan, *pos = buf->ptr;
|
||||
|
||||
for (scan = pos; *scan; pos++, scan++) {
|
||||
if (*scan == '\r')
|
||||
scan++; /* skip '\r' */
|
||||
if (pos != scan)
|
||||
*pos = *scan;
|
||||
}
|
||||
|
||||
*pos = '\0';
|
||||
buf->size = (pos - buf->ptr);
|
||||
}
|
||||
|
||||
void test_checkout_tree__can_update_only(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
git_oid oid;
|
||||
git_object *obj = NULL;
|
||||
git_buf buf = GIT_BUF_INIT;
|
||||
|
||||
/* first let's get things into a known state - by checkout out the HEAD */
|
||||
|
||||
@ -273,10 +242,7 @@ void test_checkout_tree__can_update_only(void)
|
||||
|
||||
cl_assert(!git_path_isdir("testrepo/a"));
|
||||
|
||||
cl_git_pass(git_futils_readbuffer(&buf, "testrepo/branch_file.txt"));
|
||||
strip_cr_from_buf(&buf);
|
||||
cl_assert_equal_s("hi\nbye!\n", buf.ptr);
|
||||
git_buf_free(&buf);
|
||||
test_file_contents_nocr("testrepo/branch_file.txt", "hi\nbye!\n");
|
||||
|
||||
/* now checkout branch but with update only */
|
||||
|
||||
@ -297,11 +263,7 @@ void test_checkout_tree__can_update_only(void)
|
||||
cl_assert(!git_path_isdir("testrepo/a"));
|
||||
|
||||
/* but this file still should have been updated */
|
||||
cl_git_pass(git_futils_readbuffer(&buf, "testrepo/branch_file.txt"));
|
||||
strip_cr_from_buf(&buf);
|
||||
cl_assert_equal_s("hi\n", buf.ptr);
|
||||
|
||||
git_buf_free(&buf);
|
||||
test_file_contents_nocr("testrepo/branch_file.txt", "hi\n");
|
||||
|
||||
git_object_free(obj);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user