Skip to content
Permalink
Browse files

Add new sort option `.name` and `.Name`

Add two new sort options `.name` and `.Name` which with ignore a leading
`.` if present on the file name before sorting according to `name` and
`Name`.

This new sort is convenient if you want to list hidden and unhidden
files sorted together.
  • Loading branch information...
BenWhitehead committed Jan 30, 2018
1 parent 0eb7966 commit a156d96768c5b53e32d7134b8e51a74a9374e0d6
Showing with 30 additions and 0 deletions.
  1. +21 −0 src/fs/filter.rs
  2. +9 −0 src/options/filter.rs
@@ -191,6 +191,10 @@ pub enum SortField {
/// bad, even though that’s kind of nonsensical. So it’s its own variant
/// that can be reversed like usual.
ModifiedAge,

/// The file's name, however if the name of the file begins with `.`
/// ignore the leading `.` and then sort as Name
NameMixHidden(SortCase),
}

/// Whether a field should be sorted case-sensitively or case-insensitively.
@@ -253,6 +257,23 @@ impl SortField {
Ordering::Equal => natord::compare_ignore_case(&*a.name, &*b.name),
order => order,
},

SortField::NameMixHidden(ABCabc) => natord::compare(
SortField::strip_dot(&a.name),
SortField::strip_dot(&b.name)
),
SortField::NameMixHidden(AaBbCc) => natord::compare_ignore_case(
SortField::strip_dot(&a.name),
SortField::strip_dot(&b.name)
)
}
}

fn strip_dot(n: &str) -> &str {
if n.starts_with(".") {
&n[1..]
} else {
n
}
}
}
@@ -41,6 +41,12 @@ impl SortField {
else if word == "Name" || word == "Filename" {
Ok(SortField::Name(SortCase::ABCabc))
}
else if word == ".name" || word == ".filename" {
Ok(SortField::NameMixHidden(SortCase::AaBbCc))
}
else if word == ".Name" || word == ".Filename" {
Ok(SortField::NameMixHidden(SortCase::ABCabc))
}
else if word == "size" || word == "filesize" {
Ok(SortField::Size)
}
@@ -231,6 +237,9 @@ mod test {
test!(newest: SortField <- ["--sort=oldest"]; Both => Ok(SortField::ModifiedAge));
test!(age: SortField <- ["-sage"]; Both => Ok(SortField::ModifiedAge));

test!(mix_hidden_lowercase: SortField <- ["--sort", ".name"]; Both => Ok(SortField::NameMixHidden(SortCase::AaBbCc)));
test!(mix_hidden_uppercase: SortField <- ["--sort", ".Name"]; Both => Ok(SortField::NameMixHidden(SortCase::ABCabc)));

// Errors
test!(error: SortField <- ["--sort=colour"]; Both => Err(Misfire::BadArgument(&flags::SORT, OsString::from("colour"))));

0 comments on commit a156d96

Please sign in to comment.
You can’t perform that action at this time.