refs.h: implement `hidden_refs_to_excludes()`
In subsequent commits, we'll teach `receive-pack` and `upload-pack` to use the new jump list feature in the packed-refs iterator by ignoring references which are mentioned via its respective hideRefs lists. However, the packed-ref jump lists cannot handle un-hiding rules (that begin with '!'), or namespace comparisons (that begin with '^'). Add a convenience function to the refs.h API to detect when either of these conditions are met, and returns an appropriate value to pass as excluded patterns. Suggested-by: Jeff King <peff@peff.net> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
e6bf24d39a
commit
15af64dcfd
24
refs.c
24
refs.c
|
@ -1480,6 +1480,30 @@ int ref_is_hidden(const char *refname, const char *refname_full,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char **hidden_refs_to_excludes(const struct strvec *hide_refs)
|
||||||
|
{
|
||||||
|
const char **pattern;
|
||||||
|
for (pattern = hide_refs->v; *pattern; pattern++) {
|
||||||
|
/*
|
||||||
|
* We can't feed any excludes from hidden refs config
|
||||||
|
* sections, since later rules may override previous
|
||||||
|
* ones. For example, with rules "refs/foo" and
|
||||||
|
* "!refs/foo/bar", we should show "refs/foo/bar" (and
|
||||||
|
* everything underneath it), but the earlier exclusion
|
||||||
|
* would cause us to skip all of "refs/foo". We
|
||||||
|
* likewise don't implement the namespace stripping
|
||||||
|
* required for '^' rules.
|
||||||
|
*
|
||||||
|
* Both are possible to do, but complicated, so avoid
|
||||||
|
* populating the jump list at all if we see either of
|
||||||
|
* these patterns.
|
||||||
|
*/
|
||||||
|
if (**pattern == '!' || **pattern == '^')
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return hide_refs->v;
|
||||||
|
}
|
||||||
|
|
||||||
const char *find_descendant_ref(const char *dirname,
|
const char *find_descendant_ref(const char *dirname,
|
||||||
const struct string_list *extras,
|
const struct string_list *extras,
|
||||||
const struct string_list *skip)
|
const struct string_list *skip)
|
||||||
|
|
6
refs.h
6
refs.h
|
@ -831,6 +831,12 @@ int parse_hide_refs_config(const char *var, const char *value, const char *,
|
||||||
*/
|
*/
|
||||||
int ref_is_hidden(const char *, const char *, const struct strvec *);
|
int ref_is_hidden(const char *, const char *, const struct strvec *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns an array of patterns to use as excluded_patterns, if none of the
|
||||||
|
* hidden references use the token '!' or '^'.
|
||||||
|
*/
|
||||||
|
const char **hidden_refs_to_excludes(const struct strvec *hide_refs);
|
||||||
|
|
||||||
/* Is this a per-worktree ref living in the refs/ namespace? */
|
/* Is this a per-worktree ref living in the refs/ namespace? */
|
||||||
int is_per_worktree_ref(const char *refname);
|
int is_per_worktree_ref(const char *refname);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue