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

[PATCH 03/10] lazily load core.sharedrepository

From
Jeff King <peff@peff.net>
Date
Mar 1, 2016, 14:39 UTC
Message-ID
<20160301143954.GC12887@sigill.intra.peff.net>
In-Reply-To
<20160301143546.GA30806@sigill.intra.peff.net>

The "shared_repository" config is loaded as part of check_repository_format_version, but it's not quite like the other values we check there. Something like core.repositoryformatversion only makes sense in per-repo config, but core.sharedrepository can be set in a per-user config (e.g., to make all "git init" invocations shared by default).

So it would make more sense as part of git_default_config. Commit 457f06d (Introduce core.sharedrepository, 2005-12-22) says:

  [...]the config variable is set in the function which
  checks the repository format. If this were done in
  git_default_config instead, a lot of programs would need
  to be modified to call git_config(git_default_config)
  first.

This is still the case today, but we have one extra trick up our sleeve. Now that we have the git_configset infrastructure, it's not so expensive for us to ask for a single value. So we can simply lazy-load it on demand.

This should be OK to do in general. There are some problems with loading config before setup_git_directory() is called, but we shouldn't be accessing the value before then (if we were, then it would already be broken, as the variable would not have been set by check_repository_format_version!). The trickiest caller is git-init, but it handles the values manually itself.

Signed-off-by: Jeff King <peff@peff.net>
---
Of the whole series, this is the one I most fear causing problems. It
passes the test suite, but that isn't to say there isn't a weird corner
case lurking.
 environment.c | 9 +++++++++
 setup.c       | 2 --
 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/environment.c b/environment.c
index b42e238..8b8c8e8 100644
--- a/environment.c
+++ b/environment.c
@@ -326,13 +326,22 @@ const char *get_commit_output_encoding(void)
 }
 
 static int the_shared_repository = PERM_UMASK;
+static int need_shared_repository_from_config = 1;
 
 void set_shared_repository(int value)
 {
 	the_shared_repository = value;
+	need_shared_repository_from_config = 0;
 }
 
 int get_shared_repository(void)
 {
+	if (need_shared_repository_from_config) {
+		const char *var = "core.sharedrepository";
+		const char *value;
+		if (!git_config_get_value(var, &value))
+			the_shared_repository = git_config_perm(var, value);
+		need_shared_repository_from_config = 0;
+	}
 	return the_shared_repository;
 }
diff --git a/setup.c b/setup.c
index ac777c5..a02932b 100644
--- a/setup.c
+++ b/setup.c
@@ -376,8 +376,6 @@ static int check_repo_format(const char *var, const char *value, void *cb)
 
 	if (strcmp(var, "core.repositoryformatversion") == 0)
 		repository_format_version = git_config_int(var, value);
-	else if (strcmp(var, "core.sharedrepository") == 0)
-		set_shared_repository(git_config_perm(var, value));
 	else if (skip_prefix(var, "extensions.", &ext)) {
 		/*
 		 * record any known extensions here; otherwise,
-- 
2.8.0.rc0.278.gfeb5644
Previous: Jeff KingNext: Duy Nguyen
Message 4 of 22 in “cleaning up check_repository_format_gently”
  1. 0/10 cleaning up check_repository_format_gentlyJeff King, Mar 1, 2016
  2. 01/10 setup: document check_repository_format()Jeff King, Mar 1, 2016
  3. 02/10 wrap shared_repository global in get/set accessorsJeff King, Mar 1, 2016
  4. 03/10 lazily load core.sharedrepositoryJeff King, Mar 1, 2016
  5. Duy NguyenMar 3, 2016
  6. Jeff KingMar 3, 2016
  7. 04/10 check_repository_format_gently: stop using git_config_earlyJeff King, Mar 1, 2016
  8. Duy NguyenMar 3, 2016
  9. Jeff KingMar 3, 2016
  10. 05/10 config: drop git_config_earlyJeff King, Mar 1, 2016
  11. 06/10 setup: refactor repo format reading and verificationJeff King, Mar 1, 2016
  12. David TurnerMar 1, 2016
  13. Jeff KingMar 2, 2016
  14. Duy NguyenMar 3, 2016
  15. Jeff KingMar 3, 2016
  16. 07/10 init: use setup.c's repo version verificationJeff King, Mar 1, 2016
  17. 08/10 setup: unify repository version callbacksJeff King, Mar 1, 2016
  18. 09/10 setup: drop repository_format_version globalJeff King, Mar 1, 2016
  19. 10/10 setup: drop GIT_REPO_VERSION constantsJeff King, Mar 1, 2016
  20. David TurnerMar 2, 2016
  21. Jeff KingMar 2, 2016
  22. David TurnerMar 2, 2016

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.