Skip to content

Commit 7785078

Browse files
authored
Merge pull request libgit2#4273 from azdavis/fix-template-dir-empty-string
Fix template dir empty string
2 parents 15e1193 + af720bb commit 7785078

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

src/repository.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ static int reserved_names_add8dot3(git_repository *repo, const char *path)
12351235

12361236
name_len = strlen(name);
12371237

1238-
if ((name_len == def_len && memcmp(name, def, def_len) == 0) ||
1238+
if ((name_len == def_len && memcmp(name, def, def_len) == 0) ||
12391239
(name_len == def_dot_git_len && memcmp(name, def_dot_git, def_dot_git_len) == 0)) {
12401240
git__free(name);
12411241
return 0;
@@ -1784,7 +1784,13 @@ static int repo_init_structure(
17841784
default_template = true;
17851785
}
17861786

1787-
if (tdir) {
1787+
/*
1788+
* If tdir was the empty string, treat it like tdir was a path to an
1789+
* empty directory (so, don't do any copying). This is the behavior
1790+
* that git(1) exhibits, although it doesn't seem to be officially
1791+
* documented.
1792+
*/
1793+
if (tdir && git__strcmp(tdir, "") != 0) {
17881794
uint32_t cpflags = GIT_CPDIR_COPY_SYMLINKS |
17891795
GIT_CPDIR_SIMPLE_TO_MODE |
17901796
GIT_CPDIR_COPY_DOTFILES;
@@ -2762,7 +2768,7 @@ int git_repository__cleanup_files(
27622768
error = git_futils_rmdir_r(path, NULL,
27632769
GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_REMOVE_BLOCKERS);
27642770
}
2765-
2771+
27662772
git_buf_clear(&buf);
27672773
}
27682774

tests/repo/init.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,17 @@ void test_repo_init__sets_logAllRefUpdates_according_to_type_of_repository(void)
320320
assert_config_entry_on_init_bytype("core.logallrefupdates", true, false);
321321
}
322322

323+
void test_repo_init__empty_template_path(void)
324+
{
325+
git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;
326+
opts.template_path = "";
327+
328+
cl_git_pass(git_futils_mkdir("foo", 0755, 0));
329+
cl_git_pass(git_repository_init_ext(&_repo, "foo", &opts));
330+
331+
cleanup_repository("foo");
332+
}
333+
323334
void test_repo_init__extended_0(void)
324335
{
325336
git_repository_init_options opts = GIT_REPOSITORY_INIT_OPTIONS_INIT;

0 commit comments

Comments
 (0)