mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-11-04 14:08:17 +00:00 
			
		
		
		
	This currently only ensures that the version of the repository format isn't greater than zero.
		
			
				
	
	
		
			144 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "clar_libgit2.h"
 | 
						|
#include "fileops.h"
 | 
						|
#include "repository.h"
 | 
						|
#include "config.h"
 | 
						|
 | 
						|
enum repo_mode {
 | 
						|
	STANDARD_REPOSITORY = 0,
 | 
						|
	BARE_REPOSITORY = 1
 | 
						|
};
 | 
						|
 | 
						|
static git_repository *_repo;
 | 
						|
 | 
						|
void test_repo_init__initialize(void)
 | 
						|
{
 | 
						|
	_repo = NULL;
 | 
						|
}
 | 
						|
 | 
						|
static void cleanup_repository(void *path)
 | 
						|
{
 | 
						|
	git_repository_free(_repo);
 | 
						|
	cl_fixture_cleanup((const char *)path);
 | 
						|
}
 | 
						|
 | 
						|
static void ensure_repository_init(
 | 
						|
	const char *working_directory,
 | 
						|
	int is_bare,
 | 
						|
	const char *expected_path_repository,
 | 
						|
	const char *expected_working_directory)
 | 
						|
{
 | 
						|
	const char *workdir;
 | 
						|
 | 
						|
	cl_git_pass(git_repository_init(&_repo, working_directory, is_bare));
 | 
						|
 | 
						|
	workdir = git_repository_workdir(_repo);
 | 
						|
	if (workdir != NULL || expected_working_directory != NULL) {
 | 
						|
		cl_assert(
 | 
						|
			git__suffixcmp(workdir, expected_working_directory) == 0
 | 
						|
		);
 | 
						|
	}
 | 
						|
 | 
						|
	cl_assert(
 | 
						|
		git__suffixcmp(git_repository_path(_repo), expected_path_repository) == 0
 | 
						|
	);
 | 
						|
 | 
						|
	cl_assert(git_repository_is_bare(_repo) == is_bare);
 | 
						|
 | 
						|
#ifdef GIT_WIN32
 | 
						|
	if (!is_bare) {
 | 
						|
		cl_assert((GetFileAttributes(git_repository_path(_repo)) & FILE_ATTRIBUTE_HIDDEN) != 0);
 | 
						|
	}
 | 
						|
#endif
 | 
						|
 | 
						|
	cl_assert(git_repository_is_empty(_repo));
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__standard_repo(void)
 | 
						|
{
 | 
						|
	cl_set_cleanup(&cleanup_repository, "testrepo");
 | 
						|
	ensure_repository_init("testrepo/", 0, "testrepo/.git/", "testrepo/");
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__standard_repo_noslash(void)
 | 
						|
{
 | 
						|
	cl_set_cleanup(&cleanup_repository, "testrepo");
 | 
						|
	ensure_repository_init("testrepo", 0, "testrepo/.git/", "testrepo/");
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__bare_repo(void)
 | 
						|
{
 | 
						|
	cl_set_cleanup(&cleanup_repository, "testrepo.git");
 | 
						|
	ensure_repository_init("testrepo.git/", 1, "testrepo.git/", NULL);
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__bare_repo_noslash(void)
 | 
						|
{
 | 
						|
	cl_set_cleanup(&cleanup_repository, "testrepo.git");
 | 
						|
	ensure_repository_init("testrepo.git", 1, "testrepo.git/", NULL);
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__bare_repo_escaping_current_workdir(void)
 | 
						|
{
 | 
						|
	git_buf path_repository = GIT_BUF_INIT;
 | 
						|
	git_buf path_current_workdir = GIT_BUF_INIT;
 | 
						|
 | 
						|
	cl_git_pass(git_path_prettify_dir(&path_current_workdir, ".", NULL));
 | 
						|
	
 | 
						|
	cl_git_pass(git_buf_joinpath(&path_repository, git_buf_cstr(&path_current_workdir), "a/b/c"));
 | 
						|
	cl_git_pass(git_futils_mkdir_r(git_buf_cstr(&path_repository), NULL, GIT_DIR_MODE));
 | 
						|
 | 
						|
	/* Change the current working directory */
 | 
						|
	cl_git_pass(chdir(git_buf_cstr(&path_repository)));
 | 
						|
 | 
						|
	/* Initialize a bare repo with a relative path escaping out of the current working directory */
 | 
						|
	cl_git_pass(git_repository_init(&_repo, "../d/e.git", 1));
 | 
						|
	cl_git_pass(git__suffixcmp(git_repository_path(_repo), "/a/b/d/e.git/"));
 | 
						|
 | 
						|
	git_repository_free(_repo);
 | 
						|
 | 
						|
	/* Open a bare repo with a relative path escaping out of the current working directory */
 | 
						|
	cl_git_pass(git_repository_open(&_repo, "../d/e.git"));
 | 
						|
 | 
						|
	cl_git_pass(chdir(git_buf_cstr(&path_current_workdir)));
 | 
						|
 | 
						|
	git_buf_free(&path_current_workdir);
 | 
						|
	git_buf_free(&path_repository);
 | 
						|
 | 
						|
	cleanup_repository("a");
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__reinit_bare_repo(void)
 | 
						|
{
 | 
						|
	cl_set_cleanup(&cleanup_repository, "reinit.git");
 | 
						|
 | 
						|
	/* Initialize the repository */
 | 
						|
	cl_git_pass(git_repository_init(&_repo, "reinit.git", 1));
 | 
						|
	git_repository_free(_repo);
 | 
						|
 | 
						|
	/* Reinitialize the repository */
 | 
						|
	cl_git_pass(git_repository_init(&_repo, "reinit.git", 1));
 | 
						|
}
 | 
						|
 | 
						|
void test_repo_init__reinit_too_recent_bare_repo(void)
 | 
						|
{
 | 
						|
	git_config *config;
 | 
						|
 | 
						|
	/* Initialize the repository */
 | 
						|
	cl_git_pass(git_repository_init(&_repo, "reinit.git", 1));
 | 
						|
	git_repository_config(&config, _repo);
 | 
						|
 | 
						|
	/*
 | 
						|
	 * Hack the config of the repository to make it look like it has
 | 
						|
	 * been created by a recenter version of git/libgit2
 | 
						|
	 */
 | 
						|
	cl_git_pass(git_config_set_int32(config, "core.repositoryformatversion", 42));
 | 
						|
 | 
						|
	git_config_free(config);
 | 
						|
	git_repository_free(_repo);
 | 
						|
 | 
						|
	/* Try to reinitialize the repository */
 | 
						|
	cl_git_fail(git_repository_init(&_repo, "reinit.git", 1));
 | 
						|
 | 
						|
	cl_fixture_cleanup("reinit.git");
 | 
						|
}
 |