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

[PATCH v2 4/9] register_ref_store(): new function

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Feb 10, 2017, 11:16 UTC
Message-ID
<5569188834dd39bf40bcae034a8d23d21d31a7e9.1486724698.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1486724698.git.mhagger@alum.mit.edu>

Move the responsibility for registering the ref_store for a submodule from base_ref_store_init() to a new function, register_ref_store(). Call the latter from ref_store_init().

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 refs.c | 43 +++++++++++++++++++++++++++++--------------
 1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/refs.c b/refs.c
index 6348414..d7158b6 100644
--- a/refs.c
+++ b/refs.c
@@ -1379,6 +1379,29 @@ static struct ref_store *lookup_ref_store(const char *submodule)
 }
 
 /*
+ * Register the specified ref_store to be the one that should be used
+ * for submodule (or the main repository if submodule is NULL). It is
+ * a fatal error to call this function twice for the same submodule.
+ */
+static void register_ref_store(struct ref_store *refs, const char *submodule)
+{
+	if (!submodule) {
+		if (main_ref_store)
+			die("BUG: main_ref_store initialized twice");
+
+		refs->next = NULL;
+		main_ref_store = refs;
+	} else {
+		if (lookup_ref_store(submodule))
+			die("BUG: ref_store for submodule '%s' initialized twice",
+			    submodule);
+
+		refs->next = submodule_ref_stores;
+		submodule_ref_stores = refs;
+	}
+}
+
+/*
  * Create, record, and return a ref_store instance for the specified
  * submodule (or the main repository if submodule is NULL).
  */
@@ -1386,11 +1409,14 @@ static struct ref_store *ref_store_init(const char *submodule)
 {
 	const char *be_name = "files";
 	struct ref_storage_be *be = find_ref_storage_backend(be_name);
+	struct ref_store *refs;
 
 	if (!be)
 		die("BUG: reference backend %s is unknown", be_name);
 
-	return be->init(submodule);
+	refs = be->init(submodule);
+	register_ref_store(refs, submodule);
+	return refs;
 }
 
 struct ref_store *get_ref_store(const char *submodule)
@@ -1423,22 +1449,11 @@ void base_ref_store_init(struct ref_store *refs,
 			 const char *submodule)
 {
 	refs->be = be;
-	if (!submodule) {
-		if (main_ref_store)
-			die("BUG: main_ref_store initialized twice");
 
+	if (!submodule)
 		refs->submodule = "";
-		refs->next = NULL;
-		main_ref_store = refs;
-	} else {
-		if (lookup_ref_store(submodule))
-			die("BUG: ref_store for submodule '%s' initialized twice",
-			    submodule);
-
+	else
 		refs->submodule = xstrdup(submodule);
-		refs->next = submodule_ref_stores;
-		submodule_ref_stores = refs;
-	}
 }
 
 void assert_main_repository(struct ref_store *refs, const char *caller)
-- 
2.9.3
Previous: Michael HaggertyNext: Michael Haggerty
Message 9 of 18 in “Store submodules in a hash, not a linked list”
  1. 0/9 Store submodules in a hash, not a linked listMichael Haggerty, Feb 10, 2017
  2. 2/9 refs: make some ref_store lookup functions privateMichael Haggerty, Feb 10, 2017
  3. 7/9 base_ref_store_init(): remove submodule argumentMichael Haggerty, Feb 10, 2017
  4. 9/9 read_loose_refs(): read refs using resolve_ref_recursively()Michael Haggerty, Feb 10, 2017
  5. Junio C HamanoFeb 10, 2017
  6. Michael HaggertyFeb 13, 2017
  7. Junio C HamanoFeb 13, 2017
  8. 6/9 refs: push the submodule attribute downMichael Haggerty, Feb 10, 2017
  9. 4/9 register_ref_store(): new functionMichael Haggerty, Feb 10, 2017
  10. 8/9 files_ref_store::submodule: use NULL for the main repositoryMichael Haggerty, Feb 10, 2017
  11. 3/9 refs: remove some unnecessary handling of submodule == ""Michael Haggerty, Feb 10, 2017
  12. 1/9 refs: reorder some function definitionsMichael Haggerty, Feb 10, 2017
  13. Junio C HamanoFeb 10, 2017
  14. 5/9 refs: store submodule ref stores in a hashmapMichael Haggerty, Feb 10, 2017
  15. Jeff KingFeb 10, 2017
  16. Stefan BellerFeb 10, 2017
  17. Junio C HamanoFeb 10, 2017
  18. David TurnerFeb 13, 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.