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

Re: [GSoC RFC PATCH v4 2/4] repo: add the field references.format

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jul 15, 2025, 12:23 UTC
Message-ID
<CAOLa=ZTTuxq5Xs4M+okK+3t5Rr_MimseQf8TCTrCL4yvq4EN6w@mail.gmail.com>
In-Reply-To
<20250714235231.10137-3-lucasseikioshiro@gmail.com>
Lucas Seiki Oshiro <lucasseikioshiro@gmail.com> writes:
Show 11 quoted lines
> This commit is part of the series that introduce the new subcommand
> git-repo-info.
>
> The flag `--show-ref-format` from git-rev-parse is used for retrieving
> the reference format (i.e. `files` or `reftable`). This way, it is
> used for querying repository metadata, fitting in the purpose of
> git-repo-info.
>
> Then, add a new field `references.format` to the repo-info subcommand
> containing that information.
>
Nit: s/Then, add/Add
Show 27 quoted lines
>
> Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> Helped-by: Junio C Hamano <gitster@pobox.com>
> Helped-by: Justin Tobler <jltobler@gmail.com>
> Mentored-by: Karthik Nayak <karthik.188@gmail.com>
> Mentored-by: Patrick Steinhardt <ps@pks.im>
> Signed-off-by: Lucas Seiki Oshiro <lucasseikioshiro@gmail.com>
> ---
>  Documentation/git-repo.adoc |  4 ++
>  builtin/repo.c              | 92 +++++++++++++++++++++++++++++++++++--
>  t/meson.build               |  1 +
>  t/t1900-repo.sh             | 47 +++++++++++++++++++
>  4 files changed, 140 insertions(+), 4 deletions(-)
>  create mode 100755 t/t1900-repo.sh
>
> diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc
> index 6f8fe3f6ea..b7af6f45a4 100644
> --- a/Documentation/git-repo.adoc
> +++ b/Documentation/git-repo.adoc
> @@ -45,6 +45,10 @@ INFO KEYS
>  The set of data that `git repo` can return is grouped into the following
>  categories:
>
> +`references`::
> +Reference-related data:
> +* `format`: the reference storage format, either `files` or `reftable`.
> +
Nit: I would omit the '`files` or `reftable`' here, because while this
is currently true. This might not hold up in the future. So better to
not go into the details of the supported systems.
Show 28 quoted lines
>  SEE ALSO
>  --------
>  linkgit:git-rev-parse[1]
> diff --git a/builtin/repo.c b/builtin/repo.c
> index a1787a3cc5..dcda0d6d61 100644
> --- a/builtin/repo.c
> +++ b/builtin/repo.c
> @@ -1,11 +1,95 @@
>  #include "builtin.h"
>  #include "parse-options.h"
> +#include "strbuf.h"
> +#include "refs.h"
>
> -static int repo_info(int argc UNUSED,
> -		     const char **argv UNUSED,
> +typedef void add_field_fn(struct strbuf *buf, struct repository *repo);
> +
> +struct field {
> +	const char *key;
> +	add_field_fn *add_field_callback;
> +};
> +
> +static void add_string(struct strbuf *buf,
> +		       const char *key, const char *value)
> +{
> +	strbuf_addf(buf, "%s\n%s%c", key, value, '\0');
> +}
> +

I like the table design used here, makes things much simpler. I do think that each field shouldn't worry about the formatting, in fact, I would say that we can move all of this logic to `print_fields`.

So each field would only be incharge of providing the output data. Then `print_fields` would take the key, the output data and format it as needed. This would also make it much easier to use a new format if needed in the future.

Show 84 quoted lines
> +static void add_references_format(struct strbuf *buf,
> +				  struct repository *repo)
> +{
> +	add_string(buf, "references.format",
> +		   ref_storage_format_to_name(repo->ref_storage_format));
> +}
> +
> +// repo_info_fields keys should be in lexicographical order
> +static const struct field repo_info_fields[] = {
> +	{"references.format", add_references_format},
> +};
> +
> +static int repo_info_fields_cmp(const void *va, const void *vb)
> +{
> +	const struct field *a = va;
> +	const struct field *b = vb;
> +
> +	return strcmp(a->key, b->key);
> +}
> +
> +static add_field_fn *get_append_callback(const char *key) {
> +	const struct field search_key = {key, NULL};
> +	const struct field *found = bsearch(&search_key, repo_info_fields,
> +					    ARRAY_SIZE(repo_info_fields),
> +					    sizeof(struct field),
> +					    repo_info_fields_cmp);
> +	return found ? found->add_field_callback : NULL;
> +}
> +
> +static int qsort_strcmp(const void *va, const void *vb)
> +{
> +	const char *a = *(const char **)va;
> +	const char *b = *(const char **)vb;
> +
> +	return strcmp(a, b);
> +}
> +
> +static void print_fields(int argc, const char **argv, struct repository *repo) {
> +	const char *last = "";
> +	struct strbuf buf;
> +	strbuf_init(&buf, 256);
> +
> +	QSORT(argv, argc, qsort_strcmp);
> +
> +	for (int i = 0; i < argc; i++) {
> +		add_field_fn *callback;
> +		const char *key = argv[i];
> +
> +		if (!strcmp(key, last))
> +			continue;
> +
> +		callback = get_append_callback(key);
> +
> +		if (!callback) {
> +			error("key %s not found", key);
> +			strbuf_release(&buf);
> +			exit(1);
> +		}
> +
> +		callback(&buf, repo);
> +		last = key;
> +	}
> +
> +	fwrite(buf.buf, 1, buf.len, stdout);
> +	strbuf_release(&buf);
> +}
> +
> +static int repo_info(int argc,
> +		     const char **argv,
>  		     const char *prefix UNUSED,
> -		     struct repository *repo UNUSED)
> +		     struct repository *repo)
>  {
> +
> +	print_fields(argc - 1 , argv + 1, repo);
>  	return 0;
>  }
>
> @@ -16,7 +100,7 @@ int cmd_repo(int argc,
>  {
>  	parse_opt_subcommand_fn *fn = NULL;
>  	const char *const repo_usage[] = {
> -		"git repo info",
> +		"git repo info [<key>...]",
Shouldn't this be part of the previous commit?
Show 70 quoted lines
>  		NULL
>  	};
>  	struct option options[] = {
> diff --git a/t/meson.build b/t/meson.build
> index 1af289425d..8693e6abc4 100644
> --- a/t/meson.build
> +++ b/t/meson.build
> @@ -245,6 +245,7 @@ integration_tests = [
>    't1700-split-index.sh',
>    't1701-racy-split-index.sh',
>    't1800-hook.sh',
> +  't1900-repo.sh',
>    't2000-conflict-when-checking-files-out.sh',
>    't2002-checkout-cache-u.sh',
>    't2003-checkout-cache-mkdir.sh',
> diff --git a/t/t1900-repo.sh b/t/t1900-repo.sh
> new file mode 100755
> index 0000000000..b80fc6b78b
> --- /dev/null
> +++ b/t/t1900-repo.sh
> @@ -0,0 +1,47 @@
> +#!/bin/sh
> +
> +test_description='test git repo-info'
> +
> +. ./test-lib.sh
> +
> +# Test if a field is correctly returned in the null-terminated format
> +#
> +# Usage: test_repo_info <label> <init command> <key> <expected value>
> +#
> +# Arguments:
> +#   label: the label of the test
> +#   init command: a command that creates a repository called 'repo', configured
> +#      accordingly to what is being tested
> +#   key: the key of the field that is being tested
> +#   expected value: the value that the field should contain
> +test_repo_info () {
> +	label=$1
> +	init_command=$2
> +	key=$3
> +	expected_value=$4
> +
> +	test_expect_success "$label" '
> +		test_when_finished "rm -rf repo" &&
> +		eval "$init_command" &&
> +		echo "$expected_value" | lf_to_nul >expected &&
> +		git -C repo repo info "$key" >output &&
> +		tail -n 1 output >actual &&
> +		test_cmp expected actual
> +	'
> +}
> +
> +test_repo_info 'ref format files is retrieved correctly' '
> +	git init --ref-format=files repo' 'references.format' 'files'
> +
> +test_repo_info 'ref format reftable is retrieved correctly' '
> +	git init --ref-format=reftable repo' 'references.format' 'reftable'
> +
> +test_expect_success "only one value is returned if the same key is requested twice" '
> +	echo "references.format" > expected &&
> +	git rev-parse --show-ref-format > ref-format &&
> +	lf_to_nul <ref-format >>expected &&
> +	git repo info references.format references.format > actual &&
> +	test_cmp expected actual
> +'
> +
> +test_done
> --
> 2.39.5 (Apple Git-154)
Previous: Lucas Seiki OshiroNext: Justin Tobler
Message 88 of 226 in “repo-info: add new command for retrieving repository info”
  1. 0/5 repo-info: add new command for retrieving repository infoLucas Seiki Oshiro, Jun 10, 2025
  2. 1/5 repo-info: declare the repo-info commandLucas Seiki Oshiro, Jun 10, 2025
  3. Karthik NayakJun 11, 2025
  4. 2/5 repo-info: add the --format flagLucas Seiki Oshiro, Jun 10, 2025
  5. Karthik NayakJun 11, 2025
  6. Lucas Seiki OshiroJun 12, 2025
  7. Karthik NayakJun 13, 2025
  8. 3/5 repo-info: add the field references.formatLucas Seiki Oshiro, Jun 10, 2025
  9. Karthik NayakJun 11, 2025
  10. Junio C HamanoJun 12, 2025
  11. 5/5 repo-info: add field layout.shallowLucas Seiki Oshiro, Jun 10, 2025
  12. 4/5 repo-info: add field layout.bareLucas Seiki Oshiro, Jun 10, 2025
  13. Karthik NayakJun 11, 2025
  14. Lucas Seiki OshiroJun 12, 2025
  15. Junio C HamanoJun 12, 2025
  16. Kristoffer HaugsbakkJun 10, 2025
  17. Junio C HamanoJun 10, 2025
  18. Lucas Seiki OshiroJun 12, 2025
  19. Junio C HamanoJun 12, 2025
  20. Lucas Seiki OshiroJun 16, 2025
  21. Junio C HamanoJun 16, 2025
  22. Lucas Seiki OshiroJun 19, 2025
  23. Karthik NayakJun 11, 2025
  24. 0/7 repo-info: add new command for retrieving repository infoLucas Seiki Oshiro, Jun 19, 2025
  25. 1/7 repo-info: declare the repo-info commandLucas Seiki Oshiro, Jun 19, 2025
  26. Karthik NayakJun 20, 2025
  27. Junio C HamanoJun 20, 2025
  28. Karthik NayakJun 23, 2025
  29. Lucas Seiki OshiroJun 23, 2025
  30. Karthik NayakJun 20, 2025
  31. Phillip WoodJun 24, 2025
  32. Patrick SteinhardtJul 3, 2025
  33. Lucas Seiki OshiroJul 4, 2025
  34. Patrick SteinhardtJul 7, 2025
  35. Justin ToblerJul 9, 2025
  36. 2/7 repo-info: add the --format flagLucas Seiki Oshiro, Jun 19, 2025
  37. Karthik NayakJun 20, 2025
  38. Junio C HamanoJun 20, 2025
  39. Patrick SteinhardtJul 3, 2025
  40. 3/7 repo-info: add plaintext as an output formatLucas Seiki Oshiro, Jun 19, 2025
  41. Junio C HamanoJun 20, 2025
  42. Patrick SteinhardtJul 3, 2025
  43. 4/7 repo-info: add the --allow-empty flagLucas Seiki Oshiro, Jun 19, 2025
  44. Karthik NayakJun 20, 2025
  45. Lucas Seiki OshiroJun 23, 2025
  46. Junio C HamanoJun 20, 2025
  47. Karthik NayakJun 23, 2025
  48. Lucas Seiki OshiroJun 23, 2025
  49. 5/7 repo-info: add the field references.formatLucas Seiki Oshiro, Jun 19, 2025
  50. Junio C HamanoJun 20, 2025
  51. Phillip WoodJun 24, 2025
  52. Junio C HamanoJun 24, 2025
  53. Phillip WoodJun 25, 2025
  54. Patrick SteinhardtJul 3, 2025
  55. Lucas Seiki OshiroJul 4, 2025
  56. 6/7 repo-info: add field layout.bareLucas Seiki Oshiro, Jun 19, 2025
  57. Patrick SteinhardtJul 3, 2025
  58. Lucas Seiki OshiroJul 3, 2025
  59. Phillip WoodJul 4, 2025
  60. 7/7 repo-info: add field layout.shallowLucas Seiki Oshiro, Jun 19, 2025
  61. Phillip WoodJun 23, 2025
  62. Lucas Seiki OshiroJun 23, 2025
  63. Phillip WoodJun 24, 2025
  64. Junio C HamanoJun 24, 2025
  65. Lucas Seiki OshiroJul 1, 2025
  66. phillip.wood123@gmail.comJul 2, 2025
  67. 0/5 repo-info: add new command for retrieving repository infoLucas Seiki Oshiro, Jul 6, 2025
  68. 1/5 repo-info: declare the repo-info commandLucas Seiki Oshiro, Jul 6, 2025
  69. 2/5 repo-info: add the --format flagLucas Seiki Oshiro, Jul 6, 2025
  70. 3/5 repo-info: add the field references.formatLucas Seiki Oshiro, Jul 6, 2025
  71. 4/5 repo-info: add field layout.bareLucas Seiki Oshiro, Jul 6, 2025
  72. 5/5 repo-info: add field layout.shallowLucas Seiki Oshiro, Jul 6, 2025
  73. Phillip WoodJul 8, 2025
  74. Lucas Seiki OshiroJul 8, 2025
  75. Phillip WoodJul 10, 2025
  76. Lucas Seiki OshiroJul 11, 2025
  77. Justin ToblerJul 11, 2025
  78. 0/4 repo: add new command for retrieving repository infoLucas Seiki Oshiro, Jul 14, 2025
  79. 1/4 repo: declare the repo commandLucas Seiki Oshiro, Jul 14, 2025
  80. Karthik NayakJul 15, 2025
  81. Patrick SteinhardtJul 15, 2025
  82. Justin ToblerJul 15, 2025
  83. Lucas Seiki OshiroJul 20, 2025
  84. Justin ToblerJul 15, 2025
  85. 2/4 repo: add the field references.formatLucas Seiki Oshiro, Jul 14, 2025
  86. Patrick SteinhardtJul 15, 2025
  87. Lucas Seiki OshiroJul 18, 2025
  88. Karthik NayakJul 15, 2025
  89. Justin ToblerJul 15, 2025
  90. Patrick SteinhardtJul 16, 2025
  91. Justin ToblerJul 16, 2025
  92. Patrick SteinhardtJul 17, 2025
  93. Justin ToblerJul 17, 2025
  94. Lucas Seiki OshiroJul 18, 2025
  95. Justin ToblerJul 21, 2025
  96. 3/4 repo: add field layout.bareLucas Seiki Oshiro, Jul 14, 2025
  97. 4/4 repo: add field layout.shallowLucas Seiki Oshiro, Jul 14, 2025
  98. Oswald BuddenhagenJul 15, 2025
  99. Patrick SteinhardtJul 15, 2025
  100. Oswald BuddenhagenJul 15, 2025
  101. Justin ToblerJul 15, 2025
  102. Junio C HamanoJul 15, 2025
  103. Oswald BuddenhagenJul 17, 2025
  104. Patrick SteinhardtJul 17, 2025
  105. Junio C HamanoJul 16, 2025
  106. Junio C HamanoJul 16, 2025
  107. Lucas Seiki OshiroJul 21, 2025
  108. 0/5 repo: add new command for retrieving repository infoLucas Seiki Oshiro, Jul 22, 2025
  109. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Jul 22, 2025
  110. Karthik NayakJul 22, 2025
  111. Junio C HamanoJul 22, 2025
  112. Lucas Seiki OshiroJul 23, 2025
  113. Junio C HamanoJul 23, 2025
  114. Patrick SteinhardtJul 24, 2025
  115. Junio C HamanoJul 24, 2025
  116. Patrick SteinhardtJul 25, 2025
  117. Lucas Seiki OshiroJul 26, 2025
  118. Junio C HamanoJul 28, 2025
  119. Lucas Seiki OshiroJul 23, 2025
  120. Jean-Noël AVILAJul 23, 2025
  121. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Jul 22, 2025
  122. Karthik NayakJul 22, 2025
  123. Justin ToblerJul 22, 2025
  124. Phillip WoodJul 23, 2025
  125. Lucas Seiki OshiroJul 23, 2025
  126. Lucas Seiki OshiroJul 23, 2025
  127. Patrick SteinhardtJul 24, 2025
  128. 3/5 repo: add field layout.bareLucas Seiki Oshiro, Jul 22, 2025
  129. 4/5 repo: add field layout.shallowLucas Seiki Oshiro, Jul 22, 2025
  130. 5/5 repo: add the --format flagLucas Seiki Oshiro, Jul 22, 2025
  131. Karthik NayakJul 22, 2025
  132. Patrick SteinhardtJul 24, 2025
  133. 0/5 repo: add new command for retrieving repository infoLucas Seiki Oshiro, Jul 27, 2025
  134. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Jul 27, 2025
  135. Eric SunshineJul 27, 2025
  136. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Jul 27, 2025
  137. Eric SunshineJul 27, 2025
  138. Lucas Seiki OshiroJul 31, 2025
  139. Patrick SteinhardtJul 29, 2025
  140. Lucas Seiki OshiroJul 31, 2025
  141. 3/5 repo: add field layout.bareLucas Seiki Oshiro, Jul 27, 2025
  142. 4/5 repo: add field layout.shallowLucas Seiki Oshiro, Jul 27, 2025
  143. Eric SunshineJul 27, 2025
  144. 5/5 repo: add the --format flagLucas Seiki Oshiro, Jul 27, 2025
  145. Eric SunshineJul 27, 2025
  146. Ben KnobleJul 29, 2025
  147. Eric SunshineJul 29, 2025
  148. Ben KnobleJul 29, 2025
  149. Eric SunshineJul 29, 2025
  150. Lucas Seiki OshiroJul 31, 2025
  151. Lucas Seiki OshiroJul 31, 2025
  152. Eric SunshineJul 27, 2025
  153. Patrick SteinhardtJul 29, 2025
  154. Lucas Seiki OshiroJul 30, 2025
  155. 0/5 repo: add new command for retrieving repository infoLucas Seiki Oshiro, Aug 1, 2025
  156. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 1, 2025
  157. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Aug 1, 2025
  158. Eric SunshineAug 1, 2025
  159. Lucas Seiki OshiroAug 3, 2025
  160. 3/5 repo: add the field layout.bareLucas Seiki Oshiro, Aug 1, 2025
  161. Eric SunshineAug 1, 2025
  162. Lucas Seiki OshiroAug 3, 2025
  163. Eric SunshineAug 3, 2025
  164. Patrick SteinhardtAug 5, 2025
  165. 4/5 repo: add the field layout.shallowLucas Seiki Oshiro, Aug 1, 2025
  166. Patrick SteinhardtAug 5, 2025
  167. 5/5 repo: add the --format flagLucas Seiki Oshiro, Aug 1, 2025
  168. Junio C HamanoAug 1, 2025
  169. Jean-Noël AVILAAug 1, 2025
  170. Eric SunshineAug 1, 2025
  171. Patrick SteinhardtAug 5, 2025
  172. Patrick SteinhardtAug 5, 2025
  173. 0/5 repo: add new command for retrieving repository infoLucas Seiki Oshiro, Aug 6, 2025
  174. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 6, 2025
  175. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Aug 6, 2025
  176. Karthik NayakAug 7, 2025
  177. 3/5 repo: add the field layout.bareLucas Seiki Oshiro, Aug 6, 2025
  178. Patrick SteinhardtAug 7, 2025
  179. 4/5 repo: add the field layout.shallowLucas Seiki Oshiro, Aug 6, 2025
  180. 5/5 repo: add the --format flagLucas Seiki Oshiro, Aug 6, 2025
  181. Patrick SteinhardtAug 7, 2025
  182. Junio C HamanoAug 7, 2025
  183. Junio C HamanoAug 6, 2025
  184. Karthik NayakAug 7, 2025
  185. 0/5 repo: add new command for retrieving repository infoLucas Seiki Oshiro, Aug 7, 2025
  186. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 7, 2025
  187. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Aug 7, 2025
  188. Eric SunshineAug 11, 2025
  189. Phillip WoodAug 11, 2025
  190. Junio C HamanoAug 11, 2025
  191. Lucas Seiki OshiroAug 13, 2025
  192. Eric SunshineAug 13, 2025
  193. Lucas Seiki OshiroAug 13, 2025
  194. Phillip WoodAug 14, 2025
  195. 3/5 repo: add the field layout.bareLucas Seiki Oshiro, Aug 7, 2025
  196. Eric SunshineAug 11, 2025
  197. Lucas Seiki OshiroAug 14, 2025
  198. Eric SunshineAug 14, 2025
  199. Junio C HamanoAug 14, 2025
  200. Eric SunshineAug 14, 2025
  201. Junio C HamanoAug 15, 2025
  202. Lucas Seiki OshiroAug 14, 2025
  203. Eric SunshineAug 14, 2025
  204. 4/5 repo: add the field layout.shallowLucas Seiki Oshiro, Aug 7, 2025
  205. 5/5 repo: add the --format flagLucas Seiki Oshiro, Aug 7, 2025
  206. Eric SunshineAug 11, 2025
  207. Patrick SteinhardtAug 8, 2025
  208. Junio C HamanoAug 8, 2025
  209. Karthik NayakAug 8, 2025
  210. 0/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 15, 2025
  211. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 15, 2025
  212. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Aug 15, 2025
  213. Junio C HamanoAug 15, 2025
  214. Lucas Seiki OshiroAug 15, 2025
  215. 3/5 repo: add the field layout.bareLucas Seiki Oshiro, Aug 15, 2025
  216. 4/5 repo: add the field layout.shallowLucas Seiki Oshiro, Aug 15, 2025
  217. Junio C HamanoAug 15, 2025
  218. 5/5 repo: add the --format flagLucas Seiki Oshiro, Aug 15, 2025
  219. Junio C HamanoAug 15, 2025
  220. 0/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 16, 2025
  221. 1/5 repo: declare the repo commandLucas Seiki Oshiro, Aug 16, 2025
  222. 2/5 repo: add the field references.formatLucas Seiki Oshiro, Aug 16, 2025
  223. 3/5 repo: add the field layout.bareLucas Seiki Oshiro, Aug 16, 2025
  224. 4/5 repo: add the field layout.shallowLucas Seiki Oshiro, Aug 16, 2025
  225. 5/5 repo: add the --format flagLucas Seiki Oshiro, Aug 16, 2025
  226. Junio C HamanoAug 17, 2025

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.