Merge branch 'ps/ref-filter-sort'
Teaches the ref-filter machinery to recognize and avoid cases where sorting would be redundant. * ps/ref-filter-sort: ref-filter: format iteratively with lexicographic refname sorting
This commit is contained in:
29
ref-filter.c
29
ref-filter.c
@ -3244,21 +3244,40 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ref_sorting {
|
||||||
|
struct ref_sorting *next;
|
||||||
|
int atom; /* index into used_atom array (internal) */
|
||||||
|
enum ref_sorting_order sort_flags;
|
||||||
|
};
|
||||||
|
|
||||||
static inline int can_do_iterative_format(struct ref_filter *filter,
|
static inline int can_do_iterative_format(struct ref_filter *filter,
|
||||||
struct ref_sorting *sorting,
|
struct ref_sorting *sorting,
|
||||||
struct ref_format *format)
|
struct ref_format *format)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Reference backends sort patterns lexicographically by refname, so if
|
||||||
|
* the sorting options ask for exactly that we are able to do iterative
|
||||||
|
* formatting.
|
||||||
|
*
|
||||||
|
* Note that we do not have to worry about multiple name patterns,
|
||||||
|
* either. Those get sorted and deduplicated eventually in
|
||||||
|
* `refs_for_each_fullref_in_prefixes()`, so we return names in the
|
||||||
|
* correct ordering here, too.
|
||||||
|
*/
|
||||||
|
if (sorting && (sorting->next ||
|
||||||
|
sorting->sort_flags ||
|
||||||
|
used_atom[sorting->atom].atom_type != ATOM_REFNAME))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Filtering & formatting results within a single ref iteration
|
* Filtering & formatting results within a single ref iteration
|
||||||
* callback is not compatible with options that require
|
* callback is not compatible with options that require
|
||||||
* post-processing a filtered ref_array. These include:
|
* post-processing a filtered ref_array. These include:
|
||||||
* - filtering on reachability
|
* - filtering on reachability
|
||||||
* - sorting the filtered results
|
|
||||||
* - including ahead-behind information in the formatted output
|
* - including ahead-behind information in the formatted output
|
||||||
*/
|
*/
|
||||||
return !(filter->reachable_from ||
|
return !(filter->reachable_from ||
|
||||||
filter->unreachable_from ||
|
filter->unreachable_from ||
|
||||||
sorting ||
|
|
||||||
format->bases.nr ||
|
format->bases.nr ||
|
||||||
format->is_base_tips.nr);
|
format->is_base_tips.nr);
|
||||||
}
|
}
|
||||||
@ -3316,12 +3335,6 @@ static int memcasecmp(const void *vs1, const void *vs2, size_t n)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ref_sorting {
|
|
||||||
struct ref_sorting *next;
|
|
||||||
int atom; /* index into used_atom array (internal) */
|
|
||||||
enum ref_sorting_order sort_flags;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
|
static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
|
||||||
{
|
{
|
||||||
struct atom_value *va, *vb;
|
struct atom_value *va, *vb;
|
||||||
|
Reference in New Issue
Block a user