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

[PATCH v4 14/20] config: read config from a repository object

From
BWBrandon Williams <bmwill@google.com>
Date
Jun 22, 2017, 18:43 UTC
Message-ID
<20170622184348.56497-15-bmwill@google.com>
In-Reply-To
<20170622184348.56497-1-bmwill@google.com>

Teach the config machinery to read config information from a repository object. This involves storing a 'struct config_set' inside the repository object and adding a number of functions (repo_config*) to be able to query a repository's config.

The current config API enables lazy-loading of the config. This means that when 'git_config_get_int()' is called, if the_config_set hasn't been populated yet, then it will be populated and properly initialized by reading the necessary config files (system wide .gitconfig, user's home .gitconfig, and the repository's config). To maintain this paradigm, the new API to read from a repository object's config will also perform this lazy-initialization.

Since both APIs (git_config_get* and repo_config_get*) have the same semantics we can migrate the default config to be stored within 'the_repository' and just have the 'git_config_get*' family of functions redirect to the 'repo_config_get*' functions.

Signed-off-by: Brandon Williams <bmwill@google.com>
---
 config.c     | 216 +++++++++++++++++++++++++++++++++++++++--------------------
 config.h     |  24 +++++++
 repository.c |   7 ++
 repository.h |  10 +++
 4 files changed, 183 insertions(+), 74 deletions(-)
diff --git a/config.c b/config.c
index 6f0f8b30f..be1c640a4 100644
--- a/config.c
+++ b/config.c
@@ -7,6 +7,7 @@
  */
 #include "cache.h"
 #include "config.h"
+#include "repository.h"
 #include "lockfile.h"
 #include "exec_cmd.h"
 #include "strbuf.h"
@@ -72,13 +73,6 @@ static int core_compression_seen;
 static int pack_compression_seen;
 static int zlib_compression_seen;
 
-/*
- * Default config_set that contains key-value pairs from the usual set of config
- * config files (i.e repo specific .git/config, user wide ~/.gitconfig, XDG
- * config file and the global /etc/gitconfig)
- */
-static struct config_set the_config_set;
-
 static int config_file_fgetc(struct config_source *conf)
 {
 	return getc_unlocked(conf->u.file);
@@ -1605,31 +1599,6 @@ int config_with_options(config_fn_t fn, void *data,
 	return do_git_config_sequence(opts, fn, data);
 }
 
-static void git_config_raw(config_fn_t fn, void *data)
-{
-	struct config_options opts = {0};
-
-	opts.respect_includes = 1;
-	if (have_git_dir()) {
-		opts.commondir = get_git_common_dir();
-		opts.git_dir = get_git_dir();
-	}
-
-	if (config_with_options(fn, data, NULL, &opts) < 0)
-		/*
-		 * config_with_options() normally returns only
-		 * zero, as most errors are fatal, and
-		 * non-fatal potential errors are guarded by "if"
-		 * statements that are entered only when no error is
-		 * possible.
-		 *
-		 * If we ever encounter a non-fatal error, it means
-		 * something went really wrong and we should stop
-		 * immediately.
-		 */
-		die(_("unknown error occurred while reading the configuration files"));
-}
-
 static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
 {
 	int i, value_index;
@@ -1683,14 +1652,6 @@ void read_early_config(config_fn_t cb, void *data)
 	strbuf_release(&gitdir);
 }
 
-static void git_config_check_init(void);
-
-void git_config(config_fn_t fn, void *data)
-{
-	git_config_check_init();
-	configset_iter(&the_config_set, fn, data);
-}
-
 static struct config_set_element *configset_find_element(struct config_set *cs, const char *key)
 {
 	struct config_set_element k;
@@ -1900,87 +1861,194 @@ int git_configset_get_pathname(struct config_set *cs, const char *key, const cha
 		return 1;
 }
 
-static void git_config_check_init(void)
+/* Functions use to read configuration from a repository */
+static void repo_read_config(struct repository *repo)
 {
-	if (the_config_set.hash_initialized)
+	struct config_options opts;
+
+	opts.respect_includes = 1;
+	opts.commondir = repo->commondir;
+	opts.git_dir = repo->gitdir;
+
+	if (!repo->config)
+		repo->config = xcalloc(1, sizeof(struct config_set));
+	else
+		git_configset_clear(repo->config);
+
+	git_configset_init(repo->config);
+
+	if (config_with_options(config_set_callback, repo->config, NULL, &opts) < 0)
+		/*
+		 * config_with_options() normally returns only
+		 * zero, as most errors are fatal, and
+		 * non-fatal potential errors are guarded by "if"
+		 * statements that are entered only when no error is
+		 * possible.
+		 *
+		 * If we ever encounter a non-fatal error, it means
+		 * something went really wrong and we should stop
+		 * immediately.
+		 */
+		die(_("unknown error occurred while reading the configuration files"));
+}
+
+static void git_config_check_init(struct repository *repo)
+{
+	if (repo->config && repo->config->hash_initialized)
 		return;
-	git_configset_init(&the_config_set);
-	git_config_raw(config_set_callback, &the_config_set);
+	repo_read_config(repo);
 }
 
-void git_config_clear(void)
+static void repo_config_clear(struct repository *repo)
 {
-	if (!the_config_set.hash_initialized)
+	if (!repo->config || !repo->config->hash_initialized)
 		return;
-	git_configset_clear(&the_config_set);
+	git_configset_clear(repo->config);
 }
 
-int git_config_get_value(const char *key, const char **value)
+void repo_config(struct repository *repo, config_fn_t fn, void *data)
 {
-	git_config_check_init();
-	return git_configset_get_value(&the_config_set, key, value);
+	git_config_check_init(repo);
+	configset_iter(repo->config, fn, data);
 }
 
-const struct string_list *git_config_get_value_multi(const char *key)
+int repo_config_get_value(struct repository *repo,
+			  const char *key, const char **value)
 {
-	git_config_check_init();
-	return git_configset_get_value_multi(&the_config_set, key);
+	git_config_check_init(repo);
+	return git_configset_get_value(repo->config, key, value);
 }
 
-int git_config_get_string_const(const char *key, const char **dest)
+const struct string_list *repo_config_get_value_multi(struct repository *repo,
+						      const char *key)
+{
+	git_config_check_init(repo);
+	return git_configset_get_value_multi(repo->config, key);
+}
+
+int repo_config_get_string_const(struct repository *repo,
+				 const char *key, const char **dest)
+{
+	int ret;
+	git_config_check_init(repo);
+	ret = git_configset_get_string_const(repo->config, key, dest);
+	if (ret < 0)
+		git_die_config(key, NULL);
+	return ret;
+}
+
+int repo_config_get_string(struct repository *repo,
+			   const char *key, char **dest)
+{
+	git_config_check_init(repo);
+	return repo_config_get_string_const(repo, key, (const char **)dest);
+}
+
+int repo_config_get_int(struct repository *repo,
+			const char *key, int *dest)
+{
+	git_config_check_init(repo);
+	return git_configset_get_int(repo->config, key, dest);
+}
+
+int repo_config_get_ulong(struct repository *repo,
+			  const char *key, unsigned long *dest)
+{
+	git_config_check_init(repo);
+	return git_configset_get_ulong(repo->config, key, dest);
+}
+
+int repo_config_get_bool(struct repository *repo,
+			 const char *key, int *dest)
+{
+	git_config_check_init(repo);
+	return git_configset_get_bool(repo->config, key, dest);
+}
+
+int repo_config_get_bool_or_int(struct repository *repo,
+				const char *key, int *is_bool, int *dest)
+{
+	git_config_check_init(repo);
+	return git_configset_get_bool_or_int(repo->config, key, is_bool, dest);
+}
+
+int repo_config_get_maybe_bool(struct repository *repo,
+			       const char *key, int *dest)
+{
+	git_config_check_init(repo);
+	return git_configset_get_maybe_bool(repo->config, key, dest);
+}
+
+int repo_config_get_pathname(struct repository *repo,
+			     const char *key, const char **dest)
 {
 	int ret;
-	git_config_check_init();
-	ret = git_configset_get_string_const(&the_config_set, key, dest);
+	git_config_check_init(repo);
+	ret = git_configset_get_pathname(repo->config, key, dest);
 	if (ret < 0)
 		git_die_config(key, NULL);
 	return ret;
 }
 
+/* Functions used historically to read configuration from 'the_repository' */
+void git_config(config_fn_t fn, void *data)
+{
+	repo_config(the_repository, fn, data);
+}
+
+void git_config_clear(void)
+{
+	repo_config_clear(the_repository);
+}
+
+int git_config_get_value(const char *key, const char **value)
+{
+	return repo_config_get_value(the_repository, key, value);
+}
+
+const struct string_list *git_config_get_value_multi(const char *key)
+{
+	return repo_config_get_value_multi(the_repository, key);
+}
+
+int git_config_get_string_const(const char *key, const char **dest)
+{
+	return repo_config_get_string_const(the_repository, key, dest);
+}
+
 int git_config_get_string(const char *key, char **dest)
 {
-	git_config_check_init();
-	return git_config_get_string_const(key, (const char **)dest);
+	return repo_config_get_string(the_repository, key, dest);
 }
 
 int git_config_get_int(const char *key, int *dest)
 {
-	git_config_check_init();
-	return git_configset_get_int(&the_config_set, key, dest);
+	return repo_config_get_int(the_repository, key, dest);
 }
 
 int git_config_get_ulong(const char *key, unsigned long *dest)
 {
-	git_config_check_init();
-	return git_configset_get_ulong(&the_config_set, key, dest);
+	return repo_config_get_ulong(the_repository, key, dest);
 }
 
 int git_config_get_bool(const char *key, int *dest)
 {
-	git_config_check_init();
-	return git_configset_get_bool(&the_config_set, key, dest);
+	return repo_config_get_bool(the_repository, key, dest);
 }
 
 int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest)
 {
-	git_config_check_init();
-	return git_configset_get_bool_or_int(&the_config_set, key, is_bool, dest);
+	return repo_config_get_bool_or_int(the_repository, key, is_bool, dest);
 }
 
 int git_config_get_maybe_bool(const char *key, int *dest)
 {
-	git_config_check_init();
-	return git_configset_get_maybe_bool(&the_config_set, key, dest);
+	return repo_config_get_maybe_bool(the_repository, key, dest);
 }
 
 int git_config_get_pathname(const char *key, const char **dest)
 {
-	int ret;
-	git_config_check_init();
-	ret = git_configset_get_pathname(&the_config_set, key, dest);
-	if (ret < 0)
-		git_die_config(key, NULL);
-	return ret;
+	return repo_config_get_pathname(the_repository, key, dest);
 }
 
 int git_config_get_expiry(const char *key, const char **output)
diff --git a/config.h b/config.h
index 9e038cce2..0352da117 100644
--- a/config.h
+++ b/config.h
@@ -163,6 +163,30 @@ extern int git_configset_get_bool_or_int(struct config_set *cs, const char *key,
 extern int git_configset_get_maybe_bool(struct config_set *cs, const char *key, int *dest);
 extern int git_configset_get_pathname(struct config_set *cs, const char *key, const char **dest);
 
+/* Functions for reading a repository's config */
+struct repository;
+extern void repo_config(struct repository *repo, config_fn_t fn, void *data);
+extern int repo_config_get_value(struct repository *repo,
+				 const char *key, const char **value);
+extern const struct string_list *repo_config_get_value_multi(struct repository *repo,
+							     const char *key);
+extern int repo_config_get_string_const(struct repository *repo,
+					const char *key, const char **dest);
+extern int repo_config_get_string(struct repository *repo,
+				  const char *key, char **dest);
+extern int repo_config_get_int(struct repository *repo,
+			       const char *key, int *dest);
+extern int repo_config_get_ulong(struct repository *repo,
+				 const char *key, unsigned long *dest);
+extern int repo_config_get_bool(struct repository *repo,
+				const char *key, int *dest);
+extern int repo_config_get_bool_or_int(struct repository *repo,
+				       const char *key, int *is_bool, int *dest);
+extern int repo_config_get_maybe_bool(struct repository *repo,
+				      const char *key, int *dest);
+extern int repo_config_get_pathname(struct repository *repo,
+				    const char *key, const char **dest);
+
 extern int git_config_get_value(const char *key, const char **value);
 extern const struct string_list *git_config_get_value_multi(const char *key);
 extern void git_config_clear(void);
diff --git a/repository.c b/repository.c
index cf440405a..686a964ad 100644
--- a/repository.c
+++ b/repository.c
@@ -1,5 +1,6 @@
 #include "cache.h"
 #include "repository.h"
+#include "config.h"
 
 /* The main repository */
 static struct repository the_repo;
@@ -156,4 +157,10 @@ void repo_clear(struct repository *repo)
 	repo->index_file = NULL;
 	free(repo->worktree);
 	repo->worktree = NULL;
+
+	if (repo->config) {
+		git_configset_clear(repo->config);
+		free(repo->config);
+		repo->config = NULL;
+	}
 }
diff --git a/repository.h b/repository.h
index 0a1db9633..8ae5e8653 100644
--- a/repository.h
+++ b/repository.h
@@ -1,6 +1,8 @@
 #ifndef REPOSITORY_H
 #define REPOSITORY_H
 
+struct config_set;
+
 struct repository {
 	/* Environment */
 	/*
@@ -39,6 +41,14 @@ struct repository {
 	 */
 	char *worktree;
 
+	/* Subsystems */
+	/*
+	 * Repository's config which contains key-value pairs from the usual
+	 * set of config files (i.e. repo specific .git/config, user wide
+	 * ~/.gitconfig, XDG config file and the global /etc/gitconfig)
+	 */
+	struct config_set *config;
+
 	/* Configurations */
 	/*
 	 * Bit used during initialization to indicate if repository state (like
-- 
2.13.1.704.gde00cce3c-goog
Previous: Brandon WilliamsNext: Brandon Williams
Message 184 of 196 in “repository object”
  1. 00/31 repository objectBrandon Williams, May 31, 2017
  2. 01/31 config: create config.hBrandon Williams, May 31, 2017
  3. 02/31 config: don't include config.h by defaultBrandon Williams, May 31, 2017
  4. 05/31 environment: remove namespace_len variableBrandon Williams, May 31, 2017
  5. Stefan BellerJun 1, 2017
  6. Brandon WilliamsJun 1, 2017
  7. 06/31 repo: introduce the repository objectBrandon Williams, May 31, 2017
  8. Stefan BellerJun 1, 2017
  9. Brandon WilliamsJun 5, 2017
  10. Stefan BellerJun 5, 2017
  11. 03/31 config: don't implicitly use gitdirBrandon Williams, May 31, 2017
  12. Johannes SchindelinJun 8, 2017
  13. Brandon WilliamsJun 8, 2017
  14. Johannes SchindelinJun 8, 2017
  15. Brandon WilliamsJun 8, 2017
  16. 08/31 environment: store worktree in the_repositoryBrandon Williams, May 31, 2017
  17. 13/31 repo: add repo_read_gitmodulesBrandon Williams, May 31, 2017
  18. 11/31 repo: add index_state to struct repoBrandon Williams, May 31, 2017
  19. 07/31 environment: place key repository state in the_repositoryBrandon Williams, May 31, 2017
  20. 12/31 submodule-config: store the_submodule_cache in the_repositoryBrandon Williams, May 31, 2017
  21. 14/31 submodule: convert is_submodule_initialized to work on a repositoryBrandon Williams, May 31, 2017
  22. 16/31 convert: convert crlf_to_git to take an indexBrandon Williams, May 31, 2017
  23. 15/31 convert: convert get_cached_convert_stats_ascii to take an indexBrandon Williams, May 31, 2017
  24. 19/31 convert: convert renormalize_buffer to take an indexBrandon Williams, May 31, 2017
  25. 22/31 ls-files: convert write_eolinfo to take an indexBrandon Williams, May 31, 2017
  26. 21/31 ls-files: convert overlay_tree_on_cache to take an indexBrandon Williams, May 31, 2017
  27. 20/31 tree: convert read_tree to take an index parameterBrandon Williams, May 31, 2017
  28. 18/31 convert: convert convert_to_git to take an indexBrandon Williams, May 31, 2017
  29. 28/31 ls-files: convert show_files to take an indexBrandon Williams, May 31, 2017
  30. 25/31 ls-files: convert show_ru_info to take an indexBrandon Williams, May 31, 2017
  31. 24/31 ls-files: convert show_other_files to take an indexBrandon Williams, May 31, 2017
  32. 30/31 ls-files: factor out tag calculationBrandon Williams, May 31, 2017
  33. 29/31 ls-files: factor out debug info into a functionBrandon Williams, May 31, 2017
  34. 31/31 ls-files: use repository objectBrandon Williams, May 31, 2017
  35. Stefan BellerJun 1, 2017
  36. Brandon WilliamsJun 5, 2017
  37. 23/31 ls-files: convert show_killed_files to take an indexBrandon Williams, May 31, 2017
  38. 27/31 ls-files: convert prune_cache to take an indexBrandon Williams, May 31, 2017
  39. 26/31 ls-files: convert ce_excluded to take an indexBrandon Williams, May 31, 2017
  40. 17/31 convert: convert convert_to_git_filter_fd to take an indexBrandon Williams, May 31, 2017
  41. 10/31 config: migrate the_configset to the_repositoryBrandon Williams, May 31, 2017
  42. 04/31 setup: don't perform lazy initialization of repository stateBrandon Williams, May 31, 2017
  43. Stefan BellerJun 1, 2017
  44. Jeff KingJun 2, 2017
  45. Brandon WilliamsJun 5, 2017
  46. Jeff KingJun 5, 2017
  47. Brandon WilliamsJun 5, 2017
  48. 09/31 setup: add comment indicating a hackBrandon Williams, May 31, 2017
  49. Stefan BellerMay 31, 2017
  50. Brandon WilliamsMay 31, 2017
  51. Brandon WilliamsJun 1, 2017
  52. Stefan BellerJun 1, 2017
  53. Jacob KellerJun 1, 2017
  54. 00/32 repository objectBrandon Williams, Jun 8, 2017
  55. 01/32 config: create config.hBrandon Williams, Jun 8, 2017
  56. 02/32 config: remove git_config_iterBrandon Williams, Jun 8, 2017
  57. 04/32 config: don't implicitly use gitdirBrandon Williams, Jun 8, 2017
  58. Brandon WilliamsJun 12, 2017
  59. 03/32 config: don't include config.h by defaultBrandon Williams, Jun 8, 2017
  60. 05/32 setup: don't perform lazy initialization of repository stateBrandon Williams, Jun 8, 2017
  61. 07/32 repository: introduce the repository objectBrandon Williams, Jun 8, 2017
  62. 0/2 Add a freez() wrapperÆvar Arnfjörð Bjarmason, Jun 9, 2017
  63. 1/2 git-compat-util: add a freez() wrapper around free(x); x = NULLÆvar Arnfjörð Bjarmason, Jun 9, 2017
  64. Christian CouderJun 9, 2017
  65. 2/2 *.[ch] refactoring: make use of the freez() wrapperÆvar Arnfjörð Bjarmason, Jun 9, 2017
  66. Martin ÅgrenJun 9, 2017
  67. Ævar Arnfjörð BjarmasonJun 9, 2017
  68. Brandon WilliamsJun 9, 2017
  69. Brandon WilliamsJun 9, 2017
  70. 0/2 Add a FREEZ() wrapper macroÆvar Arnfjörð Bjarmason, Jun 9, 2017
  71. 1/2 git-compat-util: add a FREEZ() wrapper around free(ptr); ptr = NULLÆvar Arnfjörð Bjarmason, Jun 9, 2017
  72. Jonathan NiederJun 9, 2017
  73. Eric WongJun 9, 2017
  74. Junio C HamanoJun 10, 2017
  75. Eric WongJun 10, 2017
  76. Jeff KingJun 10, 2017
  77. Junio C HamanoJun 15, 2017
  78. Ævar Arnfjörð BjarmasonJun 15, 2017
  79. 0/2 Add a FREE_AND_NULL() wrapper macroÆvar Arnfjörð Bjarmason, Jun 15, 2017
  80. 1/2 git-compat-util: add a FREE_AND_NULL() wrapper around free(ptr); ptr = NULLÆvar Arnfjörð Bjarmason, Jun 15, 2017
  81. 2/2 *.[ch] refactoring: make use of the FREE_AND_NULL() macroÆvar Arnfjörð Bjarmason, Jun 15, 2017
  82. Junio C HamanoJun 15, 2017
  83. Andreas SchwabJun 10, 2017
  84. 2/2 *.[ch] refactoring: make use of the FREEZ() macroÆvar Arnfjörð Bjarmason, Jun 9, 2017
  85. 10/32 setup: add comment indicating a hackBrandon Williams, Jun 8, 2017
  86. 06/32 environment: remove namespace_len variableBrandon Williams, Jun 8, 2017
  87. 09/32 environment: store worktree in the_repositoryBrandon Williams, Jun 8, 2017
  88. 16/32 convert: convert get_cached_convert_stats_ascii to take an indexBrandon Williams, Jun 8, 2017
  89. 14/32 submodule: add repo_read_gitmodulesBrandon Williams, Jun 8, 2017
  90. 19/32 convert: convert convert_to_git to take an indexBrandon Williams, Jun 8, 2017
  91. 22/32 ls-files: convert overlay_tree_on_cache to take an indexBrandon Williams, Jun 8, 2017
  92. 23/32 ls-files: convert write_eolinfo to take an indexBrandon Williams, Jun 8, 2017
  93. 20/32 convert: convert renormalize_buffer to take an indexBrandon Williams, Jun 8, 2017
  94. 15/32 submodule: convert is_submodule_initialized to work on a repositoryBrandon Williams, Jun 8, 2017
  95. 25/32 ls-files: convert show_other_files to take an indexBrandon Williams, Jun 8, 2017
  96. 21/32 tree: convert read_tree to take an index parameterBrandon Williams, Jun 8, 2017
  97. 30/32 ls-files: factor out debug info into a functionBrandon Williams, Jun 8, 2017
  98. 27/32 ls-files: convert ce_excluded to take an indexBrandon Williams, Jun 8, 2017
  99. 32/32 ls-files: use repository objectBrandon Williams, Jun 8, 2017
  100. Brandon WilliamsJun 9, 2017
  101. Junio C HamanoJun 10, 2017
  102. Brandon WilliamsJun 12, 2017
  103. 29/32 ls-files: convert show_files to take an indexBrandon Williams, Jun 8, 2017
  104. 24/32 ls-files: convert show_killed_files to take an indexBrandon Williams, Jun 8, 2017
  105. 26/32 ls-files: convert show_ru_info to take an indexBrandon Williams, Jun 8, 2017
  106. 28/32 ls-files: convert prune_cache to take an indexBrandon Williams, Jun 8, 2017
  107. 17/32 convert: convert crlf_to_git to take an indexBrandon Williams, Jun 8, 2017
  108. 31/32 ls-files: factor out tag calculationBrandon Williams, Jun 8, 2017
  109. 18/32 convert: convert convert_to_git_filter_fd to take an indexBrandon Williams, Jun 8, 2017
  110. 13/32 submodule-config: store the_submodule_cache in the_repositoryBrandon Williams, Jun 8, 2017
  111. 12/32 repository: add index_state to struct repoBrandon Williams, Jun 8, 2017
  112. 08/32 environment: place key repository state in the_repositoryBrandon Williams, Jun 8, 2017
  113. 11/32 config: read config from a repository objectBrandon Williams, Jun 8, 2017
  114. Jonathan TanJun 10, 2017
  115. Jeff KingJun 10, 2017
  116. Jeff KingJun 10, 2017
  117. Brandon WilliamsJun 11, 2017
  118. Jonathan TanJun 12, 2017
  119. Brandon WilliamsJun 11, 2017
  120. Stefan BellerJun 12, 2017
  121. Jeff KingJun 12, 2017
  122. Jonathan TanJun 12, 2017
  123. Brandon WilliamsJun 12, 2017
  124. Jonathan TanJun 12, 2017
  125. Jeff KingJun 12, 2017
  126. 00/20 repository objectBrandon Williams, Jun 20, 2017
  127. 04/20 repository: introduce the repository objectBrandon Williams, Jun 20, 2017
  128. Stefan BellerJun 20, 2017
  129. Brandon WilliamsJun 21, 2017
  130. Stefan BellerJun 21, 2017
  131. Jonathan TanJun 20, 2017
  132. Brandon WilliamsJun 20, 2017
  133. 15/20 repository: add index_state to struct repoBrandon Williams, Jun 20, 2017
  134. Jonathan TanJun 21, 2017
  135. Brandon WilliamsJun 21, 2017
  136. Stefan BellerJun 21, 2017
  137. 02/20 setup: add comment indicating a hackBrandon Williams, Jun 20, 2017
  138. 08/20 path: always pass in commondir to update_common_dirBrandon Williams, Jun 20, 2017
  139. 14/20 config: read config from a repository objectBrandon Williams, Jun 20, 2017
  140. 20/20 ls-files: use repository objectBrandon Williams, Jun 20, 2017
  141. Jonathan TanJun 21, 2017
  142. 16/20 submodule-config: store the_submodule_cache in the_repositoryBrandon Williams, Jun 20, 2017
  143. 18/20 submodule: convert is_submodule_initialized to work on a repositoryBrandon Williams, Jun 20, 2017
  144. 19/20 repository: enable initialization of submodulesBrandon Williams, Jun 20, 2017
  145. Jonathan TanJun 21, 2017
  146. Brandon WilliamsJun 21, 2017
  147. 17/20 submodule: add repo_read_gitmodulesBrandon Williams, Jun 20, 2017
  148. 07/20 path: create path.hBrandon Williams, Jun 20, 2017
  149. 12/20 path: add repo_git_path and strbuf_repo_git_pathBrandon Williams, Jun 20, 2017
  150. 05/20 environment: place key repository state in the_repositoryBrandon Williams, Jun 20, 2017
  151. Jonathan TanJun 20, 2017
  152. 10/20 path: convert do_git_path to take a 'struct repository'Brandon Williams, Jun 20, 2017
  153. Jonathan TanJun 20, 2017
  154. Brandon WilliamsJun 21, 2017
  155. 11/20 path: construct correct path to a worktree's indexBrandon Williams, Jun 20, 2017
  156. Stefan BellerJun 20, 2017
  157. Jonathan NiederJun 20, 2017
  158. Brandon WilliamsJun 21, 2017
  159. Jonathan NiederJun 21, 2017
  160. Jonathan NiederJun 21, 2017
  161. Brandon WilliamsJun 21, 2017
  162. Jonathan NiederJun 21, 2017
  163. Junio C HamanoJun 21, 2017
  164. 06/20 environment: store worktree in the_repositoryBrandon Williams, Jun 20, 2017
  165. 03/20 environment: remove namespace_len variableBrandon Williams, Jun 20, 2017
  166. 01/20 setup: don't perform lazy initialization of repository stateBrandon Williams, Jun 20, 2017
  167. 13/20 path: add repo_worktree_path and strbuf_repo_worktree_pathBrandon Williams, Jun 20, 2017
  168. 09/20 path: convert strbuf_git_common_path to take a 'struct repository'Brandon Williams, Jun 20, 2017
  169. Stefan BellerJun 20, 2017
  170. 00/20 repository objectBrandon Williams, Jun 22, 2017
  171. 01/20 setup: don't perform lazy initialization of repository stateBrandon Williams, Jun 22, 2017
  172. 02/20 setup: add comment indicating a hackBrandon Williams, Jun 22, 2017
  173. 04/20 repository: introduce the repository objectBrandon Williams, Jun 22, 2017
  174. 05/20 environment: place key repository state in the_repositoryBrandon Williams, Jun 22, 2017
  175. 03/20 environment: remove namespace_len variableBrandon Williams, Jun 22, 2017
  176. 09/20 path: convert strbuf_git_common_path to take a 'struct repository'Brandon Williams, Jun 22, 2017
  177. 08/20 path: always pass in commondir to update_common_dirBrandon Williams, Jun 22, 2017
  178. 07/20 path: create path.hBrandon Williams, Jun 22, 2017
  179. 06/20 environment: store worktree in the_repositoryBrandon Williams, Jun 22, 2017
  180. 11/20 path: worktree_git_path() should not use file relocationBrandon Williams, Jun 22, 2017
  181. 16/20 submodule-config: store the_submodule_cache in the_repositoryBrandon Williams, Jun 22, 2017
  182. 10/20 path: convert do_git_path to take a 'struct repository'Brandon Williams, Jun 22, 2017
  183. 18/20 submodule: convert is_submodule_initialized to work on a repositoryBrandon Williams, Jun 22, 2017
  184. 14/20 config: read config from a repository objectBrandon Williams, Jun 22, 2017
  185. 19/20 repository: enable initialization of submodulesBrandon Williams, Jun 22, 2017
  186. 17/20 submodule: add repo_read_gitmodulesBrandon Williams, Jun 22, 2017
  187. 20/20 ls-files: use repository objectBrandon Williams, Jun 22, 2017
  188. 13/20 path: add repo_worktree_path and strbuf_repo_worktree_pathBrandon Williams, Jun 22, 2017
  189. 12/20 path: add repo_git_path and strbuf_repo_git_pathBrandon Williams, Jun 22, 2017
  190. 15/20 repository: add index_state to struct repoBrandon Williams, Jun 22, 2017
  191. Junio C HamanoJun 22, 2017
  192. Brandon WilliamsJun 22, 2017
  193. Junio C HamanoJun 22, 2017
  194. Stefan BellerJun 22, 2017
  195. Jeff HostetlerJun 23, 2017
  196. Junio C HamanoJun 23, 2017

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.