Blame tests/status/worktree_init.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "git2/sys/repository.h"
Packit Service 20376f
Packit Service 20376f
#include "fileops.h"
Packit Service 20376f
#include "ignore.h"
Packit Service 20376f
#include "status_helpers.h"
Packit Service 20376f
#include "posix.h"
Packit Service 20376f
#include "util.h"
Packit Service 20376f
#include "path.h"
Packit Service 20376f
Packit Service 20376f
static void cleanup_new_repo(void *path)
Packit Service 20376f
{
Packit Service 20376f
	cl_fixture_cleanup((char *)path);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__cannot_retrieve_the_status_of_a_bare_repository(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	unsigned int status = 0;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
Packit Service 20376f
	cl_assert_equal_i(GIT_EBAREREPO, git_status_file(&status, repo, "dummy"));
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__first_commit_in_progress(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	status_entry_single result;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&cleanup_new_repo, "getting_started");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_init(&repo, "getting_started", 0));
Packit Service 20376f
	cl_git_mkfile("getting_started/testfile.txt", "content\n");
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(1, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, repo));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "testfile.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(1, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_INDEX_NEW);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__status_file_without_index_or_workdir(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	unsigned int status = 0;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(p_mkdir("wd", 0777));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
Packit Service 20376f
	cl_git_pass(git_repository_set_workdir(repo, "wd", false));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_open(&index, "empty-index"));
Packit Service 20376f
	cl_assert_equal_i(0, (int)git_index_entrycount(index));
Packit Service 20376f
	git_repository_set_index(repo, index);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status, repo, "branch_file.txt"));
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(GIT_STATUS_INDEX_DELETED, status);
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
	cl_git_pass(p_rmdir("wd"));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void fill_index_wth_head_entries(git_repository *repo, git_index *index)
Packit Service 20376f
{
Packit Service 20376f
	git_oid oid;
Packit Service 20376f
	git_commit *commit;
Packit Service 20376f
	git_tree *tree;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_reference_name_to_id(&oid, repo, "HEAD"));
Packit Service 20376f
	cl_git_pass(git_commit_lookup(&commit, repo, &oid));
Packit Service 20376f
	cl_git_pass(git_commit_tree(&tree, commit));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_read_tree(index, tree));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	git_tree_free(tree);
Packit Service 20376f
	git_commit_free(commit);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__status_file_with_clean_index_and_empty_workdir(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	unsigned int status = 0;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(p_mkdir("wd", 0777));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
Packit Service 20376f
	cl_git_pass(git_repository_set_workdir(repo, "wd", false));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_open(&index, "my-index"));
Packit Service 20376f
	fill_index_wth_head_entries(repo, index);
Packit Service 20376f
Packit Service 20376f
	git_repository_set_index(repo, index);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status, repo, "branch_file.txt"));
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_i(GIT_STATUS_WT_DELETED, status);
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
	cl_git_pass(p_rmdir("wd"));
Packit Service 20376f
	cl_git_pass(p_unlink("my-index"));
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__bracket_in_filename(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	status_entry_single result;
Packit Service 20376f
	unsigned int status_flags;
Packit Service 20376f
Packit Service 20376f
	#define FILE_WITH_BRACKET "LICENSE[1].md"
Packit Service 20376f
	#define FILE_WITHOUT_BRACKET "LICENSE1.md"
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&cleanup_new_repo, "with_bracket");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_init(&repo, "with_bracket", 0));
Packit Service 20376f
	cl_git_mkfile("with_bracket/" FILE_WITH_BRACKET, "I have a bracket in my name\n");
Packit Service 20376f
Packit Service 20376f
	/* file is new to working directory */
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(1, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	/* ignore the file */
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("with_bracket/.gitignore", "*.md\n.gitignore\n");
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(2, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_IGNORED);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_IGNORED);
Packit Service 20376f
Packit Service 20376f
	/* don't ignore the file */
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("with_bracket/.gitignore", ".gitignore\n");
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(2, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	/* add the file to the index */
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, repo));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, FILE_WITH_BRACKET));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(2, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_INDEX_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
Packit Service 20376f
Packit Service 20376f
	/* Create file without bracket */
Packit Service 20376f
Packit Service 20376f
	cl_git_mkfile("with_bracket/" FILE_WITHOUT_BRACKET, "I have no bracket in my name!\n");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITHOUT_BRACKET));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_fail_with(git_status_file(&status_flags, repo, "LICENSE\\[1\\].md"), GIT_ENOTFOUND);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_BRACKET));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__space_in_filename(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	status_entry_single result;
Packit Service 20376f
	unsigned int status_flags;
Packit Service 20376f
Packit Service 20376f
#define FILE_WITH_SPACE "LICENSE - copy.md"
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&cleanup_new_repo, "with_space");
Packit Service 20376f
	cl_git_pass(git_repository_init(&repo, "with_space", 0));
Packit Service 20376f
	cl_git_mkfile("with_space/" FILE_WITH_SPACE, "I have a space in my name\n");
Packit Service 20376f
Packit Service 20376f
	/* file is new to working directory */
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(1, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	/* ignore the file */
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("with_space/.gitignore", "*.md\n.gitignore\n");
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(2, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_IGNORED);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_IGNORED);
Packit Service 20376f
Packit Service 20376f
	/* don't ignore the file */
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("with_space/.gitignore", ".gitignore\n");
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(2, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_WT_NEW);
Packit Service 20376f
Packit Service 20376f
	/* add the file to the index */
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, repo));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, FILE_WITH_SPACE));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	memset(&result, 0, sizeof(result));
Packit Service 20376f
	cl_git_pass(git_status_foreach(repo, cb_status__single, &result));
Packit Service 20376f
	cl_assert_equal_i(2, result.count);
Packit Service 20376f
	cl_assert(result.status == GIT_STATUS_INDEX_NEW);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status_flags, repo, FILE_WITH_SPACE));
Packit Service 20376f
	cl_assert(status_flags == GIT_STATUS_INDEX_NEW);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static int cb_status__expected_path(const char *p, unsigned int s, void *payload)
Packit Service 20376f
{
Packit Service 20376f
	const char *expected_path = (const char *)payload;
Packit Service 20376f
Packit Service 20376f
	GIT_UNUSED(s);
Packit Service 20376f
Packit Service 20376f
	if (payload == NULL)
Packit Service 20376f
		cl_fail("Unexpected path");
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_s(expected_path, p);
Packit Service 20376f
Packit Service 20376f
	return 0;
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__disable_pathspec_match(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	char *file_with_bracket = "LICENSE[1].md", 
Packit Service 20376f
		*imaginary_file_with_bracket = "LICENSE[1-2].md";
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&cleanup_new_repo, "pathspec");
Packit Service 20376f
	cl_git_pass(git_repository_init(&repo, "pathspec", 0));
Packit Service 20376f
	cl_git_mkfile("pathspec/LICENSE[1].md", "screaming bracket\n");
Packit Service 20376f
	cl_git_mkfile("pathspec/LICENSE1.md", "no bracket\n");
Packit Service 20376f
Packit Service 20376f
	opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | 
Packit Service 20376f
		GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH;
Packit Service 20376f
	opts.pathspec.count = 1;
Packit Service 20376f
	opts.pathspec.strings = &file_with_bracket;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_status_foreach_ext(repo, &opts, cb_status__expected_path, 
Packit Service 20376f
		file_with_bracket)
Packit Service 20376f
	);
Packit Service 20376f
Packit Service 20376f
	/* Test passing a pathspec matching files in the workdir. */
Packit Service 20376f
	/* Must not match because pathspecs are disabled. */ 
Packit Service 20376f
	opts.pathspec.strings = &imaginary_file_with_bracket;
Packit Service 20376f
	cl_git_pass(
Packit Service 20376f
		git_status_foreach_ext(repo, &opts, cb_status__expected_path, NULL)
Packit Service 20376f
	);
Packit Service 20376f
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_worktree_init__new_staged_file_must_handle_crlf(void)
Packit Service 20376f
{
Packit Service 20376f
	git_repository *repo;
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	unsigned int status;
Packit Service 20376f
Packit Service 20376f
	cl_set_cleanup(&cleanup_new_repo, "getting_started");
Packit Service 20376f
	cl_git_pass(git_repository_init(&repo, "getting_started", 0));
Packit Service 20376f
Packit Service 20376f
	/* Ensure that repo has core.autocrlf=true */
Packit Service 20376f
	cl_repo_set_bool(repo, "core.autocrlf", true);
Packit Service 20376f
Packit Service 20376f
	cl_git_mkfile("getting_started/testfile.txt", "content\r\n");	/* Content with CRLF */
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, repo));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "testfile.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_file(&status, repo, "testfile.txt"));
Packit Service 20376f
	cl_assert_equal_i(GIT_STATUS_INDEX_NEW, status);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
	git_repository_free(repo);
Packit Service 20376f
}
Packit Service 20376f