Web lists-archives.com

[WIP/RFC 21/23] repo: add repo_read_gitmodules




Add ability for a repository to poulate its own submodule_cache by
reading the repository's gitmodules file.

Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx>
---
 repo.c | 26 ++++++++++++++++++++++++++
 repo.h |  3 +++
 2 files changed, 29 insertions(+)

diff --git a/repo.c b/repo.c
index 223adf4c8..5449eb212 100644
--- a/repo.c
+++ b/repo.c
@@ -1,4 +1,6 @@
 #include "cache.h"
+#include "submodule.h"
+#include "submodule-config.h"
 #include "repo.h"
 
 char *
@@ -33,6 +35,27 @@ repo_read_config(struct repo *repo)
 				       NULL, &opts);
 }
 
+static int
+gitmodules_cb(const char *var, const char *value, void *data)
+{
+	struct repo *repo = data;
+	return parse_submodule_config_option_cache(repo->submodule_cache, var, value);
+}
+
+int
+repo_read_gitmodules(struct repo *repo)
+{
+	char *gitmodules_path = xstrfmt("%s/.gitmodules", repo->worktree);
+
+	if (!repo->worktree)
+		die("BUG: no worktree");
+
+	repo->submodule_cache = submodule_cache_alloc();
+	submodule_cache_init(repo->submodule_cache);
+	git_config_from_file(gitmodules_cb, gitmodules_path, repo);
+	return 0;
+}
+
 int
 repo_init(struct repo *repo, const char *gitdir, const char *worktree)
 {
@@ -83,4 +106,7 @@ repo_clear(struct repo *repo)
 		git_configset_clear(repo->config);
 		free(repo->config);
 	}
+
+	if (repo->submodule_cache)
+		submodule_cache_free(repo->submodule_cache);
 }
diff --git a/repo.h b/repo.h
index b4df774c3..9ff144957 100644
--- a/repo.h
+++ b/repo.h
@@ -10,10 +10,13 @@ struct repo {
 	const char *submodule_prefix;
 	struct index_state *index;
 	struct config_set *config;
+	struct submodule_cache *submodule_cache;
 };
 
 extern int repo_read_index(struct repo *repo, const char *index_file);
 extern int repo_init(struct repo *repo, const char *gitdir, const char *worktree);
 extern void repo_clear(struct repo *repo);
 
+extern int repo_read_gitmodules(struct repo *repo);
+
 #endif /* REPO_H */
-- 
2.13.0.303.g4ebf302169-goog