Patrick Steinhardt <ps@xxxxxx> writes: > Move the code to create the directory into the files backend itself to > make it so. This means that future ref backends will also need to have > equivalent logic around to ensure that the directory exists, but it > seems a lot more sensible to have it this way round than to require > callers to create the directory themselves. > Why not move it to refs.c:refs_init_db() instead? this way each implementation doesn't have to do it? @@ -2020,14 +2024,30 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, /* backend functions */ int refs_init_db(struct ref_store *refs, int flags, struct strbuf *err) { + /* + * 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. + */ + safe_create_dir(git_path("refs"), 1); + adjust_shared_perm(git_path("refs")); + return refs->be->init_db(refs, flags, err); }