@@ -1536,36 +1536,27 @@ char *get_head_description(void)
1536
1536
struct wt_status_state state ;
1537
1537
memset (& state , 0 , sizeof (state ));
1538
1538
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 , '(' );
1546
1539
if (state .rebase_in_progress ||
1547
1540
state .rebase_interactive_in_progress ) {
1548
1541
if (state .branch )
1549
- strbuf_addf (& desc , _ ("no branch, rebasing %s" ),
1542
+ strbuf_addf (& desc , _ ("( no branch, rebasing %s) " ),
1550
1543
state .branch );
1551
1544
else
1552
- strbuf_addf (& desc , _ ("no branch, rebasing detached HEAD %s" ),
1545
+ strbuf_addf (& desc , _ ("( no branch, rebasing detached HEAD %s) " ),
1553
1546
state .detached_from );
1554
1547
} 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) " ),
1556
1549
state .branch );
1557
1550
else if (state .detached_from ) {
1558
1551
if (state .detached_at )
1559
- strbuf_addstr (& desc , HEAD_DETACHED_AT );
1552
+ strbuf_addf (& desc , _ ("(HEAD detached at %s)" ),
1553
+ state .detached_from );
1560
1554
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)" ));
1567
1559
1568
- wt_status_state_free_buffers (& state );
1569
1560
return strbuf_detach (& desc , NULL );
1570
1561
}
1571
1562
@@ -2350,25 +2341,43 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int
2350
2341
return ret ;
2351
2342
}
2352
2343
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
+
2353
2356
static int cmp_ref_sorting (struct ref_sorting * s , struct ref_array_item * a , struct ref_array_item * b )
2354
2357
{
2355
2358
struct atom_value * va , * vb ;
2356
2359
int cmp ;
2360
+ int cmp_detached_head = 0 ;
2357
2361
cmp_type cmp_type = used_atom [s -> atom ].type ;
2358
- int (* cmp_fn )(const char * , const char * );
2359
2362
struct strbuf err = STRBUF_INIT ;
2360
2363
2361
2364
if (get_ref_atom_value (a , s -> atom , & va , & err ))
2362
2365
die ("%s" , err .buf );
2363
2366
if (get_ref_atom_value (b , s -> atom , & vb , & err ))
2364
2367
die ("%s" , err .buf );
2365
2368
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 ) {
2368
2374
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 ;
2370
2379
cmp = cmp_fn (va -> s , vb -> s );
2371
- else {
2380
+ } else {
2372
2381
if (va -> value < vb -> value )
2373
2382
cmp = -1 ;
2374
2383
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
2377
2386
cmp = 1 ;
2378
2387
}
2379
2388
2380
- return (s -> reverse ) ? - cmp : cmp ;
2389
+ return (s -> sort_flags & REF_SORTING_REVERSE && !cmp_detached_head )
2390
+ ? - cmp : cmp ;
2381
2391
}
2382
2392
2383
2393
static 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)
2392
2402
return cmp ;
2393
2403
}
2394
2404
s = ref_sorting ;
2395
- return s && s -> ignore_case ?
2405
+ return s && s -> sort_flags & REF_SORTING_ICASE ?
2396
2406
strcasecmp (a -> refname , b -> refname ) :
2397
2407
strcmp (a -> refname , b -> refname );
2398
2408
}
2399
2409
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 )
2401
2412
{
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
+ }
2404
2419
}
2405
2420
2406
2421
void 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)
2537
2552
* sorting_tail = s ;
2538
2553
2539
2554
if (* arg == '-' ) {
2540
- s -> reverse = 1 ;
2555
+ s -> sort_flags |= REF_SORTING_REVERSE ;
2541
2556
arg ++ ;
2542
2557
}
2543
2558
if (skip_prefix (arg , "version:" , & arg ) ||
2544
2559
skip_prefix (arg , "v:" , & arg ))
2545
- s -> version = 1 ;
2560
+ s -> sort_flags |= REF_SORTING_VERSION ;
2546
2561
s -> atom = parse_sorting_atom (arg );
2547
2562
}
2548
2563
0 commit comments