refs: redefine special refs

Now that our list of special refs really only contains refs which have
actually-special semantics, let's redefine what makes a special ref.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Patrick Steinhardt 2024-01-19 11:40:24 +01:00 committed by Junio C Hamano
parent 3f921c7591
commit 2cd33f4428
1 changed files with 7 additions and 26 deletions

33
refs.c
View File

@ -1839,13 +1839,10 @@ done:
static int is_special_ref(const char *refname) static int is_special_ref(const char *refname)
{ {
/* /*
* Special references get written and read directly via the filesystem * Special references are refs that have different semantics compared
* by the subsystems that create them. Thus, they must not go through * to "normal" refs. These refs can thus not be stored in the ref
* the reference backend but must instead be read directly. It is * backend, but must always be accessed via the filesystem. The
* arguable whether this behaviour is sensible, or whether it's simply * following refs are special:
* a leaky abstraction enabled by us only having a single reference
* backend implementation. But at least for a subset of references it
* indeed does make sense to treat them specially:
* *
* - FETCH_HEAD may contain multiple object IDs, and each one of them * - FETCH_HEAD may contain multiple object IDs, and each one of them
* carries additional metadata like where it came from. * carries additional metadata like where it came from.
@ -1853,25 +1850,9 @@ static int is_special_ref(const char *refname)
* - MERGE_HEAD may contain multiple object IDs when merging multiple * - MERGE_HEAD may contain multiple object IDs when merging multiple
* heads. * heads.
* *
* There are some exceptions that you might expect to see on this list * Reading, writing or deleting references must consistently go either
* but which are handled exclusively via the reference backend: * through the filesystem (special refs) or through the reference
* * backend (normal ones).
* - BISECT_EXPECTED_REV
*
* - CHERRY_PICK_HEAD
*
* - HEAD
*
* - ORIG_HEAD
*
* - "rebase-apply/" and "rebase-merge/" contain all of the state for
* rebases, including some reference-like files. These are
* exclusively read and written via the filesystem and never go
* through the refdb.
*
* Writing or deleting references must consistently go either through
* the filesystem (special refs) or through the reference backend
* (normal ones).
*/ */
static const char * const special_refs[] = { static const char * const special_refs[] = {
"FETCH_HEAD", "FETCH_HEAD",