git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 01/24] init-db: remove unnecessary global variable & document existing bug

From
Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Date
May 7, 2023, 03:45 UTC
Message-ID
<12a251f77f679123d01892109694f8ee19b96252.1683431151.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.1525.git.1683431149.gitgitgadget@gmail.com>
From: Elijah Newren <newren@gmail.com>

This commit was prompted by a desire to move the functions which builtin/init-db.c and builtin/clone.c share out of the former file and into setup.c. One issue that made it difficult was the init_is_bare_repository global variable.

init_is_bare_repository is actually not very useful. It merely stores the return value from is_bare_repository() and only for the duration of a few additional function calls before its value is checked, and none of those functions do anything that could change is_bare_repository()'s return value. So, we can simply dispense with the global by replacing it with is_bare_repository().

However, the intervening code does talk about reading config from the config file in the specified `--templates` directory, so touching this code does lead to the question of whether core.bare could be set in such a config file and thus whether the code is doing the right thing. Long story short is that the templates directory might have a config file with core.bare set, but it has always been unconditionally ignored. While fixing that might be nice, it looks to be a can of worms, and cannot be fixed within this function anyway. Instead of opening that can of worms, document the problem with a TODO comment and a couple test_expect_failure testcases.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/init-db.c        | 20 ++++++++++++++++----
 t/t1301-shared-repo.sh   | 22 ++++++++++++++++++++++
 t/t5606-clone-options.sh | 10 ++++++++++
 3 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/builtin/init-db.c b/builtin/init-db.c
index aef40361052..18733ef05aa 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -31,7 +31,6 @@
 
 #define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH"
 
-static int init_is_bare_repository = 0;
 static int init_shared_repository = -1;
 
 static void copy_templates_1(struct strbuf *path, struct strbuf *template_path,
@@ -231,9 +230,24 @@ static int create_default_files(const char *template_path,
 	 * We must make sure command-line options continue to override any
 	 * values we might have just re-read from the config.
 	 */
-	is_bare_repository_cfg = init_is_bare_repository || !work_tree;
 	if (init_shared_repository != -1)
 		set_shared_repository(init_shared_repository);
+	/*
+	 * TODO: heed core.bare from config file in templates if no
+	 *       command-line override given
+	 *
+	 * Unfortunately, this location in the code is far too late to
+	 * allow this to happen; both builtin/init.db and
+	 * builtin/clone.c setup the new repository and call
+	 * set_git_work_tree() before this point.  (Note that both do
+	 * that repository setup before calling init_db(), which in
+	 * turn calls create_default_files().)  Fixing it would
+	 * require too much refactoring, and no one seems to have
+	 * wanted this behavior in 15+ years, so we'll continue
+	 * ignoring the config for now and just override
+	 * is_bare_repository_cfg unconditionally.
+	 */
+	is_bare_repository_cfg = is_bare_repository() || !work_tree;
 
 	/*
 	 * We would have created the above under user's umask -- under
@@ -422,8 +436,6 @@ int init_db(const char *git_dir, const char *real_git_dir,
 
 	safe_create_dir(git_dir, 0);
 
-	init_is_bare_repository = is_bare_repository();
-
 	/* Check to see if the repository version is right.
 	 * Note that a newly created repository does not have
 	 * config file, so this will not fail.  What we are catching
diff --git a/t/t1301-shared-repo.sh b/t/t1301-shared-repo.sh
index 1b6437ec079..c02fd64793b 100755
--- a/t/t1301-shared-repo.sh
+++ b/t/t1301-shared-repo.sh
@@ -52,6 +52,28 @@ test_expect_success 'shared=all' '
 	test 2 = $(git config core.sharedrepository)
 '
 
+test_expect_failure 'template can set core.bare' '
+	test_when_finished "rm -rf subdir" &&
+	test_when_finished "rm -rf templates" &&
+	test_config core.bare true &&
+	umask 0022 &&
+	mkdir -p templates/ &&
+	cp .git/config templates/config &&
+	git init --template=templates subdir &&
+	test_path_exists subdir/HEAD
+'
+
+test_expect_success 'template can set core.bare but overridden by command line' '
+	test_when_finished "rm -rf subdir" &&
+	test_when_finished "rm -rf templates" &&
+	test_config core.bare true &&
+	umask 0022 &&
+	mkdir -p templates/ &&
+	cp .git/config templates/config &&
+	git init --no-bare --template=templates subdir &&
+	test_path_exists subdir/.git/HEAD
+'
+
 test_expect_success POSIXPERM 'update-server-info honors core.sharedRepository' '
 	: > a1 &&
 	git add a1 &&
diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh
index 27f9f776389..5890319b97b 100755
--- a/t/t5606-clone-options.sh
+++ b/t/t5606-clone-options.sh
@@ -120,6 +120,16 @@ test_expect_success 'prefers -c config over --template config' '
 
 '
 
+test_expect_failure 'prefers --template config even for core.bare' '
+
+	template="$TRASH_DIRECTORY/template-with-bare-config" &&
+	mkdir "$template" &&
+	git config --file "$template/config" core.bare true &&
+	git clone "--template=$template" parent clone-bare-config &&
+	test "$(git -C clone-bare-config config --local core.bare)" = "true" &&
+	test_path_is_file clone-bare-config/HEAD
+'
+
 test_expect_success 'prefers config "clone.defaultRemoteName" over default' '
 
 	test_config_global clone.defaultRemoteName from_config &&
-- 
gitgitgadget
Previous: Elijah Newren via GitGitGadgetNext: Calvin Wan
Message 2 of 115 in “Header cleanups (final splitting of cache.h, and some splitting of other headers)”
  1. 00/24 Header cleanups (final splitting of cache.h, and some splitting of other headers)Elijah Newren via GitGitGadget, May 7, 2023
  2. 01/24 init-db: remove unnecessary global variable & document existing bugElijah Newren via GitGitGadget, May 7, 2023
  3. Calvin WanMay 11, 2023
  4. Elijah NewrenMay 12, 2023
  5. Glen ChooMay 11, 2023
  6. Elijah NewrenMay 12, 2023
  7. Glen ChooMay 12, 2023
  8. 02/24 init-db, clone: change unnecessary global into passed parameterElijah Newren via GitGitGadget, May 7, 2023
  9. 05/24 add: modify add_files_to_cache() to avoid globalsElijah Newren via GitGitGadget, May 7, 2023
  10. 04/24 read-cache: move shared commit and ls-files codeElijah Newren via GitGitGadget, May 7, 2023
  11. 08/24 run-command.h: move declarations for run-command.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  12. 06/24 read-cache: move shared add/checkout/commit codeElijah Newren via GitGitGadget, May 7, 2023
  13. 03/24 setup: adopt shared init-db & clone codeElijah Newren via GitGitGadget, May 7, 2023
  14. 07/24 statinfo: move stat_{data,validity} functions from cache/read-cacheElijah Newren via GitGitGadget, May 7, 2023
  15. 09/24 name-hash.h: move declarations for name-hash.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  16. 10/24 sparse-index.h: move declarations for sparse-index.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  17. 11/24 preload-index.h: move declarations for preload-index.c from elsewhereElijah Newren via GitGitGadget, May 7, 2023
  18. 12/24 diff.h: move declaration for global in diff.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  19. 13/24 merge.h: move declarations for merge.c from cache.hElijah Newren via GitGitGadget, May 7, 2023
  20. 14/24 repository.h: move declaration of the_index from cache.hElijah Newren via GitGitGadget, May 7, 2023
  21. 19/24 diff.h: remove unnecessary include of oidset.hElijah Newren via GitGitGadget, May 7, 2023
  22. 17/24 log-tree: replace include of revision.h with simple forward declarationElijah Newren via GitGitGadget, May 7, 2023
  23. 20/24 list-objects-filter-options.h: remove unneccessary includeElijah Newren via GitGitGadget, May 7, 2023
  24. 15/24 read-cache*.h: move declarations for read-cache.c functions from cache.hElijah Newren via GitGitGadget, May 7, 2023
  25. 18/24 repository: remove unnecessary include of path.hElijah Newren via GitGitGadget, May 7, 2023
  26. 21/24 builtin.h: remove unneccessary includesElijah Newren via GitGitGadget, May 7, 2023
  27. 16/24 cache.h: remove this no-longer-used headerElijah Newren via GitGitGadget, May 7, 2023
  28. 22/24 git-compat-util.h: remove unneccessary include of wildmatch.hElijah Newren via GitGitGadget, May 7, 2023
  29. 24/24 fsmonitor-ll.h: split this header out of fsmonitor.hElijah Newren via GitGitGadget, May 7, 2023
  30. 23/24 hash-ll, hashmap: move oidhash() to hash-llElijah Newren via GitGitGadget, May 7, 2023
  31. Calvin WanMay 11, 2023
  32. Jeff KingMay 11, 2023
  33. Felipe ContrerasMay 11, 2023
  34. Elijah NewrenMay 12, 2023
  35. Jeff KingMay 12, 2023
  36. Junio C HamanoMay 8, 2023
  37. Elijah NewrenMay 9, 2023
  38. Junio C HamanoMay 9, 2023
  39. Junio C HamanoMay 8, 2023
  40. Calvin WanMay 11, 2023
  41. Elijah NewrenMay 12, 2023
  42. 00/27 Header cleanups (final splitting of cache.h, and some splitting of other headers)Elijah Newren via GitGitGadget, May 12, 2023
  43. 03/27 init-db, clone: change unnecessary global into passed parameterElijah Newren via GitGitGadget, May 12, 2023
  44. Jonathan TanMay 12, 2023
  45. Elijah NewrenMay 16, 2023
  46. 02/27 init-db: remove unnecessary global variableElijah Newren via GitGitGadget, May 12, 2023
  47. Glen ChooMay 12, 2023
  48. 01/27 init-db: document existing bug with core.bare in template configElijah Newren via GitGitGadget, May 12, 2023
  49. Jonathan TanMay 12, 2023
  50. Elijah NewrenMay 16, 2023
  51. 06/27 add: modify add_files_to_cache() to avoid globalsElijah Newren via GitGitGadget, May 12, 2023
  52. Jonathan TanMay 15, 2023
  53. 05/27 read-cache: move shared commit and ls-files codeElijah Newren via GitGitGadget, May 12, 2023
  54. Jonathan TanMay 12, 2023
  55. 09/27 run-command.h: move declarations for run-command.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  56. 04/27 setup: adopt shared init-db & clone codeElijah Newren via GitGitGadget, May 12, 2023
  57. 07/27 read-cache: move shared add/checkout/commit codeElijah Newren via GitGitGadget, May 12, 2023
  58. 08/27 statinfo: move stat_{data,validity} functions from cache/read-cacheElijah Newren via GitGitGadget, May 12, 2023
  59. 11/27 sparse-index.h: move declarations for sparse-index.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  60. 10/27 name-hash.h: move declarations for name-hash.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  61. 13/27 diff.h: move declaration for global in diff.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  62. 12/27 preload-index.h: move declarations for preload-index.c from elsewhereElijah Newren via GitGitGadget, May 12, 2023
  63. 15/27 repository.h: move declaration of the_index from cache.hElijah Newren via GitGitGadget, May 12, 2023
  64. Jonathan TanMay 15, 2023
  65. 14/27 merge.h: move declarations for merge.c from cache.hElijah Newren via GitGitGadget, May 12, 2023
  66. 18/27 log-tree: replace include of revision.h with simple forward declarationElijah Newren via GitGitGadget, May 12, 2023
  67. 19/27 repository: remove unnecessary include of path.hElijah Newren via GitGitGadget, May 12, 2023
  68. 21/27 list-objects-filter-options.h: remove unneccessary includeElijah Newren via GitGitGadget, May 12, 2023
  69. 20/27 diff.h: remove unnecessary include of oidset.hElijah Newren via GitGitGadget, May 12, 2023
  70. 16/27 read-cache*.h: move declarations for read-cache.c functions from cache.hElijah Newren via GitGitGadget, May 12, 2023
  71. Jonathan TanMay 16, 2023
  72. 17/27 cache.h: remove this no-longer-used headerElijah Newren via GitGitGadget, May 12, 2023
  73. Jonathan TanMay 16, 2023
  74. Elijah NewrenMay 16, 2023
  75. 23/27 git-compat-util.h: remove unneccessary include of wildmatch.hElijah Newren via GitGitGadget, May 12, 2023
  76. 22/27 builtin.h: remove unneccessary includesElijah Newren via GitGitGadget, May 12, 2023
  77. 25/27 khash: name the structs that khash declaresElijah Newren via GitGitGadget, May 12, 2023
  78. 24/27 merge-ll: rename from ll-mergeElijah Newren via GitGitGadget, May 12, 2023
  79. 27/27 fsmonitor-ll.h: split this header out of fsmonitor.hElijah Newren via GitGitGadget, May 12, 2023
  80. Jonathan TanMay 16, 2023
  81. Elijah NewrenMay 16, 2023
  82. 26/27 hash-ll, hashmap: move oidhash() to hash-llElijah Newren via GitGitGadget, May 12, 2023
  83. Jonathan TanMay 16, 2023
  84. Elijah NewrenMay 16, 2023
  85. 00/28 Header cleanups (final splitting of cache.h, and some splitting of other headers)Elijah Newren via GitGitGadget, May 16, 2023
  86. 02/28 init-db: remove unnecessary global variableElijah Newren via GitGitGadget, May 16, 2023
  87. 01/28 init-db: document existing bug with core.bare in template configElijah Newren via GitGitGadget, May 16, 2023
  88. 03/28 init-db, clone: change unnecessary global into passed parameterElijah Newren via GitGitGadget, May 16, 2023
  89. 05/28 read-cache: move shared commit and ls-files codeElijah Newren via GitGitGadget, May 16, 2023
  90. 06/28 add: modify add_files_to_cache() to avoid globalsElijah Newren via GitGitGadget, May 16, 2023
  91. 07/28 read-cache: move shared add/checkout/commit codeElijah Newren via GitGitGadget, May 16, 2023
  92. 04/28 setup: adopt shared init-db & clone codeElijah Newren via GitGitGadget, May 16, 2023
  93. 09/28 run-command.h: move declarations for run-command.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  94. 10/28 name-hash.h: move declarations for name-hash.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  95. 08/28 statinfo: move stat_{data,validity} functions from cache/read-cacheElijah Newren via GitGitGadget, May 16, 2023
  96. 11/28 sparse-index.h: move declarations for sparse-index.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  97. 14/28 merge.h: move declarations for merge.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  98. 12/28 preload-index.h: move declarations for preload-index.c from elsewhereElijah Newren via GitGitGadget, May 16, 2023
  99. 15/28 repository.h: move declaration of the_index from cache.hElijah Newren via GitGitGadget, May 16, 2023
  100. 18/28 log-tree: replace include of revision.h with simple forward declarationElijah Newren via GitGitGadget, May 16, 2023
  101. 13/28 diff.h: move declaration for global in diff.c from cache.hElijah Newren via GitGitGadget, May 16, 2023
  102. 19/28 repository: remove unnecessary include of path.hElijah Newren via GitGitGadget, May 16, 2023
  103. 16/28 read-cache*.h: move declarations for read-cache.c functions from cache.hElijah Newren via GitGitGadget, May 16, 2023
  104. 17/28 cache.h: remove this no-longer-used headerElijah Newren via GitGitGadget, May 16, 2023
  105. 22/28 builtin.h: remove unneccessary includesElijah Newren via GitGitGadget, May 16, 2023
  106. 25/28 khash: name the structs that khash declaresElijah Newren via GitGitGadget, May 16, 2023
  107. 23/28 git-compat-util.h: remove unneccessary include of wildmatch.hElijah Newren via GitGitGadget, May 16, 2023
  108. 24/28 merge-ll: rename from ll-mergeElijah Newren via GitGitGadget, May 16, 2023
  109. 27/28 hash-ll, hashmap: move oidhash() to hash-llElijah Newren via GitGitGadget, May 16, 2023
  110. 28/28 fsmonitor-ll.h: split this header out of fsmonitor.hElijah Newren via GitGitGadget, May 16, 2023
  111. 26/28 object-store-ll.h: split this header out of object-store.hElijah Newren via GitGitGadget, May 16, 2023
  112. 21/28 list-objects-filter-options.h: remove unneccessary includeElijah Newren via GitGitGadget, May 16, 2023
  113. 20/28 diff.h: remove unnecessary include of oidset.hElijah Newren via GitGitGadget, May 16, 2023
  114. Calvin WanMay 23, 2023
  115. Elijah NewrenMay 24, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.