Skip to content

Commit

Permalink
Merge pull request #688 from malbarbo/sort-semver
Browse files Browse the repository at this point in the history
Sort toolchains by semantic version.
  • Loading branch information
brson authored Aug 26, 2016
2 parents 0f03f9a + 2c18936 commit c8cc167
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 5 deletions.
20 changes: 20 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/rustup-utils/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ rustc-serialize = "0.3.19"
sha2 = "0.1.2"
url = "1.1"
toml = "0.1.27"
semver = "0.4.0"
download = { path = "../download" }

[target."cfg(windows)".dependencies]
Expand Down
1 change: 1 addition & 0 deletions src/rustup-utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ extern crate sha2;
extern crate url;
extern crate toml;
extern crate download;
extern crate semver;

#[cfg(windows)]
extern crate winapi;
Expand Down
55 changes: 50 additions & 5 deletions src/rustup-utils/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -551,15 +551,27 @@ pub fn string_from_winreg_value(val: &winreg::RegValue) -> Option<String> {
}

pub fn toolchain_sort<T: AsRef<str>>(v: &mut Vec<T>) {
fn toolchain_sort_key(s: &str) -> String {
use semver::{Version, Identifier};

fn special_version(ord: u64, s: &str) -> Version {
Version {
major: 0,
minor: 0,
patch: 0,
pre: vec![Identifier::Numeric(ord), Identifier::AlphaNumeric(s.into())],
build: vec![],
}
}

fn toolchain_sort_key(s: &str) -> Version {
if s.starts_with("stable") {
format!("0{}", s)
special_version(0, s)
} else if s.starts_with("beta") {
format!("1{}", s)
special_version(1, s)
} else if s.starts_with("nightly") {
format!("2{}", s)
special_version(2, s)
} else {
format!("3{}", s)
Version::parse(&s.replace("_", "-")).unwrap_or_else(|_| special_version(3, s))
}
}

Expand All @@ -571,3 +583,36 @@ pub fn toolchain_sort<T: AsRef<str>>(v: &mut Vec<T>) {
a_key.cmp(&b_key)
});
}


#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_toochain_sort() {
let expected = vec![
"stable-x86_64-unknown-linux-gnu",
"beta-x86_64-unknown-linux-gnu",
"nightly-x86_64-unknown-linux-gnu",
"1.0.0-x86_64-unknown-linux-gnu",
"1.2.0-x86_64-unknown-linux-gnu",
"1.8.0-x86_64-unknown-linux-gnu",
"1.10.0-x86_64-unknown-linux-gnu",
];

let mut v = vec![
"1.8.0-x86_64-unknown-linux-gnu",
"1.0.0-x86_64-unknown-linux-gnu",
"nightly-x86_64-unknown-linux-gnu",
"stable-x86_64-unknown-linux-gnu",
"1.10.0-x86_64-unknown-linux-gnu",
"beta-x86_64-unknown-linux-gnu",
"1.2.0-x86_64-unknown-linux-gnu",
];

toolchain_sort(&mut v);

assert_eq!(expected, v);
}
}

0 comments on commit c8cc167

Please sign in to comment.