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

[PATCH v4 2/5] refs.c: make submodule ref store hashmap generic

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Apr 4, 2017, 10:21 UTC
Message-ID
<20170404102123.25315-3-pclouds@gmail.com>
In-Reply-To
<20170404102123.25315-1-pclouds@gmail.com>

This removes the "submodule" from submodule_hash_entry and other function names. The goal is to reuse the same code and data structure for other ref store types. The first one is worktree ref stores.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 refs.c | 64 ++++++++++++++++++++++++++++++++--------------------------------
 1 file changed, 32 insertions(+), 32 deletions(-)
diff --git a/refs.c b/refs.c
index ec1f563824..875e30a0b8 100644
--- a/refs.c
+++ b/refs.c
@@ -1450,32 +1450,32 @@ int resolve_gitlink_ref(const char *submodule, const char *refname,
 	return 0;
 }
 
-struct submodule_hash_entry
+struct ref_store_hash_entry
 {
 	struct hashmap_entry ent; /* must be the first member! */
 
 	struct ref_store *refs;
 
-	/* NUL-terminated name of submodule: */
-	char submodule[FLEX_ARRAY];
+	/* NUL-terminated identifier of the ref store: */
+	char name[FLEX_ARRAY];
 };
 
-static int submodule_hash_cmp(const void *entry, const void *entry_or_key,
+static int ref_store_hash_cmp(const void *entry, const void *entry_or_key,
 			      const void *keydata)
 {
-	const struct submodule_hash_entry *e1 = entry, *e2 = entry_or_key;
-	const char *submodule = keydata ? keydata : e2->submodule;
+	const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
+	const char *name = keydata ? keydata : e2->name;
 
-	return strcmp(e1->submodule, submodule);
+	return strcmp(e1->name, name);
 }
 
-static struct submodule_hash_entry *alloc_submodule_hash_entry(
-		const char *submodule, struct ref_store *refs)
+static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
+		const char *name, struct ref_store *refs)
 {
-	struct submodule_hash_entry *entry;
+	struct ref_store_hash_entry *entry;
 
-	FLEX_ALLOC_STR(entry, submodule, submodule);
-	hashmap_entry_init(entry, strhash(submodule));
+	FLEX_ALLOC_STR(entry, name, name);
+	hashmap_entry_init(entry, strhash(name));
 	entry->refs = refs;
 	return entry;
 }
@@ -1487,19 +1487,19 @@ static struct ref_store *main_ref_store;
 static struct hashmap submodule_ref_stores;
 
 /*
- * Return the ref_store instance for the specified submodule. If that
- * ref_store hasn't been initialized yet, return NULL.
+ * Look up a ref store by name. If that ref_store hasn't been
+ * registered yet, return NULL.
  */
-static struct ref_store *lookup_submodule_ref_store(const char *submodule)
+static struct ref_store *lookup_ref_store_map(struct hashmap *map,
+					      const char *name)
 {
-	struct submodule_hash_entry *entry;
+	struct ref_store_hash_entry *entry;
 
-	if (!submodule_ref_stores.tablesize)
+	if (!map->tablesize)
 		/* It's initialized on demand in register_ref_store(). */
 		return NULL;
 
-	entry = hashmap_get_from_hash(&submodule_ref_stores,
-				      strhash(submodule), submodule);
+	entry = hashmap_get_from_hash(map, strhash(name), name);
 	return entry ? entry->refs : NULL;
 }
 
@@ -1535,20 +1535,19 @@ struct ref_store *get_main_ref_store(void)
 }
 
 /*
- * Register the specified ref_store to be the one that should be used
- * for submodule. It is a fatal error to call this function twice for
- * the same submodule.
+ * Associate a ref store with a name. It is a fatal error to call this
+ * function twice for the same name.
  */
-static void register_submodule_ref_store(struct ref_store *refs,
-					 const char *submodule)
+static void register_ref_store_map(struct hashmap *map,
+				   const char *type,
+				   struct ref_store *refs,
+				   const char *name)
 {
-	if (!submodule_ref_stores.tablesize)
-		hashmap_init(&submodule_ref_stores, submodule_hash_cmp, 0);
+	if (!map->tablesize)
+		hashmap_init(map, ref_store_hash_cmp, 0);
 
-	if (hashmap_put(&submodule_ref_stores,
-			alloc_submodule_hash_entry(submodule, refs)))
-		die("BUG: ref_store for submodule '%s' initialized twice",
-		    submodule);
+	if (hashmap_put(map, alloc_ref_store_hash_entry(name, refs)))
+		die("BUG: %s ref_store '%s' initialized twice", type, name);
 }
 
 struct ref_store *get_submodule_ref_store(const char *submodule)
@@ -1565,7 +1564,7 @@ struct ref_store *get_submodule_ref_store(const char *submodule)
 		return get_main_ref_store();
 	}
 
-	refs = lookup_submodule_ref_store(submodule);
+	refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
 	if (refs)
 		return refs;
 
@@ -1584,7 +1583,8 @@ struct ref_store *get_submodule_ref_store(const char *submodule)
 	/* pretend that add_submodule_odb() has been called */
 	refs = ref_store_init(submodule_sb.buf,
 			      REF_STORE_READ | REF_STORE_ODB);
-	register_submodule_ref_store(refs, submodule);
+	register_ref_store_map(&submodule_ref_stores, "submodule",
+			       refs, submodule);
 
 	strbuf_release(&submodule_sb);
 	return refs;
-- 
2.11.0.157.gd943d85
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 34 of 51 in “Kill manual ref parsing code in worktree.c”
  1. 0/2 Kill manual ref parsing code in worktree.cNguyễn Thái Ngọc Duy, Feb 8, 2017
  2. 1/2 refs.c: add resolve_ref_submodule()Nguyễn Thái Ngọc Duy, Feb 8, 2017
  3. Michael HaggertyFeb 9, 2017
  4. 2/2 worktree.c: use submodule interface to access refs from another worktreeNguyễn Thái Ngọc Duy, Feb 8, 2017
  5. Stefan BellerFeb 8, 2017
  6. Junio C HamanoFeb 8, 2017
  7. Junio C HamanoFeb 8, 2017
  8. Michael HaggertyFeb 9, 2017
  9. Junio C HamanoFeb 9, 2017
  10. Michael HaggertyFeb 9, 2017
  11. Duy NguyenFeb 9, 2017
  12. Michael HaggertyFeb 9, 2017
  13. Junio C HamanoFeb 8, 2017
  14. 0/5 Kill manual ref parsing code in worktree.cNguyễn Thái Ngọc Duy, Feb 16, 2017
  15. 1/5 refs: introduce get_worktree_ref_store()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  16. 2/5 refs.c: add refs_resolve_ref_unsafe()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  17. 3/5 worktree.c: kill parse_ref() in favor of refs_resolve_ref_unsafe()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  18. 4/5 refs: add refs_create_symref()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  19. 5/5 refs: kill set_worktree_head_symref()Nguyễn Thái Ngọc Duy, Feb 16, 2017
  20. 0/4 Kill manual ref parsing code in worktree.cNguyễn Thái Ngọc Duy, Mar 18, 2017
  21. 4/4 refs: kill set_worktree_head_symref()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  22. 3/4 worktree.c: kill parse_ref() in favor of refs_resolve_ref_unsafe()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  23. 2/4 refs: introduce get_worktree_ref_store()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  24. Michael HaggertyMar 20, 2017
  25. Duy NguyenMar 20, 2017
  26. Michael HaggertyMar 20, 2017
  27. Duy NguyenMar 26, 2017
  28. 1/4 environment.c: fix potential segfault by get_git_common_dir()Nguyễn Thái Ngọc Duy, Mar 18, 2017
  29. Junio C HamanoMar 18, 2017
  30. Duy NguyenMar 19, 2017
  31. Junio C HamanoMar 18, 2017
  32. 0/5 Kill manual ref parsing code in worktree.cNguyễn Thái Ngọc Duy, Apr 4, 2017
  33. 1/5 environment.c: fix potential segfault by get_git_common_dir()Nguyễn Thái Ngọc Duy, Apr 4, 2017
  34. 2/5 refs.c: make submodule ref store hashmap genericNguyễn Thái Ngọc Duy, Apr 4, 2017
  35. 3/5 refs: introduce get_worktree_ref_store()Nguyễn Thái Ngọc Duy, Apr 4, 2017
  36. Michael HaggertyApr 22, 2017
  37. 4/5 worktree.c: kill parse_ref() in favor of refs_resolve_ref_unsafe()Nguyễn Thái Ngọc Duy, Apr 4, 2017
  38. 5/5 refs: kill set_worktree_head_symref()Nguyễn Thái Ngọc Duy, Apr 4, 2017
  39. Junio C HamanoApr 14, 2017
  40. Junio C HamanoApr 14, 2017
  41. Duy NguyenApr 14, 2017
  42. Junio C HamanoApr 17, 2017
  43. Michael HaggertyApr 22, 2017
  44. 0/6 Kill manual ref parsing code in worktree.cNguyễn Thái Ngọc Duy, Apr 24, 2017
  45. 1/6 environment.c: fix potential segfault by get_git_common_dir()Nguyễn Thái Ngọc Duy, Apr 24, 2017
  46. 2/6 refs.c: make submodule ref store hashmap genericNguyễn Thái Ngọc Duy, Apr 24, 2017
  47. 4/6 refs: introduce get_worktree_ref_store()Nguyễn Thái Ngọc Duy, Apr 24, 2017
  48. 5/6 worktree.c: kill parse_ref() in favor of refs_resolve_ref_unsafe()Nguyễn Thái Ngọc Duy, Apr 24, 2017
  49. 3/6 refs: add REFS_STORE_ALL_CAPSNguyễn Thái Ngọc Duy, Apr 24, 2017
  50. 6/6 refs: kill set_worktree_head_symref()Nguyễn Thái Ngọc Duy, Apr 24, 2017
  51. Junio C HamanoApr 25, 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.