summaryrefslogtreecommitdiff
path: root/tests/repo/template.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/repo/template.c')
-rw-r--r--tests/repo/template.c295
1 files changed, 0 insertions, 295 deletions
diff --git a/tests/repo/template.c b/tests/repo/template.c
deleted file mode 100644
index 3513190ac..000000000
--- a/tests/repo/template.c
+++ /dev/null
@@ -1,295 +0,0 @@
-#include "clar_libgit2.h"
-
-#include "futils.h"
-#include "repo/repo_helpers.h"
-
-#define CLEAR_FOR_CORE_FILEMODE(M) ((M) &= ~0177)
-
-static git_repository *_repo = NULL;
-static mode_t g_umask = 0;
-static git_buf _global_path = GIT_BUF_INIT;
-
-static const char *fixture_repo;
-static const char *fixture_templates;
-
-void test_repo_template__initialize(void)
-{
- _repo = NULL;
-
- /* load umask if not already loaded */
- if (!g_umask) {
- g_umask = p_umask(022);
- (void)p_umask(g_umask);
- }
-}
-
-void test_repo_template__cleanup(void)
-{
- git_libgit2_opts(GIT_OPT_SET_SEARCH_PATH, GIT_CONFIG_LEVEL_GLOBAL,
- _global_path.ptr);
- git_buf_dispose(&_global_path);
-
- cl_fixture_cleanup("tmp_global_path");
-
- if (fixture_repo) {
- cl_fixture_cleanup(fixture_repo);
- fixture_repo = NULL;
- }
-
- if (fixture_templates) {
- cl_fixture_cleanup(fixture_templates);
- fixture_templates = NULL;
- }
-
- git_repository_free(_repo);
- _repo = NULL;
-}
-
-static void assert_hooks_match(
- const char *template_dir,
- const char *repo_dir,
- const char *hook_path,
- bool core_filemode)
-{
- git_buf expected = GIT_BUF_INIT;
- git_buf actual = GIT_BUF_INIT;
- struct stat expected_st, st;
-
- cl_git_pass(git_buf_joinpath(&expected, template_dir, hook_path));
- cl_git_pass(git_path_lstat(expected.ptr, &expected_st));
-
- cl_git_pass(git_buf_joinpath(&actual, repo_dir, hook_path));
- cl_git_pass(git_path_lstat(actual.ptr, &st));
-
- cl_assert(expected_st.st_size == st.st_size);
-
- if (GIT_MODE_TYPE(expected_st.st_mode) != GIT_FILEMODE_LINK) {
- mode_t expected_mode =
- GIT_MODE_TYPE(expected_st.st_mode) |
- (GIT_PERMS_FOR_WRITE(expected_st.st_mode) & ~g_umask);
-
- if (!core_filemode) {
- CLEAR_FOR_CORE_FILEMODE(expected_mode);
- CLEAR_FOR_CORE_FILEMODE(st.st_mode);
- }
-
- cl_assert_equal_i_fmt(expected_mode, st.st_mode, "%07o");
- }
-
- git_buf_dispose(&expected);
- git_buf_dispose(&actual);
-}
-
-static void assert_mode_seems_okay(
- const char *base, const char *path,
- git_filemode_t expect_mode, bool expect_setgid, bool core_filemode)
-{
- git_buf full = GIT_BUF_INIT;
- struct stat st;
-
- cl_git_pass(git_buf_joinpath(&full, base, path));
- cl_git_pass(git_path_lstat(full.ptr, &st));
- git_buf_dispose(&full);
-
- if (!core_filemode) {
- CLEAR_FOR_CORE_FILEMODE(expect_mode);
- CLEAR_FOR_CORE_FILEMODE(st.st_mode);
- expect_setgid = false;
- }
-
- if (S_ISGID != 0)
- cl_assert_equal_b(expect_setgid, (st.st_mode & S_ISGID) != 0);
-
- cl_assert_equal_b(
- GIT_PERMS_IS_EXEC(expect_mode), GIT_PERMS_IS_EXEC(st.st_mode));
-
- cl_assert_equal_i_fmt(
- GIT_MODE_TYPE(expect_mode), GIT_MODE_TYPE(st.st_mode), "%07o");
-}
-
-static void setup_repo(const char *name, git_repository_init_options *opts)
-{
- cl_git_pass(git_repository_init_ext(&_repo, name, opts));
- fixture_repo = name;
-}
-
-static void setup_templates(const char *name, bool setup_globally)
-{
- git_buf path = GIT_BUF_INIT;
-
- cl_fixture_sandbox("template");
- if (strcmp(name, "template"))
- cl_must_pass(p_rename("template", name));
-
- fixture_templates = name;
-
- /*
- * Create a symlink from link.sample to update.sample if the filesystem
- * supports it.
- */
- cl_git_pass(git_buf_join3(&path, '/', name, "hooks", "link.sample"));
-#ifdef GIT_WIN32
- cl_git_mkfile(path.ptr, "#!/bin/sh\necho hello, world\n");
-#else
- cl_must_pass(p_symlink("update.sample", path.ptr));
-#endif
-
- git_buf_clear(&path);
-
- /* Create a file starting with a dot */
- cl_git_pass(git_buf_join3(&path, '/', name, "hooks", ".dotfile"));
- cl_git_mkfile(path.ptr, "something\n");
-
- git_buf_clear(&path);
-
- if (setup_globally) {
- cl_git_pass(git_buf_joinpath(&path, clar_sandbox_path(), name));
- create_tmp_global_config("tmp_global_path", "init.templatedir", path.ptr);
- }
-
- git_buf_dispose(&path);
-}
-
-static void validate_templates(git_repository *repo, const char *template_path)
-{
- git_buf path = GIT_BUF_INIT, expected = GIT_BUF_INIT, actual = GIT_BUF_INIT;
- int filemode;
-
- cl_git_pass(git_buf_joinpath(&path, template_path, "description"));
- cl_git_pass(git_futils_readbuffer(&expected, path.ptr));
-
- git_buf_clear(&path);
-
- cl_git_pass(git_buf_joinpath(&path, git_repository_path(repo), "description"));
- cl_git_pass(git_futils_readbuffer(&actual, path.ptr));
-
- cl_assert_equal_s(expected.ptr, actual.ptr);
-
- filemode = cl_repo_get_bool(repo, "core.filemode");
-
- assert_hooks_match(
- template_path, git_repository_path(repo),
- "hooks/update.sample", filemode);
- assert_hooks_match(
- template_path, git_repository_path(repo),
- "hooks/link.sample", filemode);
- assert_hooks_match(
- template_path, git_repository_path(repo),
- "hooks/.dotfile", filemode);
-
- git_buf_dispose(&expected);
- git_buf_dispose(&actual);
- git_buf_dispose(&path);
-}
-
-void test_repo_template__external_templates_specified_in_options(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
- opts.template_path = "template";
-
- setup_templates("template", false);
- setup_repo("templated.git", &opts);
-
- validate_templates(_repo, "template");
-}
-
-void test_repo_template__external_templates_specified_in_config(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
-
- setup_templates("template", true);
- setup_repo("templated.git", &opts);
-
- validate_templates(_repo, "template");
-}
-
-void test_repo_template__external_templates_with_leading_dot(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_BARE |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
-
- setup_templates(".template_with_leading_dot", true);
- setup_repo("templated.git", &opts);
-
- validate_templates(_repo, ".template_with_leading_dot");
-}
-
-void test_repo_template__extended_with_template_and_shared_mode(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
- const char *repo_path;
- int filemode;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH |
- GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
- opts.template_path = "template";
- opts.mode = GIT_REPOSITORY_INIT_SHARED_GROUP;
-
- setup_templates("template", false);
- setup_repo("init_shared_from_tpl", &opts);
-
- filemode = cl_repo_get_bool(_repo, "core.filemode");
-
- repo_path = git_repository_path(_repo);
- assert_mode_seems_okay(repo_path, "hooks",
- GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode);
- assert_mode_seems_okay(repo_path, "info",
- GIT_FILEMODE_TREE | GIT_REPOSITORY_INIT_SHARED_GROUP, true, filemode);
- assert_mode_seems_okay(repo_path, "description",
- GIT_FILEMODE_BLOB, false, filemode);
-
- validate_templates(_repo, "template");
-}
-
-void test_repo_template__templated_head_is_used(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
- git_buf head = GIT_BUF_INIT;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
-
- setup_templates("template", true);
- cl_git_mkfile("template/HEAD", "foobar\n");
- setup_repo("repo", &opts);
-
- cl_git_pass(git_futils_readbuffer(&head, "repo/.git/HEAD"));
- cl_assert_equal_s("foobar\n", head.ptr);
-
- git_buf_dispose(&head);
-}
-
-void test_repo_template__initial_head_option_overrides_template_head(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
- git_buf head = GIT_BUF_INIT;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
- opts.initial_head = "manual";
-
- setup_templates("template", true);
- cl_git_mkfile("template/HEAD", "foobar\n");
- setup_repo("repo", &opts);
-
- cl_git_pass(git_futils_readbuffer(&head, "repo/.git/HEAD"));
- cl_assert_equal_s("ref: refs/heads/manual\n", head.ptr);
-
- git_buf_dispose(&head);
-}
-
-void test_repo_template__empty_template_path(void)
-{
- git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
-
- opts.flags = GIT_REPOSITORY_INIT_MKPATH | GIT_REPOSITORY_INIT_EXTERNAL_TEMPLATE;
- opts.template_path = "";
-
- setup_repo("foo", &opts);
-}