@@ -1536,36 +1536,27 @@ char *get_head_description(void)
15361536 struct wt_status_state state ;
15371537 memset (& state , 0 , sizeof (state ));
15381538 wt_status_get_state (the_repository , & state , 1 );
1539-
1540- /*
1541- * The ( character must be hard-coded and not part of a localizable
1542- * string, since the description is used as a sort key and compared
1543- * with ref names.
1544- */
1545- strbuf_addch (& desc , '(' );
15461539 if (state .rebase_in_progress ||
15471540 state .rebase_interactive_in_progress ) {
15481541 if (state .branch )
1549- strbuf_addf (& desc , _ ("no branch, rebasing %s" ),
1542+ strbuf_addf (& desc , _ ("( no branch, rebasing %s) " ),
15501543 state .branch );
15511544 else
1552- strbuf_addf (& desc , _ ("no branch, rebasing detached HEAD %s" ),
1545+ strbuf_addf (& desc , _ ("( no branch, rebasing detached HEAD %s) " ),
15531546 state .detached_from );
15541547 } else if (state .bisect_in_progress )
1555- strbuf_addf (& desc , _ ("no branch, bisect started on %s" ),
1548+ strbuf_addf (& desc , _ ("( no branch, bisect started on %s) " ),
15561549 state .branch );
15571550 else if (state .detached_from ) {
15581551 if (state .detached_at )
1559- strbuf_addstr (& desc , HEAD_DETACHED_AT );
1552+ strbuf_addf (& desc , _ ("(HEAD detached at %s)" ),
1553+ state .detached_from );
15601554 else
1561- strbuf_addstr (& desc , HEAD_DETACHED_FROM );
1562- strbuf_addstr (& desc , state .detached_from );
1563- }
1564- else
1565- strbuf_addstr (& desc , _ ("no branch" ));
1566- strbuf_addch (& desc , ')' );
1555+ strbuf_addf (& desc , _ ("(HEAD detached from %s)" ),
1556+ state .detached_from );
1557+ } else
1558+ strbuf_addstr (& desc , _ ("(no branch)" ));
15671559
1568- wt_status_state_free_buffers (& state );
15691560 return strbuf_detach (& desc , NULL );
15701561}
15711562
@@ -2350,25 +2341,43 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
23502341 return ret ;
23512342}
23522343
2344+ static int compare_detached_head (struct ref_array_item * a , struct ref_array_item * b )
2345+ {
2346+ if (!(a -> kind ^ b -> kind ))
2347+ BUG ("ref_kind_from_refname() should only mark one ref as HEAD" );
2348+ if (a -> kind & FILTER_REFS_DETACHED_HEAD )
2349+ return -1 ;
2350+ else if (b -> kind & FILTER_REFS_DETACHED_HEAD )
2351+ return 1 ;
2352+ BUG ("should have died in the xor check above" );
2353+ return 0 ;
2354+ }
2355+
23532356static int cmp_ref_sorting (struct ref_sorting * s , struct ref_array_item * a , struct ref_array_item * b )
23542357{
23552358 struct atom_value * va , * vb ;
23562359 int cmp ;
2360+ int cmp_detached_head = 0 ;
23572361 cmp_type cmp_type = used_atom [s -> atom ].type ;
2358- int (* cmp_fn )(const char * , const char * );
23592362 struct strbuf err = STRBUF_INIT ;
23602363
23612364 if (get_ref_atom_value (a , s -> atom , & va , & err ))
23622365 die ("%s" , err .buf );
23632366 if (get_ref_atom_value (b , s -> atom , & vb , & err ))
23642367 die ("%s" , err .buf );
23652368 strbuf_release (& err );
2366- cmp_fn = s -> ignore_case ? strcasecmp : strcmp ;
2367- if (s -> version )
2369+ if (s -> sort_flags & REF_SORTING_DETACHED_HEAD_FIRST &&
2370+ ((a -> kind | b -> kind ) & FILTER_REFS_DETACHED_HEAD )) {
2371+ cmp = compare_detached_head (a , b );
2372+ cmp_detached_head = 1 ;
2373+ } else if (s -> sort_flags & REF_SORTING_VERSION ) {
23682374 cmp = versioncmp (va -> s , vb -> s );
2369- else if (cmp_type == FIELD_STR )
2375+ } else if (cmp_type == FIELD_STR ) {
2376+ int (* cmp_fn )(const char * , const char * );
2377+ cmp_fn = s -> sort_flags & REF_SORTING_ICASE
2378+ ? strcasecmp : strcmp ;
23702379 cmp = cmp_fn (va -> s , vb -> s );
2371- else {
2380+ } else {
23722381 if (va -> value < vb -> value )
23732382 cmp = -1 ;
23742383 else if (va -> value == vb -> value )
@@ -2377,7 +2386,8 @@ static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, stru
23772386 cmp = 1 ;
23782387 }
23792388
2380- return (s -> reverse ) ? - cmp : cmp ;
2389+ return (s -> sort_flags & REF_SORTING_REVERSE && !cmp_detached_head )
2390+ ? - cmp : cmp ;
23812391}
23822392
23832393static int compare_refs (const void * a_ , const void * b_ , void * ref_sorting )
@@ -2392,15 +2402,20 @@ static int compare_refs(const void *a_, const void *b_, void *ref_sorting)
23922402 return cmp ;
23932403 }
23942404 s = ref_sorting ;
2395- return s && s -> ignore_case ?
2405+ return s && s -> sort_flags & REF_SORTING_ICASE ?
23962406 strcasecmp (a -> refname , b -> refname ) :
23972407 strcmp (a -> refname , b -> refname );
23982408}
23992409
2400- void ref_sorting_icase_all (struct ref_sorting * sorting , int flag )
2410+ void ref_sorting_set_sort_flags_all (struct ref_sorting * sorting ,
2411+ unsigned int mask , int on )
24012412{
2402- for (; sorting ; sorting = sorting -> next )
2403- sorting -> ignore_case = !!flag ;
2413+ for (; sorting ; sorting = sorting -> next ) {
2414+ if (on )
2415+ sorting -> sort_flags |= mask ;
2416+ else
2417+ sorting -> sort_flags &= ~mask ;
2418+ }
24042419}
24052420
24062421void ref_array_sort (struct ref_sorting * sorting , struct ref_array * array )
@@ -2537,12 +2552,12 @@ void parse_ref_sorting(struct ref_sorting **sorting_tail, const char *arg)
25372552 * sorting_tail = s ;
25382553
25392554 if (* arg == '-' ) {
2540- s -> reverse = 1 ;
2555+ s -> sort_flags |= REF_SORTING_REVERSE ;
25412556 arg ++ ;
25422557 }
25432558 if (skip_prefix (arg , "version:" , & arg ) ||
25442559 skip_prefix (arg , "v:" , & arg ))
2545- s -> version = 1 ;
2560+ s -> sort_flags |= REF_SORTING_VERSION ;
25462561 s -> atom = parse_sorting_atom (arg );
25472562}
25482563
0 commit comments