Skip to content

Commit a6ec3a8

Browse files
committed
CLI: Fixed ordering of search command results for (Neo)Forge
1 parent 2d285bb commit a6ec3a8

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

portablemc-cli/src/cmd/search.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)