mirror of
https://github.com/git/git.git
synced 2024-05-10 02:36:08 +02:00
refs: plumb `exclude_patterns` argument throughout
The subsequent patch will want to access an optional `excluded_patterns` array within `refs/packed-backend.c` that will cull out certain references matching any of the given patterns on a best-effort basis. To do so, the refs subsystem needs to be updated to pass this value across a number of different locations. Prepare for a future patch by introducing this plumbing now, passing NULLs at top-level APIs in order to make that patch less noisy and more easily readable. Signed-off-by: Taylor Blau <me@ttaylorr.co> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8255dd8a3d
commit
b269ac53c0
|
@ -193,7 +193,7 @@ int ls_refs(struct repository *r, struct packet_reader *request)
|
|||
strvec_push(&data.prefixes, "");
|
||||
refs_for_each_fullref_in_prefixes(get_main_ref_store(r),
|
||||
get_git_namespace(), data.prefixes.v,
|
||||
send_ref, &data);
|
||||
NULL, send_ref, &data);
|
||||
packet_fflush(stdout);
|
||||
strvec_clear(&data.prefixes);
|
||||
strbuf_release(&data.buf);
|
||||
|
|
|
@ -2215,7 +2215,7 @@ static int for_each_fullref_in_pattern(struct ref_filter *filter,
|
|||
|
||||
return refs_for_each_fullref_in_prefixes(get_main_ref_store(the_repository),
|
||||
NULL, filter->name_patterns,
|
||||
cb, cb_data);
|
||||
NULL, cb, cb_data);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
32
refs.c
32
refs.c
|
@ -1526,7 +1526,9 @@ int head_ref(each_ref_fn fn, void *cb_data)
|
|||
|
||||
struct ref_iterator *refs_ref_iterator_begin(
|
||||
struct ref_store *refs,
|
||||
const char *prefix, int trim,
|
||||
const char *prefix,
|
||||
const char **exclude_patterns,
|
||||
int trim,
|
||||
enum do_for_each_ref_flags flags)
|
||||
{
|
||||
struct ref_iterator *iter;
|
||||
|
@ -1542,8 +1544,7 @@ struct ref_iterator *refs_ref_iterator_begin(
|
|||
}
|
||||
}
|
||||
|
||||
iter = refs->be->iterator_begin(refs, prefix, flags);
|
||||
|
||||
iter = refs->be->iterator_begin(refs, prefix, exclude_patterns, flags);
|
||||
/*
|
||||
* `iterator_begin()` already takes care of prefix, but we
|
||||
* might need to do some trimming:
|
||||
|
@ -1577,7 +1578,7 @@ static int do_for_each_repo_ref(struct repository *r, const char *prefix,
|
|||
if (!refs)
|
||||
return 0;
|
||||
|
||||
iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
|
||||
iter = refs_ref_iterator_begin(refs, prefix, NULL, trim, flags);
|
||||
|
||||
return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
|
||||
}
|
||||
|
@ -1599,6 +1600,7 @@ static int do_for_each_ref_helper(struct repository *r,
|
|||
}
|
||||
|
||||
static int do_for_each_ref(struct ref_store *refs, const char *prefix,
|
||||
const char **exclude_patterns,
|
||||
each_ref_fn fn, int trim,
|
||||
enum do_for_each_ref_flags flags, void *cb_data)
|
||||
{
|
||||
|
@ -1608,7 +1610,8 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix,
|
|||
if (!refs)
|
||||
return 0;
|
||||
|
||||
iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
|
||||
iter = refs_ref_iterator_begin(refs, prefix, exclude_patterns, trim,
|
||||
flags);
|
||||
|
||||
return do_for_each_repo_ref_iterator(the_repository, iter,
|
||||
do_for_each_ref_helper, &hp);
|
||||
|
@ -1616,7 +1619,7 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix,
|
|||
|
||||
int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||
{
|
||||
return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
|
||||
return do_for_each_ref(refs, "", NULL, fn, 0, 0, cb_data);
|
||||
}
|
||||
|
||||
int for_each_ref(each_ref_fn fn, void *cb_data)
|
||||
|
@ -1627,7 +1630,7 @@ int for_each_ref(each_ref_fn fn, void *cb_data)
|
|||
int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
|
||||
each_ref_fn fn, void *cb_data)
|
||||
{
|
||||
return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
|
||||
return do_for_each_ref(refs, prefix, NULL, fn, strlen(prefix), 0, cb_data);
|
||||
}
|
||||
|
||||
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
|
||||
|
@ -1638,13 +1641,14 @@ int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
|
|||
int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
|
||||
{
|
||||
return do_for_each_ref(get_main_ref_store(the_repository),
|
||||
prefix, fn, 0, 0, cb_data);
|
||||
prefix, NULL, fn, 0, 0, cb_data);
|
||||
}
|
||||
|
||||
int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
|
||||
const char **exclude_patterns,
|
||||
each_ref_fn fn, void *cb_data)
|
||||
{
|
||||
return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
|
||||
return do_for_each_ref(refs, prefix, exclude_patterns, fn, 0, 0, cb_data);
|
||||
}
|
||||
|
||||
int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
|
||||
|
@ -1661,14 +1665,14 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
|
|||
int ret;
|
||||
strbuf_addf(&buf, "%srefs/", get_git_namespace());
|
||||
ret = do_for_each_ref(get_main_ref_store(the_repository),
|
||||
buf.buf, fn, 0, 0, cb_data);
|
||||
buf.buf, NULL, fn, 0, 0, cb_data);
|
||||
strbuf_release(&buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
|
||||
{
|
||||
return do_for_each_ref(refs, "", fn, 0,
|
||||
return do_for_each_ref(refs, "", NULL, fn, 0,
|
||||
DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
|
||||
}
|
||||
|
||||
|
@ -1738,6 +1742,7 @@ static void find_longest_prefixes(struct string_list *out,
|
|||
int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
|
||||
const char *namespace,
|
||||
const char **patterns,
|
||||
const char **exclude_patterns,
|
||||
each_ref_fn fn, void *cb_data)
|
||||
{
|
||||
struct string_list prefixes = STRING_LIST_INIT_DUP;
|
||||
|
@ -1753,7 +1758,8 @@ int refs_for_each_fullref_in_prefixes(struct ref_store *ref_store,
|
|||
|
||||
for_each_string_list_item(prefix, &prefixes) {
|
||||
strbuf_addstr(&buf, prefix->string);
|
||||
ret = refs_for_each_fullref_in(ref_store, buf.buf, fn, cb_data);
|
||||
ret = refs_for_each_fullref_in(ref_store, buf.buf,
|
||||
exclude_patterns, fn, cb_data);
|
||||
if (ret)
|
||||
break;
|
||||
strbuf_setlen(&buf, namespace_len);
|
||||
|
@ -2408,7 +2414,7 @@ int refs_verify_refname_available(struct ref_store *refs,
|
|||
strbuf_addstr(&dirname, refname + dirname.len);
|
||||
strbuf_addch(&dirname, '/');
|
||||
|
||||
iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
|
||||
iter = refs_ref_iterator_begin(refs, dirname.buf, NULL, 0,
|
||||
DO_FOR_EACH_INCLUDE_BROKEN);
|
||||
while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
|
||||
if (skip &&
|
||||
|
|
8
refs.h
8
refs.h
|
@ -338,6 +338,7 @@ int for_each_ref(each_ref_fn fn, void *cb_data);
|
|||
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data);
|
||||
|
||||
int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
|
||||
const char **exclude_patterns,
|
||||
each_ref_fn fn, void *cb_data);
|
||||
int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data);
|
||||
|
||||
|
@ -345,10 +346,15 @@ int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data);
|
|||
* iterate all refs in "patterns" by partitioning patterns into disjoint sets
|
||||
* and iterating the longest-common prefix of each set.
|
||||
*
|
||||
* references matching any pattern in "exclude_patterns" are omitted from the
|
||||
* result set on a best-effort basis.
|
||||
*
|
||||
* callers should be prepared to ignore references that they did not ask for.
|
||||
*/
|
||||
int refs_for_each_fullref_in_prefixes(struct ref_store *refs,
|
||||
const char *namespace, const char **patterns,
|
||||
const char *namespace,
|
||||
const char **patterns,
|
||||
const char **exclude_patterns,
|
||||
each_ref_fn fn, void *cb_data);
|
||||
|
||||
/**
|
||||
|
|
|
@ -229,11 +229,12 @@ static struct ref_iterator_vtable debug_ref_iterator_vtable = {
|
|||
|
||||
static struct ref_iterator *
|
||||
debug_ref_iterator_begin(struct ref_store *ref_store, const char *prefix,
|
||||
unsigned int flags)
|
||||
const char **exclude_patterns, unsigned int flags)
|
||||
{
|
||||
struct debug_ref_store *drefs = (struct debug_ref_store *)ref_store;
|
||||
struct ref_iterator *res =
|
||||
drefs->refs->be->iterator_begin(drefs->refs, prefix, flags);
|
||||
drefs->refs->be->iterator_begin(drefs->refs, prefix,
|
||||
exclude_patterns, flags);
|
||||
struct debug_ref_iterator *diter = xcalloc(1, sizeof(*diter));
|
||||
base_ref_iterator_init(&diter->base, &debug_ref_iterator_vtable, 1);
|
||||
diter->iter = res;
|
||||
|
|
|
@ -829,7 +829,8 @@ static struct ref_iterator_vtable files_ref_iterator_vtable = {
|
|||
|
||||
static struct ref_iterator *files_ref_iterator_begin(
|
||||
struct ref_store *ref_store,
|
||||
const char *prefix, unsigned int flags)
|
||||
const char *prefix, const char **exclude_patterns,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct files_ref_store *refs;
|
||||
struct ref_iterator *loose_iter, *packed_iter, *overlay_iter;
|
||||
|
@ -874,7 +875,7 @@ static struct ref_iterator *files_ref_iterator_begin(
|
|||
* the packed and loose references.
|
||||
*/
|
||||
packed_iter = refs_ref_iterator_begin(
|
||||
refs->packed_ref_store, prefix, 0,
|
||||
refs->packed_ref_store, prefix, exclude_patterns, 0,
|
||||
DO_FOR_EACH_INCLUDE_BROKEN);
|
||||
|
||||
overlay_iter = overlay_ref_iterator_begin(loose_iter, packed_iter);
|
||||
|
|
|
@ -924,7 +924,8 @@ static struct ref_iterator_vtable packed_ref_iterator_vtable = {
|
|||
|
||||
static struct ref_iterator *packed_ref_iterator_begin(
|
||||
struct ref_store *ref_store,
|
||||
const char *prefix, unsigned int flags)
|
||||
const char *prefix, const char **exclude_patterns,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct packed_ref_store *refs;
|
||||
struct snapshot *snapshot;
|
||||
|
@ -1149,7 +1150,7 @@ static int write_with_updates(struct packed_ref_store *refs,
|
|||
* list of refs is exhausted, set iter to NULL. When the list
|
||||
* of updates is exhausted, leave i set to updates->nr.
|
||||
*/
|
||||
iter = packed_ref_iterator_begin(&refs->base, "",
|
||||
iter = packed_ref_iterator_begin(&refs->base, "", NULL,
|
||||
DO_FOR_EACH_INCLUDE_BROKEN);
|
||||
if ((ok = ref_iterator_advance(iter)) != ITER_OK)
|
||||
iter = NULL;
|
||||
|
|
|
@ -367,8 +367,8 @@ int is_empty_ref_iterator(struct ref_iterator *ref_iterator);
|
|||
*/
|
||||
struct ref_iterator *refs_ref_iterator_begin(
|
||||
struct ref_store *refs,
|
||||
const char *prefix, int trim,
|
||||
enum do_for_each_ref_flags flags);
|
||||
const char *prefix, const char **exclude_patterns,
|
||||
int trim, enum do_for_each_ref_flags flags);
|
||||
|
||||
/*
|
||||
* A callback function used to instruct merge_ref_iterator how to
|
||||
|
@ -570,7 +570,8 @@ typedef int copy_ref_fn(struct ref_store *ref_store,
|
|||
*/
|
||||
typedef struct ref_iterator *ref_iterator_begin_fn(
|
||||
struct ref_store *ref_store,
|
||||
const char *prefix, unsigned int flags);
|
||||
const char *prefix, const char **exclude_patterns,
|
||||
unsigned int flags);
|
||||
|
||||
/* reflog functions */
|
||||
|
||||
|
|
|
@ -2670,7 +2670,7 @@ static int for_each_bisect_ref(struct ref_store *refs, each_ref_fn fn,
|
|||
struct strbuf bisect_refs = STRBUF_INIT;
|
||||
int status;
|
||||
strbuf_addf(&bisect_refs, "refs/bisect/%s", term);
|
||||
status = refs_for_each_fullref_in(refs, bisect_refs.buf, fn, cb_data);
|
||||
status = refs_for_each_fullref_in(refs, bisect_refs.buf, NULL, fn, cb_data);
|
||||
strbuf_release(&bisect_refs);
|
||||
return status;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue