On Fri, Jul 31, 2015 at 1:06 PM, David Turner <dturner@xxxxxxxxxxxxxxxx> wrote: > Add a function ref_type, which categorizes refs as per-worktree, > pseudoref, or normal ref. For per-worktree refs, you probably should follow common_list[] in path.c because that's how file-based ref namespace is splitted between per-repo and per-worktree, even though just as simple as "everything outside refs/ is per-worktree" (with an exception of NOTES_MERGE_REF, which should be on the list as well). At least the two should be aligned so that the default file-based backend works the same way as new backends. Going further, I think you need to pass the "worktree identifier" to ref backend, at least in ref_transaction_begin_fn. Each backend is free to store per-worktree refs however it wants. Of course if I ask for refs/foo of worktree A, you should not return me refs/foo of worktree B. ref_transaction_begin_fn can return a fault code if it does not support multiple worktrees, which is fine. > Later, we will use this in refs.c to treat pseudorefs specially. > Alternate ref backends may use it to treat both pseudorefs and > per-worktree refs differently. I'm not so sure that this can't be hidden behind backends and they can have total control on falling back to file-based, or store them in some secondary storage. I haven't re-read your discussion with Junio yet (only skimmed through long ago) so I may be missing some important points. > > Signed-off-by: David Turner <dturner@xxxxxxxxxxxxxxxx> > --- > refs.c | 26 ++++++++++++++++++++++++++ > refs.h | 8 ++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/refs.c b/refs.c > index 0b96ece..0f87884 100644 > --- a/refs.c > +++ b/refs.c > @@ -2848,6 +2848,32 @@ static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err) > return 0; > } > > +static int is_per_worktree_ref(const char *refname) > +{ > + return !strcmp(refname, "HEAD"); > +} > + > +static int is_pseudoref_syntax(const char *refname) > +{ > + const char *c; > + > + for (c = refname; *c; c++) { > + if (!isupper(*c) && *c != '-' && *c != '_') > + return 0; > + } > + > + return 1; > +} > + > +enum ref_type ref_type(const char *refname) > +{ > + if (is_per_worktree_ref(refname)) > + return REF_TYPE_PER_WORKTREE; > + if (is_pseudoref_syntax(refname)) > + return REF_TYPE_PSEUDOREF; > + return REF_TYPE_NORMAL; > +} > + > int delete_ref(const char *refname, const unsigned char *old_sha1, > unsigned int flags) > { > diff --git a/refs.h b/refs.h > index e4e46c3..dca4fb5 100644 > --- a/refs.h > +++ b/refs.h > @@ -445,6 +445,14 @@ extern int parse_hide_refs_config(const char *var, const char *value, const char > > extern int ref_is_hidden(const char *); > > +enum ref_type { > + REF_TYPE_PER_WORKTREE, > + REF_TYPE_PSEUDOREF, > + REF_TYPE_NORMAL, > +}; > + > +enum ref_type ref_type(const char *refname); > + > enum expire_reflog_flags { > EXPIRE_REFLOGS_DRY_RUN = 1 << 0, > EXPIRE_REFLOGS_UPDATE_REF = 1 << 1, > -- > 2.0.4.315.gad8727a-twtrsrc > > -- > To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Duy -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html