mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 07:20:07 +00:00
Status tests...
This commit is contained in:
parent
7b51d675e8
commit
54254a0fe2
@ -6,18 +6,6 @@
|
||||
#include "util.h"
|
||||
#include "path.h"
|
||||
|
||||
static char *path_to_cleanup = NULL;
|
||||
|
||||
/**
|
||||
* Initializer
|
||||
*
|
||||
* Not all of the tests in this file use the same fixtures, so we allow each
|
||||
* test to load their fixture at the top of the test function.
|
||||
*/
|
||||
void test_status_worktree__initialize(void)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup
|
||||
*
|
||||
@ -27,10 +15,6 @@ void test_status_worktree__initialize(void)
|
||||
void test_status_worktree__cleanup(void)
|
||||
{
|
||||
cl_git_sandbox_cleanup();
|
||||
|
||||
if (path_to_cleanup)
|
||||
cl_fixture_cleanup(path_to_cleanup);
|
||||
path_to_cleanup = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -415,259 +399,43 @@ void test_status_worktree__issue_592_ignored_dirs_with_tracked_content(void)
|
||||
*/
|
||||
}
|
||||
|
||||
void test_status_worktree__cannot_retrieve_the_status_of_a_bare_repository(void)
|
||||
void test_status_worktree__conflict_with_diff3(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
unsigned int status = 0;
|
||||
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
|
||||
cl_assert_equal_i(GIT_EBAREREPO, git_status_file(&status, repo, "dummy"));
|
||||
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
void test_status_worktree__first_commit_in_progress(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
git_index *index;
|
||||
status_entry_single result;
|
||||
unsigned int status;
|
||||
git_index_entry ancestor_entry, our_entry, their_entry;
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "getting_started", 0));
|
||||
cl_git_mkfile("getting_started/testfile.txt", "content\n");
|
||||
memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
|
||||
memset(&our_entry, 0x0, sizeof(git_index_entry));
|
||||
memset(&their_entry, 0x0, sizeof(git_index_entry));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
ancestor_entry.path = "modified_file";
|
||||
git_oid_fromstr(&ancestor_entry.oid,
|
||||
"452e4244b5d083ddf0460acf1ecc74db9dcfa11a");
|
||||
|
||||
our_entry.path = "modified_file";
|
||||
git_oid_fromstr(&our_entry.oid,
|
||||
"452e4244b5d083ddf0460acf1ecc74db9dcfa11a");
|
||||
|
||||
their_entry.path = "modified_file";
|
||||
git_oid_fromstr(&their_entry.oid,
|
||||
"452e4244b5d083ddf0460acf1ecc74db9dcfa11a");
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "modified_file"));
|
||||
cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status);
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, "testfile.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_INDEX_NEW);
|
||||
cl_git_pass(git_index_remove(index, "modified_file", 0));
|
||||
cl_git_pass(git_index_conflict_add(index, &ancestor_entry,
|
||||
&our_entry, &their_entry));
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "modified_file"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_INDEX_DELETED | GIT_STATUS_WT_NEW, status);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
path_to_cleanup = "getting_started";
|
||||
}
|
||||
|
||||
|
||||
|
||||
void test_status_worktree__status_file_without_index_or_workdir(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
unsigned int status = 0;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("wd", 0777));
|
||||
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
cl_git_pass(git_repository_set_workdir(repo, "wd", false));
|
||||
|
||||
cl_git_pass(git_index_open(&index, "empty-index"));
|
||||
cl_assert_equal_i(0, (int)git_index_entrycount(index));
|
||||
git_repository_set_index(repo, index);
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "branch_file.txt"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_INDEX_DELETED, status);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_index_free(index);
|
||||
cl_git_pass(p_rmdir("wd"));
|
||||
}
|
||||
|
||||
static void fill_index_wth_head_entries(git_repository *repo, git_index *index)
|
||||
{
|
||||
git_oid oid;
|
||||
git_commit *commit;
|
||||
git_tree *tree;
|
||||
|
||||
cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD"));
|
||||
cl_git_pass(git_commit_lookup(&commit, repo, &oid));
|
||||
cl_git_pass(git_commit_tree(&tree, commit));
|
||||
|
||||
cl_git_pass(git_index_read_tree(index, tree));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_tree_free(tree);
|
||||
git_commit_free(commit);
|
||||
}
|
||||
|
||||
void test_status_worktree__status_file_with_clean_index_and_empty_workdir(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
unsigned int status = 0;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("wd", 0777));
|
||||
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
cl_git_pass(git_repository_set_workdir(repo, "wd", false));
|
||||
|
||||
cl_git_pass(git_index_open(&index, "my-index"));
|
||||
fill_index_wth_head_entries(repo, index);
|
||||
|
||||
git_repository_set_index(repo, index);
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "branch_file.txt"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_WT_DELETED, status);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_index_free(index);
|
||||
cl_git_pass(p_rmdir("wd"));
|
||||
cl_git_pass(p_unlink("my-index"));
|
||||
}
|
||||
|
||||
void test_status_worktree__bracket_in_filename(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
status_entry_single result;
|
||||
unsigned int status_flags;
|
||||
int error;
|
||||
|
||||
#define FILE_WITH_BRACKET "LICENSE[1].md"
|
||||
#define FILE_WITHOUT_BRACKET "LICENSE1.md"
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "with_bracket", 0));
|
||||
cl_git_mkfile("with_bracket/" FILE_WITH_BRACKET, "I have a bracket in my name\n");
|
||||
|
||||
/* file is new to working directory */
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_bracket/.gitignore", "*.md\n.gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_IGNORED);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_IGNORED);
|
||||
|
||||
/* don't ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_bracket/.gitignore", ".gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* add the file to the index */
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, FILE_WITH_BRACKET));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
/* Create file without bracket */
|
||||
|
||||
cl_git_mkfile("with_bracket/" FILE_WITHOUT_BRACKET, "I have no bracket in my name!\n");
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITHOUT_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, "LICENSE\\[1\\].md"));
|
||||
cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
error = git_status_file(&status_flags, repo, FILE_WITH_BRACKET);
|
||||
cl_git_fail(error);
|
||||
cl_assert_equal_i(GIT_EAMBIGUOUS, error);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
path_to_cleanup = "with_bracket";
|
||||
}
|
||||
|
||||
void test_status_worktree__space_in_filename(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
status_entry_single result;
|
||||
unsigned int status_flags;
|
||||
|
||||
#define FILE_WITH_SPACE "LICENSE - copy.md"
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "with_space", 0));
|
||||
cl_git_mkfile("with_space/" FILE_WITH_SPACE, "I have a space in my name\n");
|
||||
|
||||
/* file is new to working directory */
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_space/.gitignore", "*.md\n.gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_IGNORED);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_IGNORED);
|
||||
|
||||
/* don't ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_space/.gitignore", ".gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* add the file to the index */
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, FILE_WITH_SPACE));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
path_to_cleanup = "with_space";
|
||||
}
|
||||
|
||||
static const char *filemode_paths[] = {
|
||||
@ -735,53 +503,6 @@ void test_status_worktree__filemode_changes(void)
|
||||
git_config_free(cfg);
|
||||
}
|
||||
|
||||
static int cb_status__expected_path(const char *p, unsigned int s, void *payload)
|
||||
{
|
||||
const char *expected_path = (const char *)payload;
|
||||
|
||||
GIT_UNUSED(s);
|
||||
|
||||
if (payload == NULL)
|
||||
cl_fail("Unexpected path");
|
||||
|
||||
cl_assert_equal_s(expected_path, p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test_status_worktree__disable_pathspec_match(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
char *file_with_bracket = "LICENSE[1].md",
|
||||
*imaginary_file_with_bracket = "LICENSE[1-2].md";
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "pathspec", 0));
|
||||
cl_git_mkfile("pathspec/LICENSE[1].md", "screaming bracket\n");
|
||||
cl_git_mkfile("pathspec/LICENSE1.md", "no bracket\n");
|
||||
|
||||
opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
|
||||
GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH;
|
||||
opts.pathspec.count = 1;
|
||||
opts.pathspec.strings = &file_with_bracket;
|
||||
|
||||
cl_git_pass(
|
||||
git_status_foreach_ext(repo, &opts, cb_status__expected_path,
|
||||
file_with_bracket)
|
||||
);
|
||||
|
||||
/* Test passing a pathspec matching files in the workdir. */
|
||||
/* Must not match because pathspecs are disabled. */
|
||||
opts.pathspec.strings = &imaginary_file_with_bracket;
|
||||
cl_git_pass(
|
||||
git_status_foreach_ext(repo, &opts, cb_status__expected_path, NULL)
|
||||
);
|
||||
|
||||
git_repository_free(repo);
|
||||
path_to_cleanup = "pathspec";
|
||||
}
|
||||
|
||||
|
||||
static int cb_status__interrupt(const char *p, unsigned int s, void *payload)
|
||||
{
|
||||
volatile int *count = (int *)payload;
|
||||
@ -806,34 +527,6 @@ void test_status_worktree__interruptable_foreach(void)
|
||||
cl_assert_equal_i(8, count);
|
||||
}
|
||||
|
||||
void test_status_worktree__new_staged_file_must_handle_crlf(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
git_config *config;
|
||||
unsigned int status;
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "getting_started", 0));
|
||||
|
||||
// Ensure that repo has core.autocrlf=true
|
||||
cl_git_pass(git_repository_config(&config, repo));
|
||||
cl_git_pass(git_config_set_bool(config, "core.autocrlf", true));
|
||||
|
||||
cl_git_mkfile("getting_started/testfile.txt", "content\r\n"); // Content with CRLF
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, "testfile.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "testfile.txt"));
|
||||
cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status);
|
||||
|
||||
git_config_free(config);
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
path_to_cleanup = "getting_started";
|
||||
}
|
||||
|
||||
void test_status_worktree__line_endings_dont_count_as_changes_with_autocrlf(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
@ -887,42 +580,3 @@ void test_status_worktree__conflicted_item(void)
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_status_worktree__conflict_with_diff3(void)
|
||||
{
|
||||
git_repository *repo = cl_git_sandbox_init("status");
|
||||
git_index *index;
|
||||
unsigned int status;
|
||||
git_index_entry ancestor_entry, our_entry, their_entry;
|
||||
|
||||
memset(&ancestor_entry, 0x0, sizeof(git_index_entry));
|
||||
memset(&our_entry, 0x0, sizeof(git_index_entry));
|
||||
memset(&their_entry, 0x0, sizeof(git_index_entry));
|
||||
|
||||
ancestor_entry.path = "modified_file";
|
||||
git_oid_fromstr(&ancestor_entry.oid,
|
||||
"452e4244b5d083ddf0460acf1ecc74db9dcfa11a");
|
||||
|
||||
our_entry.path = "modified_file";
|
||||
git_oid_fromstr(&our_entry.oid,
|
||||
"452e4244b5d083ddf0460acf1ecc74db9dcfa11a");
|
||||
|
||||
their_entry.path = "modified_file";
|
||||
git_oid_fromstr(&their_entry.oid,
|
||||
"452e4244b5d083ddf0460acf1ecc74db9dcfa11a");
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "modified_file"));
|
||||
cl_assert_equal_i(GIT_STATUS_WT_MODIFIED, status);
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
|
||||
cl_git_pass(git_index_remove(index, "modified_file", 0));
|
||||
cl_git_pass(git_index_conflict_add(index, &ancestor_entry,
|
||||
&our_entry, &their_entry));
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "modified_file"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_INDEX_DELETED | GIT_STATUS_WT_NEW, status);
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
|
342
tests-clar/status/worktree_init.c
Normal file
342
tests-clar/status/worktree_init.c
Normal file
@ -0,0 +1,342 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "fileops.h"
|
||||
#include "ignore.h"
|
||||
#include "status_helpers.h"
|
||||
#include "posix.h"
|
||||
#include "util.h"
|
||||
#include "path.h"
|
||||
|
||||
static void cleanup_new_repo(void *path)
|
||||
{
|
||||
cl_fixture_cleanup((char *)path);
|
||||
}
|
||||
|
||||
void test_status_worktree_init__cannot_retrieve_the_status_of_a_bare_repository(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
unsigned int status = 0;
|
||||
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
cl_assert_equal_i(GIT_EBAREREPO, git_status_file(&status, repo, "dummy"));
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
void test_status_worktree_init__first_commit_in_progress(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
status_entry_single result;
|
||||
|
||||
cl_set_cleanup(&cleanup_new_repo, "getting_started");
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "getting_started", 0));
|
||||
cl_git_mkfile("getting_started/testfile.txt", "content\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, "testfile.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void test_status_worktree_init__status_file_without_index_or_workdir(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
unsigned int status = 0;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("wd", 0777));
|
||||
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
cl_git_pass(git_repository_set_workdir(repo, "wd", false));
|
||||
|
||||
cl_git_pass(git_index_open(&index, "empty-index"));
|
||||
cl_assert_equal_i(0, (int)git_index_entrycount(index));
|
||||
git_repository_set_index(repo, index);
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "branch_file.txt"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_INDEX_DELETED, status);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_index_free(index);
|
||||
cl_git_pass(p_rmdir("wd"));
|
||||
}
|
||||
|
||||
static void fill_index_wth_head_entries(git_repository *repo, git_index *index)
|
||||
{
|
||||
git_oid oid;
|
||||
git_commit *commit;
|
||||
git_tree *tree;
|
||||
|
||||
cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD"));
|
||||
cl_git_pass(git_commit_lookup(&commit, repo, &oid));
|
||||
cl_git_pass(git_commit_tree(&tree, commit));
|
||||
|
||||
cl_git_pass(git_index_read_tree(index, tree));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
git_tree_free(tree);
|
||||
git_commit_free(commit);
|
||||
}
|
||||
|
||||
void test_status_worktree_init__status_file_with_clean_index_and_empty_workdir(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
unsigned int status = 0;
|
||||
git_index *index;
|
||||
|
||||
cl_git_pass(p_mkdir("wd", 0777));
|
||||
|
||||
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
|
||||
cl_git_pass(git_repository_set_workdir(repo, "wd", false));
|
||||
|
||||
cl_git_pass(git_index_open(&index, "my-index"));
|
||||
fill_index_wth_head_entries(repo, index);
|
||||
|
||||
git_repository_set_index(repo, index);
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "branch_file.txt"));
|
||||
|
||||
cl_assert_equal_i(GIT_STATUS_WT_DELETED, status);
|
||||
|
||||
git_repository_free(repo);
|
||||
git_index_free(index);
|
||||
cl_git_pass(p_rmdir("wd"));
|
||||
cl_git_pass(p_unlink("my-index"));
|
||||
}
|
||||
|
||||
void test_status_worktree_init__bracket_in_filename(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
status_entry_single result;
|
||||
unsigned int status_flags;
|
||||
int error;
|
||||
|
||||
#define FILE_WITH_BRACKET "LICENSE[1].md"
|
||||
#define FILE_WITHOUT_BRACKET "LICENSE1.md"
|
||||
|
||||
cl_set_cleanup(&cleanup_new_repo, "with_bracket");
|
||||
|
||||
cl_git_pass(git_repository_init(&repo, "with_bracket", 0));
|
||||
cl_git_mkfile("with_bracket/" FILE_WITH_BRACKET, "I have a bracket in my name\n");
|
||||
|
||||
/* file is new to working directory */
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_bracket/.gitignore", "*.md\n.gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_IGNORED);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_IGNORED);
|
||||
|
||||
/* don't ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_bracket/.gitignore", ".gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* add the file to the index */
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, FILE_WITH_BRACKET));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
/* Create file without bracket */
|
||||
|
||||
cl_git_mkfile("with_bracket/" FILE_WITHOUT_BRACKET, "I have no bracket in my name!\n");
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITHOUT_BRACKET));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, "LICENSE\\[1\\].md"));
|
||||
cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
error = git_status_file(&status_flags, repo, FILE_WITH_BRACKET);
|
||||
cl_git_fail(error);
|
||||
cl_assert_equal_i(GIT_EAMBIGUOUS, error);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
void test_status_worktree_init__space_in_filename(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
status_entry_single result;
|
||||
unsigned int status_flags;
|
||||
|
||||
#define FILE_WITH_SPACE "LICENSE - copy.md"
|
||||
|
||||
cl_set_cleanup(&cleanup_new_repo, "with_space");
|
||||
cl_git_pass(git_repository_init(&repo, "with_space", 0));
|
||||
cl_git_mkfile("with_space/" FILE_WITH_SPACE, "I have a space in my name\n");
|
||||
|
||||
/* file is new to working directory */
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(1, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_space/.gitignore", "*.md\n.gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_IGNORED);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_IGNORED);
|
||||
|
||||
/* don't ignore the file */
|
||||
|
||||
cl_git_rewritefile("with_space/.gitignore", ".gitignore\n");
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_WT_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_WT_NEW);
|
||||
|
||||
/* add the file to the index */
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, FILE_WITH_SPACE));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
memset(&result, 0, sizeof(result));
|
||||
cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
|
||||
cl_assert_equal_i(2, result.count);
|
||||
cl_assert(result.status == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
|
||||
cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
|
||||
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
static int cb_status__expected_path(const char *p, unsigned int s, void *payload)
|
||||
{
|
||||
const char *expected_path = (const char *)payload;
|
||||
|
||||
GIT_UNUSED(s);
|
||||
|
||||
if (payload == NULL)
|
||||
cl_fail("Unexpected path");
|
||||
|
||||
cl_assert_equal_s(expected_path, p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void test_status_worktree_init__disable_pathspec_match(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
char *file_with_bracket = "LICENSE[1].md",
|
||||
*imaginary_file_with_bracket = "LICENSE[1-2].md";
|
||||
|
||||
cl_set_cleanup(&cleanup_new_repo, "pathspec");
|
||||
cl_git_pass(git_repository_init(&repo, "pathspec", 0));
|
||||
cl_git_mkfile("pathspec/LICENSE[1].md", "screaming bracket\n");
|
||||
cl_git_mkfile("pathspec/LICENSE1.md", "no bracket\n");
|
||||
|
||||
opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED |
|
||||
GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH;
|
||||
opts.pathspec.count = 1;
|
||||
opts.pathspec.strings = &file_with_bracket;
|
||||
|
||||
cl_git_pass(
|
||||
git_status_foreach_ext(repo, &opts, cb_status__expected_path,
|
||||
file_with_bracket)
|
||||
);
|
||||
|
||||
/* Test passing a pathspec matching files in the workdir. */
|
||||
/* Must not match because pathspecs are disabled. */
|
||||
opts.pathspec.strings = &imaginary_file_with_bracket;
|
||||
cl_git_pass(
|
||||
git_status_foreach_ext(repo, &opts, cb_status__expected_path, NULL)
|
||||
);
|
||||
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
||||
void test_status_worktree_init__new_staged_file_must_handle_crlf(void)
|
||||
{
|
||||
git_repository *repo;
|
||||
git_index *index;
|
||||
git_config *config;
|
||||
unsigned int status;
|
||||
|
||||
cl_set_cleanup(&cleanup_new_repo, "getting_started");
|
||||
cl_git_pass(git_repository_init(&repo, "getting_started", 0));
|
||||
|
||||
// Ensure that repo has core.autocrlf=true
|
||||
cl_git_pass(git_repository_config(&config, repo));
|
||||
cl_git_pass(git_config_set_bool(config, "core.autocrlf", true));
|
||||
|
||||
cl_git_mkfile("getting_started/testfile.txt", "content\r\n"); // Content with CRLF
|
||||
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
cl_git_pass(git_index_add_from_workdir(index, "testfile.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
cl_git_pass(git_status_file(&status, repo, "testfile.txt"));
|
||||
cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status);
|
||||
|
||||
git_config_free(config);
|
||||
git_index_free(index);
|
||||
git_repository_free(repo);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user