diff options
author | Junio C Hamano <gitster@pobox.com> | 2024-01-26 16:54:46 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2024-01-26 16:54:46 (GMT) |
commit | dc8ce995a2ad203ffb5ef335682b64da955e645a (patch) | |
tree | 5fb18d234cc42148bbd37754477fded0bff1cca4 /refs/files-backend.c | |
parent | f95bafbaed2d9f9c891e04c3680c1aa0da30629e (diff) | |
parent | 8f4c00de954f809e83daf8b1425de82561f3721e (diff) | |
download | git-dc8ce995a2ad203ffb5ef335682b64da955e645a.zip git-dc8ce995a2ad203ffb5ef335682b64da955e645a.tar.gz git-dc8ce995a2ad203ffb5ef335682b64da955e645a.tar.bz2 |
Merge branch 'ps/worktree-refdb-initialization'
Instead of manually creating refs/ hierarchy on disk upon a
creation of a secondary worktree, which is only usable via the
files backend, use the refs API to populate it.
* ps/worktree-refdb-initialization:
builtin/worktree: create refdb via ref backend
worktree: expose interface to look up worktree by name
builtin/worktree: move setup of commondir file earlier
refs/files: skip creation of "refs/{heads,tags}" for worktrees
setup: move creation of "refs/" into the files backend
refs: prepare `refs_init_db()` for initializing worktree refs
Diffstat (limited to 'refs/files-backend.c')
-rw-r--r-- | refs/files-backend.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c index b288fc9..75dcc21 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -3218,21 +3218,46 @@ static int files_reflog_expire(struct ref_store *ref_store, return -1; } -static int files_init_db(struct ref_store *ref_store, struct strbuf *err UNUSED) +static int files_init_db(struct ref_store *ref_store, + int flags, + struct strbuf *err UNUSED) { struct files_ref_store *refs = files_downcast(ref_store, REF_STORE_WRITE, "init_db"); struct strbuf sb = STRBUF_INIT; /* - * Create .git/refs/{heads,tags} + * We need to create a "refs" dir in any case so that older versions of + * Git can tell that this is a repository. This serves two main purposes: + * + * - Clients will know to stop walking the parent-directory chain when + * detecting the Git repository. Otherwise they may end up detecting + * a Git repository in a parent directory instead. + * + * - Instead of failing to detect a repository with unknown reference + * format altogether, old clients will print an error saying that + * they do not understand the reference format extension. */ - files_ref_path(refs, &sb, "refs/heads"); + strbuf_addf(&sb, "%s/refs", ref_store->gitdir); safe_create_dir(sb.buf, 1); + adjust_shared_perm(sb.buf); - strbuf_reset(&sb); - files_ref_path(refs, &sb, "refs/tags"); - safe_create_dir(sb.buf, 1); + /* + * There is no need to create directories for common refs when creating + * a worktree ref store. + */ + if (!(flags & REFS_INIT_DB_IS_WORKTREE)) { + /* + * Create .git/refs/{heads,tags} + */ + strbuf_reset(&sb); + files_ref_path(refs, &sb, "refs/heads"); + safe_create_dir(sb.buf, 1); + + strbuf_reset(&sb); + files_ref_path(refs, &sb, "refs/tags"); + safe_create_dir(sb.buf, 1); + } strbuf_release(&sb); return 0; |