@@ -301,6 +301,9 @@ fn search_forge(cli: &mut Cli, args: &SearchArgs, loader: forge::Loader) -> Exit
301301
302302 table. sep ( ) ;
303303
304+ // Forge .xml repositories are not sorted at all and therefore we have to sort them
305+ // here for the sorting to make sense to the user.
306+ let mut versions = Vec :: new ( ) ;
304307 for version in repo. iter ( ) . take ( args. limit ) {
305308
306309 if !args. match_filter ( version. name ( ) ) {
@@ -315,6 +318,35 @@ fn search_forge(cli: &mut Cli, args: &SearchArgs, loader: forge::Loader) -> Exit
315318 continue ;
316319 }
317320
321+ versions. push ( version) ;
322+
323+ }
324+
325+ versions. sort_by_cached_key ( |version| {
326+
327+ // We take the maximum numbers count used for some forge versions.
328+ let version = version. name ( ) ;
329+
330+ // Special case for neoforge...
331+ if loader == forge:: Loader :: NeoForge && version == "47.1.82" {
332+ [ 1 , 20 , 1 , 47 , 1 , 82 , 0 ]
333+ } else {
334+ // We do a naive sorting where we just split each parsable number
335+ let mut numbers = [ 0u16 ; 7 ] ;
336+ for ( index, part) in version
337+ . split ( |c : char | !c. is_numeric ( ) )
338+ . filter ( |s| !s. is_empty ( ) )
339+ . take ( numbers. len ( ) )
340+ . enumerate ( ) {
341+ numbers[ index] = part. parse ( ) . unwrap_or ( 0 ) ;
342+ }
343+ numbers
344+ } . map ( |n| u16:: MAX - n) // Descending order!
345+
346+ } ) ;
347+
348+ for version in versions {
349+
318350 let mut row = table. row ( ) ;
319351 row. cell ( version. name ( ) ) ;
320352 row. cell ( version. game_version ( ) ) ;
0 commit comments