Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > +static int compare_detached_head(struct ref_array_item *a, struct ref_array_item *b) > +{ > + if (a->kind & FILTER_REFS_DETACHED_HEAD) > + return -1; > + else if (b->kind & FILTER_REFS_DETACHED_HEAD) > + return 1; > + BUG("compare_detached_head() is guarded by an xor on [ab]->kind & FILTER_REFS_DETACHED_HEAD"); > + return 0; > +} OK. > +void ref_sorting_detached_head_first_all(struct ref_sorting *sorting, int flag) > +{ > + for (; sorting; sorting = sorting->next) > + sorting->detached_head_first = !!flag; > +} This, taken together with existing ref_sorting_icase_all(), looks somewhat ugly, especially when you ponder how you would add a third similar option to the mix. Perhaps "ignore_case" and "detached_head_first" shouldn't be separate bitfields, but bits in the same flag word member in the "struct ref_sorting", and "set/unset these flags to all the sort ops" helper function should just take a flags word that has two bits? Or maybe it is good enough for now. I hesitate to say so myself, though, after already saying it is "somewhat ugly" ;-) > void ref_array_sort(struct ref_sorting *sorting, struct ref_array *array) > { > QSORT_S(array->items, array->nr, compare_refs, sorting); > diff --git a/ref-filter.h b/ref-filter.h > index feaef4a8fde..3b92e0f2696 100644 > --- a/ref-filter.h > +++ b/ref-filter.h > @@ -30,6 +30,7 @@ struct ref_sorting { > int atom; /* index into used_atom array (internal) */ > unsigned reverse : 1, > ignore_case : 1, > + detached_head_first : 1, > version : 1; > }; > > @@ -111,6 +112,8 @@ int verify_ref_format(struct ref_format *format); > void ref_array_sort(struct ref_sorting *sort, struct ref_array *array); > /* Set the ignore_case flag for all elements of a sorting list */ > void ref_sorting_icase_all(struct ref_sorting *sorting, int flag); > +/* Set the detached_head_first flag for all elements of a sorting list */ > +void ref_sorting_detached_head_first_all(struct ref_sorting *sorting, int flag); > /* Based on the given format and quote_style, fill the strbuf */ > int format_ref_array_item(struct ref_array_item *info, > const struct ref_format *format,