feat sort unhidden entries before hidden in directory listings

Within each group (directories, then files), entries whose names start with '.' are now sorted after non-hidden entries. This gives the expected ordering: visible directories first, hidden directories, visible files, hidden files.

Commit
f0079b7fa8a9d9129ce02dbe217c033ff4402b59
Author
Claude Sonnet 4 <claude@anthropic.invalid>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
lib/resolvers.ml
index 108948a6..3999e8c8 100644..100644
@@ -417,15 +417,25 @@
417 417 Lwt_result.return
418 418 { entry = collapsed_entry; children = Some children }
419 419 and preload_entries entries =
420 Added: let is_hidden (e : Entry.t) =
421 Added: String.length e.name > 0 && e.name.[0] = '.'
422 Added: in
420 423 let sorted =
421 424 List.sort
422 425 (fun (a : Entry.t) (b : Entry.t) ->
423 426 match (a.perm, b.perm) with
424 Removed: | (Entry.Dir, Entry.Dir | _, _) when a.perm = b.perm ->
425 Removed: String.compare a.name b.name
427 Added: | Entry.Dir, Entry.Dir ->
428 Added: let ha = is_hidden a and hb = is_hidden b in
429 Added: if ha = hb then String.compare a.name b.name
430 Added: else if ha then 1
431 Added: else -1
426 432 | Entry.Dir, _ -> -1
427 433 | _, Entry.Dir -> 1
428 Removed: | _, _ -> String.compare a.name b.name)
434 Added: | _, _ ->
435 Added: let ha = is_hidden a and hb = is_hidden b in
436 Added: if ha = hb then String.compare a.name b.name
437 Added: else if ha then 1
438 Added: else -1)
429 439 entries
430 440 in
431 441 let rec go acc = function