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.
---
refs.c | 32 ++++++++++++++++++++++++++++++++
refs.h | 2 ++
2 files changed, 34 insertions(+)
diff --git a/refs.c b/refs.c
index 77a39f8b17..6695140cfe 100644
--- a/refs.c
+++ b/refs.c
@@ -10,6 +10,7 @@
#include "object.h"
#include "tag.h"
#include "submodule.h"
+#include "worktree.h"
/*
* List of all available backends
@@ -1593,6 +1594,37 @@ struct ref_store *get_submodule_ref_store(const char
*submodule)
return refs;
}
+struct ref_store *get_worktree_ref_store(const struct worktree *wt)
+{
+ struct ref_store *refs;
+ unsigned int refs_all_capabilities =
+ REF_STORE_READ | REF_STORE_WRITE |
+ REF_STORE_ODB | REF_STORE_MAIN;
+
+ if (wt->is_current)
+ return get_main_ref_store();
+
+ /*
+ * We share the same hash map with submodules for
+ * now. submodule paths are always relative (to topdir) while
+ * worktree paths are always absolute. No chance of conflict.
+ */
+ refs = lookup_submodule_ref_store(wt->path);
+ if (refs)
+ return refs;
+
+ if (wt->id)
+ refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
+ refs_all_capabilities);
+ else
+ refs = ref_store_init(get_git_common_dir(),
+ refs_all_capabilities);
+
+ if (refs)
+ register_submodule_ref_store(refs, wt->path);
+ return refs;
+}
+
void base_ref_store_init(struct ref_store *refs,
const struct ref_storage_be *be)
{
diff --git a/refs.h b/refs.h
index 49e97d7d5f..6df69a2adb 100644
--- a/refs.h
+++ b/refs.h
@@ -5,6 +5,7 @@ struct object_id;
struct ref_store;
struct strbuf;
struct string_list;
+struct worktree;
/*
* Resolve a reference, recursively following symbolic refererences.
@@ -655,5 +656,6 @@ struct ref_store *get_main_ref_store(void);
* submodule==NULL.
*/
struct ref_store *get_submodule_ref_store(const char *submodule);
+struct ref_store *get_worktree_ref_store(const struct worktree *wt);
#endif /* REFS_H */
--
2.11.0.157.gd943d85