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

[PATCH v5 02/12] refs: convert ref storage format to an enum

From
Patrick Steinhardt <ps@pks.im>
Date
Jun 6, 2024, 05:29 UTC
Message-ID
<7989e82dcd89c92f23de7ab4ebde96124aa6fe12.1717649802.git.ps@pks.im>
In-Reply-To
<cover.1717649802.git.ps@pks.im>

The ref storage format is tracked as a simple unsigned integer, which makes it harder than necessary to discover what that integer actually is or where its values are defined.

Convert the ref storage format to instead be an enum.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 builtin/clone.c   |  2 +-
 builtin/init-db.c |  2 +-
 refs.c            |  7 ++++---
 refs.h            | 10 ++++++++--
 repository.c      |  3 ++-
 repository.h      | 10 ++++------
 setup.c           |  8 ++++----
 setup.h           |  9 +++++----
 8 files changed, 29 insertions(+), 22 deletions(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index 1e07524c53..e808e02017 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -970,7 +970,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 	int submodule_progress;
 	int filter_submodules = 0;
 	int hash_algo;
-	unsigned int ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
+	enum ref_storage_format ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
 	const int do_not_override_repo_unix_permissions = -1;
 	const char *template_dir;
 	char *template_dir_dup = NULL;
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 0170469b84..582dcf20f8 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -81,7 +81,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
 	const char *ref_format = NULL;
 	const char *initial_branch = NULL;
 	int hash_algo = GIT_HASH_UNKNOWN;
-	unsigned int ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
+	enum ref_storage_format ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN;
 	int init_shared_repository = -1;
 	const struct option init_db_options[] = {
 		OPT_STRING(0, "template", &template_dir, N_("template-directory"),
diff --git a/refs.c b/refs.c
index 31032588e0..e6db85a165 100644
--- a/refs.c
+++ b/refs.c
@@ -37,14 +37,15 @@ static const struct ref_storage_be *refs_backends[] = {
 	[REF_STORAGE_FORMAT_REFTABLE] = &refs_be_reftable,
 };
 
-static const struct ref_storage_be *find_ref_storage_backend(unsigned int ref_storage_format)
+static const struct ref_storage_be *find_ref_storage_backend(
+	enum ref_storage_format ref_storage_format)
 {
 	if (ref_storage_format < ARRAY_SIZE(refs_backends))
 		return refs_backends[ref_storage_format];
 	return NULL;
 }
 
-unsigned int ref_storage_format_by_name(const char *name)
+enum ref_storage_format ref_storage_format_by_name(const char *name)
 {
 	for (unsigned int i = 0; i < ARRAY_SIZE(refs_backends); i++)
 		if (refs_backends[i] && !strcmp(refs_backends[i]->name, name))
@@ -52,7 +53,7 @@ unsigned int ref_storage_format_by_name(const char *name)
 	return REF_STORAGE_FORMAT_UNKNOWN;
 }
 
-const char *ref_storage_format_to_name(unsigned int ref_storage_format)
+const char *ref_storage_format_to_name(enum ref_storage_format ref_storage_format)
 {
 	const struct ref_storage_be *be = find_ref_storage_backend(ref_storage_format);
 	if (!be)
diff --git a/refs.h b/refs.h
index fe7f0db35e..a7afa9bede 100644
--- a/refs.h
+++ b/refs.h
@@ -11,8 +11,14 @@ struct string_list;
 struct string_list_item;
 struct worktree;
 
-unsigned int ref_storage_format_by_name(const char *name);
-const char *ref_storage_format_to_name(unsigned int ref_storage_format);
+enum ref_storage_format {
+	REF_STORAGE_FORMAT_UNKNOWN,
+	REF_STORAGE_FORMAT_FILES,
+	REF_STORAGE_FORMAT_REFTABLE,
+};
+
+enum ref_storage_format ref_storage_format_by_name(const char *name);
+const char *ref_storage_format_to_name(enum ref_storage_format ref_storage_format);
 
 /*
  * Resolve a reference, recursively following symbolic refererences.
diff --git a/repository.c b/repository.c
index d29b0304fb..166863f852 100644
--- a/repository.c
+++ b/repository.c
@@ -124,7 +124,8 @@ void repo_set_compat_hash_algo(struct repository *repo, int algo)
 		repo_read_loose_object_map(repo);
 }
 
-void repo_set_ref_storage_format(struct repository *repo, unsigned int format)
+void repo_set_ref_storage_format(struct repository *repo,
+				 enum ref_storage_format format)
 {
 	repo->ref_storage_format = format;
 }
diff --git a/repository.h b/repository.h
index 4bd8969005..a35cd77c35 100644
--- a/repository.h
+++ b/repository.h
@@ -1,6 +1,7 @@
 #ifndef REPOSITORY_H
 #define REPOSITORY_H
 
+#include "refs.h"
 #include "strmap.h"
 
 struct config_set;
@@ -26,10 +27,6 @@ enum fetch_negotiation_setting {
 	FETCH_NEGOTIATION_NOOP,
 };
 
-#define REF_STORAGE_FORMAT_UNKNOWN  0
-#define REF_STORAGE_FORMAT_FILES    1
-#define REF_STORAGE_FORMAT_REFTABLE 2
-
 struct repo_settings {
 	int initialized;
 
@@ -181,7 +178,7 @@ struct repository {
 	const struct git_hash_algo *compat_hash_algo;
 
 	/* Repository's reference storage format, as serialized on disk. */
-	unsigned int ref_storage_format;
+	enum ref_storage_format ref_storage_format;
 
 	/* A unique-id for tracing purposes. */
 	int trace2_repo_id;
@@ -220,7 +217,8 @@ void repo_set_gitdir(struct repository *repo, const char *root,
 void repo_set_worktree(struct repository *repo, const char *path);
 void repo_set_hash_algo(struct repository *repo, int algo);
 void repo_set_compat_hash_algo(struct repository *repo, int compat_algo);
-void repo_set_ref_storage_format(struct repository *repo, unsigned int format);
+void repo_set_ref_storage_format(struct repository *repo,
+				 enum ref_storage_format format);
 void initialize_repository(struct repository *repo);
 RESULT_MUST_BE_USED
 int repo_init(struct repository *r, const char *gitdir, const char *worktree);
diff --git a/setup.c b/setup.c
index 8c84ec9d4b..b49ee3e95f 100644
--- a/setup.c
+++ b/setup.c
@@ -1997,7 +1997,7 @@ static int needs_work_tree_config(const char *git_dir, const char *work_tree)
 }
 
 void initialize_repository_version(int hash_algo,
-				   unsigned int ref_storage_format,
+				   enum ref_storage_format ref_storage_format,
 				   int reinit)
 {
 	char repo_version_string[10];
@@ -2044,7 +2044,7 @@ static int is_reinit(void)
 	return ret;
 }
 
-void create_reference_database(unsigned int ref_storage_format,
+void create_reference_database(enum ref_storage_format ref_storage_format,
 			       const char *initial_branch, int quiet)
 {
 	struct strbuf err = STRBUF_INIT;
@@ -2243,7 +2243,7 @@ static void validate_hash_algorithm(struct repository_format *repo_fmt, int hash
 }
 
 static void validate_ref_storage_format(struct repository_format *repo_fmt,
-					unsigned int format)
+					enum ref_storage_format format)
 {
 	const char *name = getenv("GIT_DEFAULT_REF_FORMAT");
 
@@ -2263,7 +2263,7 @@ static void validate_ref_storage_format(struct repository_format *repo_fmt,
 
 int init_db(const char *git_dir, const char *real_git_dir,
 	    const char *template_dir, int hash,
-	    unsigned int ref_storage_format,
+	    enum ref_storage_format ref_storage_format,
 	    const char *initial_branch,
 	    int init_shared_repository, unsigned int flags)
 {
diff --git a/setup.h b/setup.h
index b3fd3bf45a..cd8dbc2497 100644
--- a/setup.h
+++ b/setup.h
@@ -1,6 +1,7 @@
 #ifndef SETUP_H
 #define SETUP_H
 
+#include "refs.h"
 #include "string-list.h"
 
 int is_inside_git_dir(void);
@@ -128,7 +129,7 @@ struct repository_format {
 	int is_bare;
 	int hash_algo;
 	int compat_hash_algo;
-	unsigned int ref_storage_format;
+	enum ref_storage_format ref_storage_format;
 	int sparse_index;
 	char *work_tree;
 	struct string_list unknown_extensions;
@@ -192,13 +193,13 @@ const char *get_template_dir(const char *option_template);
 
 int init_db(const char *git_dir, const char *real_git_dir,
 	    const char *template_dir, int hash_algo,
-	    unsigned int ref_storage_format,
+	    enum ref_storage_format ref_storage_format,
 	    const char *initial_branch, int init_shared_repository,
 	    unsigned int flags);
 void initialize_repository_version(int hash_algo,
-				   unsigned int ref_storage_format,
+				   enum ref_storage_format ref_storage_format,
 				   int reinit);
-void create_reference_database(unsigned int ref_storage_format,
+void create_reference_database(enum ref_storage_format ref_storage_format,
 			       const char *initial_branch, int quiet);
 
 /*
-- 
2.45.2.409.g7b0defb391.dirty
Previous: Patrick SteinhardtNext: Patrick Steinhardt
Message 91 of 103 in “refs: ref storage format migrations”
  1. 0/9 refs: ref storage format migrationsPatrick Steinhardt, May 23, 2024
  2. 1/9 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, May 23, 2024
  3. 2/9 refs: convert ref storage format to an enumPatrick Steinhardt, May 23, 2024
  4. 3/9 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, May 23, 2024
  5. 4/9 refs: allow to skip creation of reflog entriesPatrick Steinhardt, May 23, 2024
  6. 5/9 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, May 23, 2024
  7. 6/9 refs/files: extract function to iterate through root refsPatrick Steinhardt, May 23, 2024
  8. 7/9 refs: implement removal of ref storagesPatrick Steinhardt, May 23, 2024
  9. 8/9 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, May 23, 2024
  10. Eric SunshineMay 23, 2024
  11. Patrick SteinhardtMay 24, 2024
  12. Eric SunshineMay 24, 2024
  13. 9/9 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, May 23, 2024
  14. Eric SunshineMay 23, 2024
  15. Patrick SteinhardtMay 24, 2024
  16. Junio C HamanoMay 23, 2024
  17. Patrick SteinhardtMay 24, 2024
  18. Junio C HamanoMay 24, 2024
  19. Patrick SteinhardtMay 28, 2024
  20. Junio C HamanoMay 28, 2024
  21. 0/9 refs: ref storage format migrationsPatrick Steinhardt, May 24, 2024
  22. 1/9 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, May 24, 2024
  23. Justin ToblerMay 24, 2024
  24. Patrick SteinhardtMay 28, 2024
  25. 2/9 refs: convert ref storage format to an enumPatrick Steinhardt, May 24, 2024
  26. 3/9 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, May 24, 2024
  27. 4/9 refs: allow to skip creation of reflog entriesPatrick Steinhardt, May 24, 2024
  28. 5/9 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, May 24, 2024
  29. 6/9 refs/files: extract function to iterate through root refsPatrick Steinhardt, May 24, 2024
  30. 7/9 refs: implement removal of ref storagesPatrick Steinhardt, May 24, 2024
  31. 8/9 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, May 24, 2024
  32. Justin ToblerMay 24, 2024
  33. Patrick SteinhardtMay 28, 2024
  34. 9/9 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, May 24, 2024
  35. Ramsay JonesMay 24, 2024
  36. Eric SunshineMay 24, 2024
  37. Patrick SteinhardtMay 28, 2024
  38. 00/12 refs: ref storage format migrationsPatrick Steinhardt, May 28, 2024
  39. 01/12 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, May 28, 2024
  40. 02/12 refs: convert ref storage format to an enumPatrick Steinhardt, May 28, 2024
  41. 03/12 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, May 28, 2024
  42. 04/12 refs: allow to skip creation of reflog entriesPatrick Steinhardt, May 28, 2024
  43. 05/12 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, May 28, 2024
  44. 06/12 refs/files: extract function to iterate through root refsPatrick Steinhardt, May 28, 2024
  45. 07/12 refs/files: fix NULL pointer deref when releasing ref storePatrick Steinhardt, May 28, 2024
  46. 08/12 reftable: inline `merged_table_release()`Patrick Steinhardt, May 28, 2024
  47. 09/12 worktree: don't store main worktree twicePatrick Steinhardt, May 28, 2024
  48. 10/12 refs: implement removal of ref storagesPatrick Steinhardt, May 28, 2024
  49. 11/12 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, May 28, 2024
  50. 12/12 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, May 28, 2024
  51. Junio C HamanoMay 31, 2024
  52. Junio C HamanoJun 2, 2024
  53. Patrick SteinhardtJun 3, 2024
  54. Junio C HamanoMay 28, 2024
  55. Junio C HamanoMay 28, 2024
  56. 00/12 refs: ref storage migrationsPatrick Steinhardt, Jun 3, 2024
  57. 01/12 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, Jun 3, 2024
  58. 02/12 refs: convert ref storage format to an enumPatrick Steinhardt, Jun 3, 2024
  59. 03/12 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, Jun 3, 2024
  60. Karthik NayakJun 4, 2024
  61. 04/12 refs: allow to skip creation of reflog entriesPatrick Steinhardt, Jun 3, 2024
  62. Karthik NayakJun 4, 2024
  63. 05/12 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, Jun 3, 2024
  64. 06/12 refs/files: extract function to iterate through root refsPatrick Steinhardt, Jun 3, 2024
  65. Jeff KingJun 5, 2024
  66. Patrick SteinhardtJun 6, 2024
  67. Patrick SteinhardtJun 6, 2024
  68. Patrick SteinhardtJun 6, 2024
  69. 07/12 refs/files: fix NULL pointer deref when releasing ref storePatrick Steinhardt, Jun 3, 2024
  70. 08/12 reftable: inline `merged_table_release()`Patrick Steinhardt, Jun 3, 2024
  71. 09/12 worktree: don't store main worktree twicePatrick Steinhardt, Jun 3, 2024
  72. 10/12 refs: implement removal of ref storagesPatrick Steinhardt, Jun 3, 2024
  73. Karthik NayakJun 4, 2024
  74. Jeff KingJun 5, 2024
  75. Junio C HamanoJun 5, 2024
  76. Patrick SteinhardtJun 6, 2024
  77. 11/12 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, Jun 3, 2024
  78. Karthik NayakJun 4, 2024
  79. Patrick SteinhardtJun 5, 2024
  80. Jeff KingJun 5, 2024
  81. Junio C HamanoJun 5, 2024
  82. Patrick SteinhardtJun 6, 2024
  83. Jeff KingJun 6, 2024
  84. Junio C HamanoJun 6, 2024
  85. Jeff KingJun 8, 2024
  86. Junio C HamanoJun 8, 2024
  87. Patrick SteinhardtJun 6, 2024
  88. 12/12 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, Jun 3, 2024
  89. 00/12 refs: ref storage migrationsPatrick Steinhardt, Jun 6, 2024
  90. 01/12 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, Jun 6, 2024
  91. 02/12 refs: convert ref storage format to an enumPatrick Steinhardt, Jun 6, 2024
  92. 03/12 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, Jun 6, 2024
  93. 04/12 refs: allow to skip creation of reflog entriesPatrick Steinhardt, Jun 6, 2024
  94. 05/12 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, Jun 6, 2024
  95. 06/12 refs/files: extract function to iterate through root refsPatrick Steinhardt, Jun 6, 2024
  96. 07/12 refs/files: fix NULL pointer deref when releasing ref storePatrick Steinhardt, Jun 6, 2024
  97. 08/12 reftable: inline `merged_table_release()`Patrick Steinhardt, Jun 6, 2024
  98. 09/12 worktree: don't store main worktree twicePatrick Steinhardt, Jun 6, 2024
  99. 10/12 refs: implement removal of ref storagesPatrick Steinhardt, Jun 6, 2024
  100. 11/12 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, Jun 6, 2024
  101. 12/12 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, Jun 6, 2024
  102. Jeff KingJun 6, 2024
  103. Junio C HamanoJun 6, 2024

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.