Skip to content

Commit 8805ce9

Browse files
committed
Add case-insensitive extension sorting
This finishes off and closes #102. The code in this and the previous commit were partly authored by `zv0n` on GitHub.
1 parent 3e9616c commit 8805ce9

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

src/options.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -366,18 +366,26 @@ impl FileFilter {
366366
use self::SortCase::{Sensitive, Insensitive};
367367

368368
match self.sort_field {
369-
SortField::Unsorted => cmp::Ordering::Equal,
370-
SortField::Name(Sensitive) => natord::compare(&a.name, &b.name),
371-
SortField::Name(Insensitive) => natord::compare_ignore_case(&a.name, &b.name),
372-
SortField::Size => a.metadata.len().cmp(&b.metadata.len()),
373-
SortField::FileInode => a.metadata.ino().cmp(&b.metadata.ino()),
374-
SortField::ModifiedDate => a.metadata.mtime().cmp(&b.metadata.mtime()),
375-
SortField::AccessedDate => a.metadata.atime().cmp(&b.metadata.atime()),
376-
SortField::CreatedDate => a.metadata.ctime().cmp(&b.metadata.ctime()),
377-
SortField::Extension => match a.ext.cmp(&b.ext) {
369+
SortField::Unsorted => cmp::Ordering::Equal,
370+
371+
SortField::Name(Sensitive) => natord::compare(&a.name, &b.name),
372+
SortField::Name(Insensitive) => natord::compare_ignore_case(&a.name, &b.name),
373+
374+
SortField::Size => a.metadata.len().cmp(&b.metadata.len()),
375+
SortField::FileInode => a.metadata.ino().cmp(&b.metadata.ino()),
376+
SortField::ModifiedDate => a.metadata.mtime().cmp(&b.metadata.mtime()),
377+
SortField::AccessedDate => a.metadata.atime().cmp(&b.metadata.atime()),
378+
SortField::CreatedDate => a.metadata.ctime().cmp(&b.metadata.ctime()),
379+
380+
SortField::Extension(Sensitive) => match a.ext.cmp(&b.ext) {
378381
cmp::Ordering::Equal => natord::compare(&*a.name, &*b.name),
379382
order => order,
380383
},
384+
385+
SortField::Extension(Insensitive) => match a.ext.cmp(&b.ext) {
386+
cmp::Ordering::Equal => natord::compare_ignore_case(&*a.name, &*b.name),
387+
order => order,
388+
},
381389
}
382390
}
383391
}
@@ -462,12 +470,14 @@ impl RecurseOptions {
462470
/// User-supplied field to sort by.
463471
#[derive(PartialEq, Debug, Copy, Clone)]
464472
pub enum SortField {
465-
Unsorted, Name(SortCase), Extension, Size, FileInode,
473+
Unsorted,
474+
Name(SortCase), Extension(SortCase),
475+
Size, FileInode,
466476
ModifiedDate, AccessedDate, CreatedDate,
467477
}
468478

469479
/// Whether a field should be sorted case-sensitively or case-insensitively.
470-
///
480+
///
471481
/// This determines which of the `natord` functions to use.
472482
#[derive(PartialEq, Debug, Copy, Clone)]
473483
pub enum SortCase {
@@ -488,7 +498,8 @@ impl OptionSet for SortField {
488498
"name" | "filename" => Ok(SortField::Name(SortCase::Sensitive)),
489499
"Name" | "Filename" => Ok(SortField::Name(SortCase::Insensitive)),
490500
"size" | "filesize" => Ok(SortField::Size),
491-
"ext" | "extension" => Ok(SortField::Extension),
501+
"ext" | "extension" => Ok(SortField::Extension(SortCase::Sensitive)),
502+
"Ext" | "Extension" => Ok(SortField::Extension(SortCase::Insensitive)),
492503
"mod" | "modified" => Ok(SortField::ModifiedDate),
493504
"acc" | "accessed" => Ok(SortField::AccessedDate),
494505
"cr" | "created" => Ok(SortField::CreatedDate),

0 commit comments

Comments
 (0)