From 0c09ec07d1e617be5f2d7b5c937b60e77a30ede2 Mon Sep 17 00:00:00 2001 From: David Turner Date: Sun, 4 Sep 2016 18:08:44 +0200 Subject: refs: implement iteration over only per-worktree refs Alternate refs backends might still use files to store per-worktree refs. So provide a way to iterate over only the per-worktree references in a ref_store. The other backend can set up a files ref_store and iterate using the new DO_FOR_EACH_PER_WORKTREE_ONLY flag when iterating. Signed-off-by: David Turner Signed-off-by: Junio C Hamano Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano --- refs/files-backend.c | 4 ++++ refs/refs-internal.h | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'refs') diff --git a/refs/files-backend.c b/refs/files-backend.c index 82b3ac0dbc..47710fcf28 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1798,6 +1798,10 @@ static int files_ref_iterator_advance(struct ref_iterator *ref_iterator) int ok; while ((ok = ref_iterator_advance(iter->iter0)) == ITER_OK) { + if (iter->flags & DO_FOR_EACH_PER_WORKTREE_ONLY && + ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE) + continue; + if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) && !ref_resolves_to_object(iter->iter0->refname, iter->iter0->oid, diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 681982becd..708b26082a 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -467,10 +467,18 @@ extern struct ref_iterator *current_ref_iter; int do_for_each_ref_iterator(struct ref_iterator *iter, each_ref_fn fn, void *cb_data); -/* refs backends */ +/* + * Only include per-worktree refs in a do_for_each_ref*() iteration. + * Normally this will be used with a files ref_store, since that's + * where all reference backends will presumably store their + * per-worktree refs. + */ +#define DO_FOR_EACH_PER_WORKTREE_ONLY 0x02 struct ref_store; +/* refs backends */ + /* * Initialize the ref_store for the specified submodule, or for the * main repository if submodule == NULL. These functions should call -- cgit v1.2.3