refs: introduce get_worktree_ref_store()
files-backend at this point is still aware of the per-repo/worktree separation in refs, so it can handle a linked worktree. Some refs operations are known not working when current files-backend is used in a linked worktree (e.g. reflog). Tests will be written when refs_* functions start to be called with worktree backend to verify that they work as expected. Note: accessing a worktree of a submodule remains unaddressed. Perhaps after get_worktrees() can access submodule (or rather a new function get_submodule_worktrees(), that lists worktrees of a submodule), we can update this function to work with submodules as well. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0d8a814d8a
commit
17eff96b83
30
refs.c
30
refs.c
@ -10,6 +10,7 @@
|
|||||||
#include "object.h"
|
#include "object.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "submodule.h"
|
#include "submodule.h"
|
||||||
|
#include "worktree.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* List of all available backends
|
* List of all available backends
|
||||||
@ -1486,6 +1487,9 @@ static struct ref_store *main_ref_store;
|
|||||||
/* A hashmap of ref_stores, stored by submodule name: */
|
/* A hashmap of ref_stores, stored by submodule name: */
|
||||||
static struct hashmap submodule_ref_stores;
|
static struct hashmap submodule_ref_stores;
|
||||||
|
|
||||||
|
/* A hashmap of ref_stores, stored by worktree id: */
|
||||||
|
static struct hashmap worktree_ref_stores;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Look up a ref store by name. If that ref_store hasn't been
|
* Look up a ref store by name. If that ref_store hasn't been
|
||||||
* registered yet, return NULL.
|
* registered yet, return NULL.
|
||||||
@ -1586,6 +1590,32 @@ struct ref_store *get_submodule_ref_store(const char *submodule)
|
|||||||
return refs;
|
return refs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ref_store *get_worktree_ref_store(const struct worktree *wt)
|
||||||
|
{
|
||||||
|
struct ref_store *refs;
|
||||||
|
const char *id;
|
||||||
|
|
||||||
|
if (wt->is_current)
|
||||||
|
return get_main_ref_store();
|
||||||
|
|
||||||
|
id = wt->id ? wt->id : "/";
|
||||||
|
refs = lookup_ref_store_map(&worktree_ref_stores, id);
|
||||||
|
if (refs)
|
||||||
|
return refs;
|
||||||
|
|
||||||
|
if (wt->id)
|
||||||
|
refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
|
||||||
|
REF_STORE_ALL_CAPS);
|
||||||
|
else
|
||||||
|
refs = ref_store_init(get_git_common_dir(),
|
||||||
|
REF_STORE_ALL_CAPS);
|
||||||
|
|
||||||
|
if (refs)
|
||||||
|
register_ref_store_map(&worktree_ref_stores, "worktree",
|
||||||
|
refs, id);
|
||||||
|
return refs;
|
||||||
|
}
|
||||||
|
|
||||||
void base_ref_store_init(struct ref_store *refs,
|
void base_ref_store_init(struct ref_store *refs,
|
||||||
const struct ref_storage_be *be)
|
const struct ref_storage_be *be)
|
||||||
{
|
{
|
||||||
|
2
refs.h
2
refs.h
@ -5,6 +5,7 @@ struct object_id;
|
|||||||
struct ref_store;
|
struct ref_store;
|
||||||
struct strbuf;
|
struct strbuf;
|
||||||
struct string_list;
|
struct string_list;
|
||||||
|
struct worktree;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Resolve a reference, recursively following symbolic refererences.
|
* Resolve a reference, recursively following symbolic refererences.
|
||||||
@ -655,5 +656,6 @@ struct ref_store *get_main_ref_store(void);
|
|||||||
* submodule==NULL.
|
* submodule==NULL.
|
||||||
*/
|
*/
|
||||||
struct ref_store *get_submodule_ref_store(const char *submodule);
|
struct ref_store *get_submodule_ref_store(const char *submodule);
|
||||||
|
struct ref_store *get_worktree_ref_store(const struct worktree *wt);
|
||||||
|
|
||||||
#endif /* REFS_H */
|
#endif /* REFS_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user