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

Re: [PATCH v5 2/4] refs: forward and use the reference storage payload

From
Patrick Steinhardt <ps@pks.im>
Date
Feb 9, 2026, 16:34 UTC
Message-ID
<aYoMdqDDbt-BArQQ@pks.im>
In-Reply-To
<20260209-kn-alternate-ref-dir-v5-2-740899834ceb@gmail.com>
On Mon, Feb 09, 2026 at 04:58:19PM +0100, Karthik Nayak wrote:
Show 9 quoted lines
> An upcoming commit will add support for providing an URI via the
> 'extensions.refStorage' config. The URI will contain the reference
> backend and a corresponding payload. The payload can be then used for
> providing an alternate locations for the reference backend.
> 
> To prepare for this, modify the existing backends to accept such an
> argument when initializing via the 'init()' function. Both the files
> and reftable backends will parse the information to be filesystem paths
> to store references.

Maybe add: "to store references. Given that no callers pass any payload yet this is essentially a no-op change for now."

Show 20 quoted lines
> diff --git a/refs.c b/refs.c
> index 36f3441632..d9df25d7c0 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -3425,3 +3426,33 @@ void refs_create_refdir_stubs(struct repository *repo, const char *refdir,
>  
>  	strbuf_release(&path);
>  }
> +
> +void refs_compute_filesystem_location(const char *gitdir, const char *payload,
> +				      bool *is_worktree, struct strbuf *refdir,
> +				      struct strbuf *ref_common_dir)
> +{
> +	struct strbuf sb = STRBUF_INIT;
> +
> +	strbuf_addstr(refdir, gitdir);
> +	*is_worktree = get_common_dir_noenv(ref_common_dir, gitdir);
> +
> +	if (!payload)
> +		return;

I think you should add a comment here that explains why it's not necessary to modify the `refdir` in case `*is_worktree`. I'd arguably even move that code into `if (!payload)`, as we otherwise only set it to reset it later. So:

        if (!payload) {
                /*
                 * We can use `gitdir` as `refdir` without appending the
                 * worktree path because...
                 /
                 strbuf_addstr(refdir, gitdir);
        }
Show 8 quoted lines
> +	if (!is_absolute_path(payload)) {
> +		strbuf_addf(&sb, "%s/%s", ref_common_dir->buf, payload);
> +		strbuf_realpath(ref_common_dir, sb.buf, 1);
> +	} else {
> +		strbuf_realpath(ref_common_dir, payload, 1);
> +	}
> +
> +	strbuf_reset(refdir);
And then you can drop this call to `strbuf_reset()`.
Show 31 quoted lines
> diff --git a/refs/files-backend.c b/refs/files-backend.c
> index 240d3c3b26..b192ce606d 100644
> --- a/refs/files-backend.c
> +++ b/refs/files-backend.c
> @@ -106,19 +106,24 @@ static void clear_loose_ref_cache(struct files_ref_store *refs)
>   * set of caches.
>   */
>  static struct ref_store *files_ref_store_init(struct repository *repo,
> +					      const char *payload,
>  					      const char *gitdir,
>  					      unsigned int flags)
>  {
>  	struct files_ref_store *refs = xcalloc(1, sizeof(*refs));
>  	struct ref_store *ref_store = (struct ref_store *)refs;
> -	struct strbuf sb = STRBUF_INIT;
> +	struct strbuf ref_common_dir = STRBUF_INIT;
> +	struct strbuf refdir = STRBUF_INIT;
> +	bool is_worktree;
> +
> +	refs_compute_filesystem_location(gitdir, payload, &is_worktree, &refdir,
> +					 &ref_common_dir);
>  
> -	base_ref_store_init(ref_store, repo, gitdir, &refs_be_files);
> +	base_ref_store_init(ref_store, repo, refdir.buf, &refs_be_files);
>  	refs->store_flags = flags;
> -	get_common_dir_noenv(&sb, gitdir);
> -	refs->gitcommondir = strbuf_detach(&sb, NULL);
> +	refs->gitcommondir = strbuf_detach(&ref_common_dir, NULL);
>  	refs->packed_ref_store =
> -		packed_ref_store_init(repo, refs->gitcommondir, flags);
> +		packed_ref_store_init(repo, payload, refs->gitcommondir, flags);

It's a bit weird that we end up passing the payload even though we unconditionally ignore it in `packed_ref_store_init()`. I'd argue that we should either pass a `NULL` pointer as payload, or let the packed backend call `refs_compute_filesystem_location()` itsefl.

Show 12 quoted lines
> diff --git a/refs/packed-backend.c b/refs/packed-backend.c
> index 4ea0c12299..028fbc0585 100644
> --- a/refs/packed-backend.c
> +++ b/refs/packed-backend.c
> @@ -212,6 +212,7 @@ static size_t snapshot_hexsz(const struct snapshot *snapshot)
>  }
>  
>  struct ref_store *packed_ref_store_init(struct repository *repo,
> +					const char *payload UNUSED,
>  					const char *gitdir,
>  					unsigned int store_flags)
>  {

And here we should probably explain why we don't have to respect the payload.

Show 18 quoted lines
> diff --git a/refs/refs-internal.h b/refs/refs-internal.h
> index c7d2a6e50b..bd09b1280c 100644
> --- a/refs/refs-internal.h
> +++ b/refs/refs-internal.h
> @@ -666,4 +667,18 @@ enum ref_transaction_error refs_verify_refnames_available(struct ref_store *refs
>  					  unsigned int initial_transaction,
>  					  struct strbuf *err);
>  
> +/*
> + * Given a gitdir and the reference storage payload provided, retrieve the
> + * 'refdir' and 'ref_common_dir'. The former is where references should be
> + * stored for the current worktree, the latter is the common reference
> + * directory if working with a linked worktree. If working with the main
> + * worktree, both values will be the same.
> + *
> + * This is used by backends such as {files, reftable} which store references in
> + * dedicated filesystem paths.
> + */

I guess we can say "This is used by backends that store store files in the repository directly."

Patrick
Previous: Karthik NayakNext: Karthik Nayak
Message 42 of 101 in “refs: allow setting the reference directory”
  1. 0/2 refs: allow setting the reference directoryKarthik Nayak, Nov 19, 2025
  2. 1/2 refs: support obtaining ref_store for given dirKarthik Nayak, Nov 19, 2025
  3. Justin ToblerNov 20, 2025
  4. Karthik NayakNov 21, 2025
  5. 2/2 refs: add GIT_REF_URI to specify reference backend and directoryKarthik Nayak, Nov 19, 2025
  6. Eric SunshineNov 19, 2025
  7. Karthik NayakNov 19, 2025
  8. Jean-Noël AvilaNov 20, 2025
  9. Karthik NayakNov 21, 2025
  10. Justin ToblerNov 20, 2025
  11. Karthik NayakNov 24, 2025
  12. Toon ClaesNov 21, 2025
  13. Junio C HamanoNov 21, 2025
  14. Karthik NayakNov 24, 2025
  15. Toon ClaesNov 26, 2025
  16. Karthik NayakNov 24, 2025
  17. Patrick SteinhardtDec 1, 2025
  18. Karthik NayakDec 2, 2025
  19. Junio C HamanoNov 23, 2025
  20. Patrick SteinhardtDec 1, 2025
  21. Junio C HamanoDec 2, 2025
  22. Karthik NayakDec 2, 2025
  23. 0/4 refs: allow setting the reference directoryKarthik Nayak, Feb 2, 2026
  24. 1/4 refs: allow reference location in refstorage configKarthik Nayak, Feb 2, 2026
  25. Patrick SteinhardtFeb 6, 2026
  26. Karthik NayakFeb 9, 2026
  27. 2/4 refs: extract out `refs_create_refdir_stubs()`Karthik Nayak, Feb 2, 2026
  28. Patrick SteinhardtFeb 6, 2026
  29. Karthik NayakFeb 9, 2026
  30. 3/4 refs: parse and use the reference storage payloadKarthik Nayak, Feb 2, 2026
  31. Patrick SteinhardtFeb 6, 2026
  32. Karthik NayakFeb 9, 2026
  33. 4/4 refs: add GIT_REFERENCE_BACKEND to specify reference backendKarthik Nayak, Feb 2, 2026
  34. Patrick SteinhardtFeb 6, 2026
  35. Karthik NayakFeb 9, 2026
  36. Patrick SteinhardtFeb 6, 2026
  37. Junio C HamanoFeb 6, 2026
  38. Karthik NayakFeb 9, 2026
  39. 0/4 refs: allow setting the reference directoryKarthik Nayak, Feb 9, 2026
  40. 1/4 refs: extract out `refs_create_refdir_stubs()`Karthik Nayak, Feb 9, 2026
  41. 2/4 refs: forward and use the reference storage payloadKarthik Nayak, Feb 9, 2026
  42. Patrick SteinhardtFeb 9, 2026
  43. Karthik NayakFeb 10, 2026
  44. Jeff KingFeb 10, 2026
  45. Karthik NayakFeb 13, 2026
  46. Jeff KingFeb 15, 2026
  47. 3/4 refs: allow reference location in refstorage configKarthik Nayak, Feb 9, 2026
  48. Patrick SteinhardtFeb 9, 2026
  49. Karthik NayakFeb 10, 2026
  50. Jeff KingFeb 10, 2026
  51. Karthik NayakFeb 11, 2026
  52. 4/4 refs: add GIT_REFERENCE_BACKEND to specify reference backendKarthik Nayak, Feb 9, 2026
  53. Patrick SteinhardtFeb 9, 2026
  54. Junio C HamanoFeb 9, 2026
  55. Karthik NayakFeb 10, 2026
  56. Junio C HamanoFeb 10, 2026
  57. 0/6 refs: allow setting the reference directoryKarthik Nayak, Feb 14, 2026
  58. 1/6 setup: don't modify repo in `create_reference_database()`Karthik Nayak, Feb 14, 2026
  59. Patrick SteinhardtFeb 17, 2026
  60. Karthik NayakFeb 17, 2026
  61. 2/6 refs: extract out `refs_create_refdir_stubs()`Karthik Nayak, Feb 14, 2026
  62. 3/6 refs: receive and use the reference storage payloadKarthik Nayak, Feb 14, 2026
  63. Patrick SteinhardtFeb 17, 2026
  64. Karthik NayakFeb 17, 2026
  65. 4/6 refs: move out stub modification to generic layerKarthik Nayak, Feb 14, 2026
  66. Patrick SteinhardtFeb 17, 2026
  67. Karthik NayakFeb 17, 2026
  68. Toon ClaesFeb 18, 2026
  69. Karthik NayakFeb 19, 2026
  70. 5/6 refs: allow reference location in refstorage configKarthik Nayak, Feb 14, 2026
  71. 6/6 refs: add GIT_REFERENCE_BACKEND to specify reference backendKarthik Nayak, Feb 14, 2026
  72. Patrick SteinhardtFeb 17, 2026
  73. Karthik NayakFeb 17, 2026
  74. Patrick SteinhardtFeb 17, 2026
  75. Toon ClaesFeb 18, 2026
  76. Karthik NayakFeb 19, 2026
  77. 0/6 refs: allow setting the reference directoryKarthik Nayak, Feb 23, 2026
  78. 1/6 setup: don't modify repo in `create_reference_database()`Karthik Nayak, Feb 23, 2026
  79. 2/6 refs: extract out `refs_create_refdir_stubs()`Karthik Nayak, Feb 23, 2026
  80. 3/6 refs: move out stub modification to generic layerKarthik Nayak, Feb 23, 2026
  81. 4/6 refs: receive and use the reference storage payloadKarthik Nayak, Feb 23, 2026
  82. 5/6 refs: allow reference location in refstorage configKarthik Nayak, Feb 23, 2026
  83. Kristoffer HaugsbakkFeb 23, 2026
  84. Karthik NayakFeb 24, 2026
  85. Kristoffer HaugsbakkFeb 24, 2026
  86. Karthik NayakFeb 24, 2026
  87. 6/6 refs: add GIT_REFERENCE_BACKEND to specify reference backendKarthik Nayak, Feb 23, 2026
  88. Toon ClaesFeb 25, 2026
  89. Karthik NayakFeb 25, 2026
  90. Patrick SteinhardtFeb 23, 2026
  91. Karthik NayakFeb 23, 2026
  92. Junio C HamanoFeb 23, 2026
  93. Karthik NayakFeb 25, 2026
  94. 0/6 refs: allow setting the reference directoryKarthik Nayak, Feb 25, 2026
  95. 1/6 setup: don't modify repo in `create_reference_database()`Karthik Nayak, Feb 25, 2026
  96. 2/6 refs: extract out `refs_create_refdir_stubs()`Karthik Nayak, Feb 25, 2026
  97. 3/6 refs: move out stub modification to generic layerKarthik Nayak, Feb 25, 2026
  98. 4/6 refs: receive and use the reference storage payloadKarthik Nayak, Feb 25, 2026
  99. 5/6 refs: allow reference location in refstorage configKarthik Nayak, Feb 25, 2026
  100. Junio C HamanoFeb 25, 2026
  101. 6/6 refs: add GIT_REFERENCE_BACKEND to specify reference backendKarthik Nayak, Feb 25, 2026

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.