Rollup merge of #74237 - lzutao:compiletest, r=Mark-Simulacrum
compiletest: Rewrite extract_*_version functions This makes extract_lldb_version has the same version type like extract_gdb_version.
This commit is contained in:
commit
216ed3c4ab
@ -2,7 +2,7 @@
|
||||
|
||||
// revisions:x86_64 i686 arm
|
||||
|
||||
// min-llvm-version 9.0
|
||||
// min-llvm-version: 9.0
|
||||
|
||||
//[x86_64] compile-flags: --target x86_64-unknown-uefi
|
||||
//[i686] compile-flags: --target i686-unknown-linux-musl
|
||||
|
@ -1,4 +1,4 @@
|
||||
// min-llvm-version 8.0
|
||||
// min-llvm-version: 8.0
|
||||
// compile-flags: -C no-prepopulate-passes -C force-unwind-tables=y
|
||||
|
||||
#![crate_type="lib"]
|
||||
|
@ -1,5 +1,5 @@
|
||||
// This test does not passed with gdb < 8.0. See #53497.
|
||||
// min-gdb-version 8.0
|
||||
// min-gdb-version: 8.0
|
||||
|
||||
// compile-flags:-g
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
// ignore-freebsd: gdb package too new
|
||||
// ignore-android: FIXME(#10381)
|
||||
// compile-flags:-g
|
||||
// min-gdb-version 8.1
|
||||
// min-gdb-version: 8.1
|
||||
// min-lldb-version: 310
|
||||
|
||||
// === GDB TESTS ===================================================================================
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
// The pretty printers being tested here require the patch from
|
||||
// https://sourceware.org/bugzilla/show_bug.cgi?id=21763
|
||||
// min-gdb-version 8.1
|
||||
// min-gdb-version: 8.1
|
||||
|
||||
// min-lldb-version: 310
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
// only-cdb // "Temporarily" ignored on GDB/LLDB due to debuginfo tests being disabled, see PR 47155
|
||||
// ignore-android: FIXME(#10381)
|
||||
// compile-flags:-g
|
||||
// min-gdb-version 7.7
|
||||
// min-gdb-version: 7.7
|
||||
// min-lldb-version: 310
|
||||
|
||||
// === GDB TESTS ===================================================================================
|
||||
|
@ -2,7 +2,7 @@
|
||||
// ignore-freebsd: gdb package too new
|
||||
// ignore-android: FIXME(#10381)
|
||||
// compile-flags:-g
|
||||
// min-gdb-version 8.1
|
||||
// min-gdb-version: 8.1
|
||||
// min-lldb-version: 310
|
||||
|
||||
// === GDB TESTS ===================================================================================
|
||||
|
@ -2,7 +2,7 @@
|
||||
// being run when compiling with new LLVM pass manager and ThinLTO.
|
||||
// Note: The issue occurred only on non-zero opt-level.
|
||||
//
|
||||
// min-llvm-version 9.0
|
||||
// min-llvm-version: 9.0
|
||||
// needs-sanitizer-support
|
||||
// needs-sanitizer-address
|
||||
//
|
||||
|
@ -271,13 +271,13 @@ pub struct Config {
|
||||
pub gdb_native_rust: bool,
|
||||
|
||||
/// Version of LLDB
|
||||
pub lldb_version: Option<String>,
|
||||
pub lldb_version: Option<u32>,
|
||||
|
||||
/// Whether LLDB has native rust support
|
||||
pub lldb_native_rust: bool,
|
||||
|
||||
/// Version of LLVM
|
||||
pub llvm_version: Option<String>,
|
||||
pub llvm_version: Option<u32>,
|
||||
|
||||
/// Is LLVM a system LLVM
|
||||
pub system_llvm: bool,
|
||||
|
@ -132,72 +132,46 @@ pub fn from_reader<R: Read>(config: &Config, testfile: &Path, rdr: R) -> Self {
|
||||
|
||||
fn ignore_gdb(config: &Config, line: &str) -> bool {
|
||||
if let Some(actual_version) = config.gdb_version {
|
||||
if line.starts_with("min-gdb-version") {
|
||||
let (start_ver, end_ver) = extract_gdb_version_range(line);
|
||||
if let Some(rest) = line.strip_prefix("min-gdb-version:").map(str::trim) {
|
||||
let (start_ver, end_ver) = extract_version_range(rest, extract_gdb_version)
|
||||
.unwrap_or_else(|| {
|
||||
panic!("couldn't parse version range: {:?}", rest);
|
||||
});
|
||||
|
||||
if start_ver != end_ver {
|
||||
panic!("Expected single GDB version")
|
||||
}
|
||||
// Ignore if actual version is smaller the minimum required
|
||||
// version
|
||||
actual_version < start_ver
|
||||
} else if line.starts_with("ignore-gdb-version") {
|
||||
let (min_version, max_version) = extract_gdb_version_range(line);
|
||||
return actual_version < start_ver;
|
||||
} else if let Some(rest) = line.strip_prefix("ignore-gdb-version:").map(str::trim) {
|
||||
let (min_version, max_version) =
|
||||
extract_version_range(rest, extract_gdb_version).unwrap_or_else(|| {
|
||||
panic!("couldn't parse version range: {:?}", rest);
|
||||
});
|
||||
|
||||
if max_version < min_version {
|
||||
panic!("Malformed GDB version range: max < min")
|
||||
}
|
||||
|
||||
actual_version >= min_version && actual_version <= max_version
|
||||
} else {
|
||||
false
|
||||
return actual_version >= min_version && actual_version <= max_version;
|
||||
}
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
// Takes a directive of the form "ignore-gdb-version <version1> [- <version2>]",
|
||||
// returns the numeric representation of <version1> and <version2> as
|
||||
// tuple: (<version1> as u32, <version2> as u32)
|
||||
// If the <version2> part is omitted, the second component of the tuple
|
||||
// is the same as <version1>.
|
||||
fn extract_gdb_version_range(line: &str) -> (u32, u32) {
|
||||
const ERROR_MESSAGE: &'static str = "Malformed GDB version directive";
|
||||
|
||||
let range_components = line
|
||||
.split(&[' ', '-'][..])
|
||||
.filter(|word| !word.is_empty())
|
||||
.map(extract_gdb_version)
|
||||
.skip_while(Option::is_none)
|
||||
.take(3) // 3 or more = invalid, so take at most 3.
|
||||
.collect::<Vec<Option<u32>>>();
|
||||
|
||||
match range_components.len() {
|
||||
1 => {
|
||||
let v = range_components[0].unwrap();
|
||||
(v, v)
|
||||
}
|
||||
2 => {
|
||||
let v_min = range_components[0].unwrap();
|
||||
let v_max = range_components[1].expect(ERROR_MESSAGE);
|
||||
(v_min, v_max)
|
||||
}
|
||||
_ => panic!(ERROR_MESSAGE),
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn ignore_lldb(config: &Config, line: &str) -> bool {
|
||||
if let Some(ref actual_version) = config.lldb_version {
|
||||
if line.starts_with("min-lldb-version") {
|
||||
let min_version = line
|
||||
.trim_end()
|
||||
.rsplit(' ')
|
||||
.next()
|
||||
.expect("Malformed lldb version directive");
|
||||
if let Some(actual_version) = config.lldb_version {
|
||||
if let Some(min_version) = line.strip_prefix("min-lldb-version:").map(str::trim) {
|
||||
let min_version = min_version.parse().unwrap_or_else(|e| {
|
||||
panic!(
|
||||
"Unexpected format of LLDB version string: {}\n{:?}",
|
||||
min_version, e
|
||||
);
|
||||
});
|
||||
// Ignore if actual version is smaller the minimum required
|
||||
// version
|
||||
lldb_version_to_int(actual_version) < lldb_version_to_int(min_version)
|
||||
actual_version < min_version
|
||||
} else if line.starts_with("rust-lldb") && !config.lldb_native_rust {
|
||||
true
|
||||
} else {
|
||||
@ -212,48 +186,31 @@ fn ignore_llvm(config: &Config, line: &str) -> bool {
|
||||
if config.system_llvm && line.starts_with("no-system-llvm") {
|
||||
return true;
|
||||
}
|
||||
if let Some(ref actual_version) = config.llvm_version {
|
||||
let actual_version = version_to_int(actual_version);
|
||||
if line.starts_with("min-llvm-version") {
|
||||
let min_version = line
|
||||
.trim_end()
|
||||
.rsplit(' ')
|
||||
.next()
|
||||
.expect("Malformed llvm version directive");
|
||||
if let Some(actual_version) = config.llvm_version {
|
||||
if let Some(rest) = line.strip_prefix("min-llvm-version:").map(str::trim) {
|
||||
let min_version = extract_llvm_version(rest).unwrap();
|
||||
// Ignore if actual version is smaller the minimum required
|
||||
// version
|
||||
actual_version < version_to_int(min_version)
|
||||
} else if line.starts_with("min-system-llvm-version") {
|
||||
let min_version = line
|
||||
.trim_end()
|
||||
.rsplit(' ')
|
||||
.next()
|
||||
.expect("Malformed llvm version directive");
|
||||
actual_version < min_version
|
||||
} else if let Some(rest) =
|
||||
line.strip_prefix("min-system-llvm-version:").map(str::trim)
|
||||
{
|
||||
let min_version = extract_llvm_version(rest).unwrap();
|
||||
// Ignore if using system LLVM and actual version
|
||||
// is smaller the minimum required version
|
||||
config.system_llvm && actual_version < version_to_int(min_version)
|
||||
} else if line.starts_with("ignore-llvm-version") {
|
||||
// Syntax is: "ignore-llvm-version <version1> [- <version2>]"
|
||||
let range_components = line
|
||||
.split(' ')
|
||||
.skip(1) // Skip the directive.
|
||||
.map(|s| s.trim())
|
||||
.filter(|word| !word.is_empty() && word != &"-")
|
||||
.take(3) // 3 or more = invalid, so take at most 3.
|
||||
.collect::<Vec<&str>>();
|
||||
match range_components.len() {
|
||||
1 => actual_version == version_to_int(range_components[0]),
|
||||
2 => {
|
||||
let v_min = version_to_int(range_components[0]);
|
||||
let v_max = version_to_int(range_components[1]);
|
||||
if v_max < v_min {
|
||||
panic!("Malformed LLVM version range: max < min")
|
||||
}
|
||||
// Ignore if version lies inside of range.
|
||||
actual_version >= v_min && actual_version <= v_max
|
||||
}
|
||||
_ => panic!("Malformed LLVM version directive"),
|
||||
config.system_llvm && actual_version < min_version
|
||||
} else if let Some(rest) = line.strip_prefix("ignore-llvm-version:").map(str::trim)
|
||||
{
|
||||
// Syntax is: "ignore-llvm-version: <version1> [- <version2>]"
|
||||
let (v_min, v_max) = extract_version_range(rest, extract_llvm_version)
|
||||
.unwrap_or_else(|| {
|
||||
panic!("couldn't parse version range: {:?}", rest);
|
||||
});
|
||||
if v_max < v_min {
|
||||
panic!("Malformed LLVM version range: max < min")
|
||||
}
|
||||
// Ignore if version lies inside of range.
|
||||
actual_version >= v_min && actual_version <= v_max
|
||||
} else {
|
||||
false
|
||||
}
|
||||
@ -261,20 +218,6 @@ fn ignore_llvm(config: &Config, line: &str) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn version_to_int(version: &str) -> u32 {
|
||||
let version_without_suffix = version.trim_end_matches("git").split('-').next().unwrap();
|
||||
let components: Vec<u32> = version_without_suffix
|
||||
.split('.')
|
||||
.map(|s| s.parse().expect("Malformed version component"))
|
||||
.collect();
|
||||
match components.len() {
|
||||
1 => components[0] * 10000,
|
||||
2 => components[0] * 10000 + components[1] * 100,
|
||||
3 => components[0] * 10000 + components[1] * 100 + components[2],
|
||||
_ => panic!("Malformed version"),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -944,12 +887,6 @@ fn parse_edition(&self, line: &str) -> Option<String> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn lldb_version_to_int(version_string: &str) -> isize {
|
||||
let error_string =
|
||||
format!("Encountered LLDB version string with unexpected format: {}", version_string);
|
||||
version_string.parse().expect(&error_string)
|
||||
}
|
||||
|
||||
fn expand_variables(mut value: String, config: &Config) -> String {
|
||||
const CWD: &'static str = "{{cwd}}";
|
||||
const SRC_BASE: &'static str = "{{src-base}}";
|
||||
@ -990,3 +927,49 @@ fn parse_normalization_string(line: &mut &str) -> Option<String> {
|
||||
*line = &line[end + 1..];
|
||||
Some(result)
|
||||
}
|
||||
|
||||
pub fn extract_llvm_version(version: &str) -> Option<u32> {
|
||||
let version_without_suffix = version.trim_end_matches("git").split('-').next().unwrap();
|
||||
let components: Vec<u32> = version_without_suffix
|
||||
.split('.')
|
||||
.map(|s| s.parse().expect("Malformed version component"))
|
||||
.collect();
|
||||
let version = match *components {
|
||||
[a] => a * 10_000,
|
||||
[a, b] => a * 10_000 + b * 100,
|
||||
[a, b, c] => a * 10_000 + b * 100 + c,
|
||||
_ => panic!("Malformed version"),
|
||||
};
|
||||
Some(version)
|
||||
}
|
||||
|
||||
// Takes a directive of the form "<version1> [- <version2>]",
|
||||
// returns the numeric representation of <version1> and <version2> as
|
||||
// tuple: (<version1> as u32, <version2> as u32)
|
||||
// If the <version2> part is omitted, the second component of the tuple
|
||||
// is the same as <version1>.
|
||||
fn extract_version_range<F>(line: &str, parse: F) -> Option<(u32, u32)>
|
||||
where
|
||||
F: Fn(&str) -> Option<u32>,
|
||||
{
|
||||
let mut splits = line.splitn(2, "- ").map(str::trim);
|
||||
let min = splits.next().unwrap();
|
||||
if min.ends_with('-') {
|
||||
return None;
|
||||
}
|
||||
|
||||
let max = splits.next();
|
||||
|
||||
if min.is_empty() {
|
||||
return None;
|
||||
}
|
||||
|
||||
let min = parse(min)?;
|
||||
let max = match max {
|
||||
Some(max) if max.is_empty() => return None,
|
||||
Some(max) => parse(max)?,
|
||||
_ => min,
|
||||
};
|
||||
|
||||
Some((min, max))
|
||||
}
|
||||
|
@ -119,17 +119,17 @@ fn no_system_llvm() {
|
||||
fn llvm_version() {
|
||||
let mut config = config();
|
||||
|
||||
config.llvm_version = Some("8.1.2-rust".to_owned());
|
||||
assert!(parse_rs(&config, "// min-llvm-version 9.0").ignore);
|
||||
config.llvm_version = Some(80102);
|
||||
assert!(parse_rs(&config, "// min-llvm-version: 9.0").ignore);
|
||||
|
||||
config.llvm_version = Some("9.0.1-rust-1.43.0-dev".to_owned());
|
||||
assert!(parse_rs(&config, "// min-llvm-version 9.2").ignore);
|
||||
config.llvm_version = Some(90001);
|
||||
assert!(parse_rs(&config, "// min-llvm-version: 9.2").ignore);
|
||||
|
||||
config.llvm_version = Some("9.3.1-rust-1.43.0-dev".to_owned());
|
||||
assert!(!parse_rs(&config, "// min-llvm-version 9.2").ignore);
|
||||
config.llvm_version = Some(90301);
|
||||
assert!(!parse_rs(&config, "// min-llvm-version: 9.2").ignore);
|
||||
|
||||
config.llvm_version = Some("10.0.0-rust".to_owned());
|
||||
assert!(!parse_rs(&config, "// min-llvm-version 9.0").ignore);
|
||||
config.llvm_version = Some(100000);
|
||||
assert!(!parse_rs(&config, "// min-llvm-version: 9.0").ignore);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -220,3 +220,18 @@ fn sanitizers() {
|
||||
assert!(parse_rs(&config, "// needs-sanitizer-memory").ignore);
|
||||
assert!(parse_rs(&config, "// needs-sanitizer-thread").ignore);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extract_version_range() {
|
||||
use super::{extract_llvm_version, extract_version_range};
|
||||
|
||||
assert_eq!(extract_version_range("1.2.3 - 4.5.6", extract_llvm_version), Some((10203, 40506)));
|
||||
assert_eq!(extract_version_range("0 - 4.5.6", extract_llvm_version), Some((0, 40506)));
|
||||
assert_eq!(extract_version_range("1.2.3 -", extract_llvm_version), None);
|
||||
assert_eq!(extract_version_range("1.2.3 - ", extract_llvm_version), None);
|
||||
assert_eq!(extract_version_range("- 4.5.6", extract_llvm_version), None);
|
||||
assert_eq!(extract_version_range("-", extract_llvm_version), None);
|
||||
assert_eq!(extract_version_range(" - 4.5.6", extract_llvm_version), None);
|
||||
assert_eq!(extract_version_range(" - 4.5.6", extract_llvm_version), None);
|
||||
assert_eq!(extract_version_range("0 -", extract_llvm_version), None);
|
||||
}
|
||||
|
@ -166,14 +166,20 @@ fn make_absolute(path: PathBuf) -> PathBuf {
|
||||
let cdb = analyze_cdb(matches.opt_str("cdb"), &target);
|
||||
let (gdb, gdb_version, gdb_native_rust) =
|
||||
analyze_gdb(matches.opt_str("gdb"), &target, &android_cross_path);
|
||||
let (lldb_version, lldb_native_rust) = extract_lldb_version(matches.opt_str("lldb-version"));
|
||||
|
||||
let color = match matches.opt_str("color").as_ref().map(|x| &**x) {
|
||||
let (lldb_version, lldb_native_rust) = matches
|
||||
.opt_str("lldb-version")
|
||||
.as_deref()
|
||||
.and_then(extract_lldb_version)
|
||||
.map(|(v, b)| (Some(v), b))
|
||||
.unwrap_or((None, false));
|
||||
let color = match matches.opt_str("color").as_deref() {
|
||||
Some("auto") | None => ColorConfig::AutoColor,
|
||||
Some("always") => ColorConfig::AlwaysColor,
|
||||
Some("never") => ColorConfig::NeverColor,
|
||||
Some(x) => panic!("argument for --color must be auto, always, or never, but found `{}`", x),
|
||||
};
|
||||
let llvm_version =
|
||||
matches.opt_str("llvm-version").as_deref().and_then(header::extract_llvm_version);
|
||||
|
||||
let src_base = opt_path(matches, "src-base");
|
||||
let run_ignored = matches.opt_present("ignored");
|
||||
@ -215,7 +221,7 @@ fn make_absolute(path: PathBuf) -> PathBuf {
|
||||
gdb_native_rust,
|
||||
lldb_version,
|
||||
lldb_native_rust,
|
||||
llvm_version: matches.opt_str("llvm-version"),
|
||||
llvm_version,
|
||||
system_llvm: matches.opt_present("system-llvm"),
|
||||
android_cross_path,
|
||||
adb_path: opt_str2(matches.opt_str("adb-path")),
|
||||
@ -254,7 +260,7 @@ pub fn log_config(config: &Config) {
|
||||
logv(c, format!("stage_id: {}", config.stage_id));
|
||||
logv(c, format!("mode: {}", config.mode));
|
||||
logv(c, format!("run_ignored: {}", config.run_ignored));
|
||||
logv(c, format!("filter: {}", opt_str(&config.filter.as_ref().map(|re| re.to_owned()))));
|
||||
logv(c, format!("filter: {}", opt_str(&config.filter)));
|
||||
logv(c, format!("filter_exact: {}", config.filter_exact));
|
||||
logv(
|
||||
c,
|
||||
@ -403,17 +409,14 @@ fn configure_lldb(config: &Config) -> Option<Config> {
|
||||
return None;
|
||||
}
|
||||
|
||||
if let Some(lldb_version) = config.lldb_version.as_ref() {
|
||||
if lldb_version == "350" {
|
||||
println!(
|
||||
"WARNING: The used version of LLDB ({}) has a \
|
||||
known issue that breaks debuginfo tests. See \
|
||||
issue #32520 for more information. Skipping all \
|
||||
LLDB-based tests!",
|
||||
lldb_version
|
||||
);
|
||||
return None;
|
||||
}
|
||||
if let Some(350) = config.lldb_version {
|
||||
println!(
|
||||
"WARNING: The used version of LLDB (350) has a \
|
||||
known issue that breaks debuginfo tests. See \
|
||||
issue #32520 for more information. Skipping all \
|
||||
LLDB-based tests!",
|
||||
);
|
||||
return None;
|
||||
}
|
||||
|
||||
// Some older versions of LLDB seem to have problems with multiple
|
||||
@ -727,9 +730,7 @@ fn make_test_closure(
|
||||
let config = config.clone();
|
||||
let testpaths = testpaths.clone();
|
||||
let revision = revision.cloned();
|
||||
test::DynTestFn(Box::new(move || {
|
||||
runtest::run(config, &testpaths, revision.as_ref().map(|s| s.as_str()))
|
||||
}))
|
||||
test::DynTestFn(Box::new(move || runtest::run(config, &testpaths, revision.as_deref())))
|
||||
}
|
||||
|
||||
/// Returns `true` if the given target is an Android target for the
|
||||
@ -845,75 +846,40 @@ fn extract_gdb_version(full_version_line: &str) -> Option<u32> {
|
||||
// This particular form is documented in the GNU coding standards:
|
||||
// https://www.gnu.org/prep/standards/html_node/_002d_002dversion.html#g_t_002d_002dversion
|
||||
|
||||
// don't start parsing in the middle of a number
|
||||
let mut prev_was_digit = false;
|
||||
let mut in_parens = false;
|
||||
for (pos, c) in full_version_line.char_indices() {
|
||||
if in_parens {
|
||||
if c == ')' {
|
||||
in_parens = false;
|
||||
}
|
||||
continue;
|
||||
} else if c == '(' {
|
||||
in_parens = true;
|
||||
continue;
|
||||
let mut splits = full_version_line.rsplit(' ');
|
||||
let version_string = splits.next().unwrap();
|
||||
|
||||
let mut splits = version_string.split('.');
|
||||
let major = splits.next().unwrap();
|
||||
let minor = splits.next().unwrap();
|
||||
let patch = splits.next();
|
||||
|
||||
let major: u32 = major.parse().unwrap();
|
||||
let (minor, patch): (u32, u32) = match minor.find(not_a_digit) {
|
||||
None => {
|
||||
let minor = minor.parse().unwrap();
|
||||
let patch: u32 = match patch {
|
||||
Some(patch) => match patch.find(not_a_digit) {
|
||||
None => patch.parse().unwrap(),
|
||||
Some(idx) if idx > 3 => 0,
|
||||
Some(idx) => patch[..idx].parse().unwrap(),
|
||||
},
|
||||
None => 0,
|
||||
};
|
||||
(minor, patch)
|
||||
}
|
||||
|
||||
if prev_was_digit || !c.is_digit(10) {
|
||||
prev_was_digit = c.is_digit(10);
|
||||
continue;
|
||||
// There is no patch version after minor-date (e.g. "4-2012").
|
||||
Some(idx) => {
|
||||
let minor = minor[..idx].parse().unwrap();
|
||||
(minor, 0)
|
||||
}
|
||||
};
|
||||
|
||||
prev_was_digit = true;
|
||||
|
||||
let line = &full_version_line[pos..];
|
||||
|
||||
let next_split = match line.find(|c: char| !c.is_digit(10)) {
|
||||
Some(idx) => idx,
|
||||
None => continue, // no minor version
|
||||
};
|
||||
|
||||
if line.as_bytes()[next_split] != b'.' {
|
||||
continue; // no minor version
|
||||
}
|
||||
|
||||
let major = &line[..next_split];
|
||||
let line = &line[next_split + 1..];
|
||||
|
||||
let (minor, patch) = match line.find(|c: char| !c.is_digit(10)) {
|
||||
Some(idx) => {
|
||||
if line.as_bytes()[idx] == b'.' {
|
||||
let patch = &line[idx + 1..];
|
||||
|
||||
let patch_len =
|
||||
patch.find(|c: char| !c.is_digit(10)).unwrap_or_else(|| patch.len());
|
||||
let patch = &patch[..patch_len];
|
||||
let patch = if patch_len > 3 || patch_len == 0 { None } else { Some(patch) };
|
||||
|
||||
(&line[..idx], patch)
|
||||
} else {
|
||||
(&line[..idx], None)
|
||||
}
|
||||
}
|
||||
None => (line, None),
|
||||
};
|
||||
|
||||
if minor.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let major: u32 = major.parse().unwrap();
|
||||
let minor: u32 = minor.parse().unwrap();
|
||||
let patch: u32 = patch.unwrap_or("0").parse().unwrap();
|
||||
|
||||
return Some(((major * 1000) + minor) * 1000 + patch);
|
||||
}
|
||||
|
||||
None
|
||||
Some(((major * 1000) + minor) * 1000 + patch)
|
||||
}
|
||||
|
||||
/// Returns (LLDB version, LLDB is rust-enabled)
|
||||
fn extract_lldb_version(full_version_line: Option<String>) -> (Option<String>, bool) {
|
||||
fn extract_lldb_version(full_version_line: &str) -> Option<(u32, bool)> {
|
||||
// Extract the major LLDB version from the given version string.
|
||||
// LLDB version strings are different for Apple and non-Apple platforms.
|
||||
// The Apple variant looks like this:
|
||||
@ -922,7 +888,7 @@ fn extract_lldb_version(full_version_line: Option<String>) -> (Option<String>, b
|
||||
// lldb-300.2.51 (new versions)
|
||||
//
|
||||
// We are only interested in the major version number, so this function
|
||||
// will return `Some("179")` and `Some("300")` respectively.
|
||||
// will return `Some(179)` and `Some(300)` respectively.
|
||||
//
|
||||
// Upstream versions look like:
|
||||
// lldb version 6.0.1
|
||||
@ -934,53 +900,24 @@ fn extract_lldb_version(full_version_line: Option<String>) -> (Option<String>, b
|
||||
// normally fine because the only non-Apple version we test is
|
||||
// rust-enabled.
|
||||
|
||||
if let Some(ref full_version_line) = full_version_line {
|
||||
if !full_version_line.trim().is_empty() {
|
||||
let full_version_line = full_version_line.trim();
|
||||
let full_version_line = full_version_line.trim();
|
||||
|
||||
for (pos, l) in full_version_line.char_indices() {
|
||||
if l != 'l' && l != 'L' {
|
||||
continue;
|
||||
}
|
||||
if pos + 5 >= full_version_line.len() {
|
||||
continue;
|
||||
}
|
||||
let l = full_version_line[pos + 1..].chars().next().unwrap();
|
||||
if l != 'l' && l != 'L' {
|
||||
continue;
|
||||
}
|
||||
let d = full_version_line[pos + 2..].chars().next().unwrap();
|
||||
if d != 'd' && d != 'D' {
|
||||
continue;
|
||||
}
|
||||
let b = full_version_line[pos + 3..].chars().next().unwrap();
|
||||
if b != 'b' && b != 'B' {
|
||||
continue;
|
||||
}
|
||||
let dash = full_version_line[pos + 4..].chars().next().unwrap();
|
||||
if dash != '-' {
|
||||
continue;
|
||||
}
|
||||
|
||||
let vers = full_version_line[pos + 5..]
|
||||
.chars()
|
||||
.take_while(|c| c.is_digit(10))
|
||||
.collect::<String>();
|
||||
if !vers.is_empty() {
|
||||
return (Some(vers), full_version_line.contains("rust-enabled"));
|
||||
}
|
||||
}
|
||||
|
||||
if full_version_line.starts_with("lldb version ") {
|
||||
let vers = full_version_line[13..]
|
||||
.chars()
|
||||
.take_while(|c| c.is_digit(10))
|
||||
.collect::<String>();
|
||||
if !vers.is_empty() {
|
||||
return (Some(vers + "00"), full_version_line.contains("rust-enabled"));
|
||||
}
|
||||
}
|
||||
if let Some(apple_ver) =
|
||||
full_version_line.strip_prefix("LLDB-").or_else(|| full_version_line.strip_prefix("lldb-"))
|
||||
{
|
||||
if let Some(idx) = apple_ver.find(not_a_digit) {
|
||||
let version: u32 = apple_ver[..idx].parse().unwrap();
|
||||
return Some((version, full_version_line.contains("rust-enabled")));
|
||||
}
|
||||
} else if let Some(lldb_ver) = full_version_line.strip_prefix("lldb version ") {
|
||||
if let Some(idx) = lldb_ver.find(not_a_digit) {
|
||||
let version: u32 = lldb_ver[..idx].parse().unwrap();
|
||||
return Some((version * 100, full_version_line.contains("rust-enabled")));
|
||||
}
|
||||
}
|
||||
(None, false)
|
||||
None
|
||||
}
|
||||
|
||||
fn not_a_digit(c: char) -> bool {
|
||||
!c.is_digit(10)
|
||||
}
|
||||
|
@ -1,8 +1,9 @@
|
||||
use super::header::extract_llvm_version;
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_extract_gdb_version() {
|
||||
macro_rules! test { ($($expectation:tt: $input:tt,)*) => {{$(
|
||||
macro_rules! test { ($($expectation:literal: $input:literal,)*) => {{$(
|
||||
assert_eq!(extract_gdb_version($input), Some($expectation));
|
||||
)*}}}
|
||||
|
||||
@ -41,6 +42,17 @@ macro_rules! test { ($($expectation:tt: $input:tt,)*) => {{$(
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extract_lldb_version() {
|
||||
// Apple variants
|
||||
assert_eq!(extract_lldb_version("LLDB-179.5"), Some((179, false)));
|
||||
assert_eq!(extract_lldb_version("lldb-300.2.51"), Some((300, false)));
|
||||
|
||||
// Upstream versions
|
||||
assert_eq!(extract_lldb_version("lldb version 6.0.1"), Some((600, false)));
|
||||
assert_eq!(extract_lldb_version("lldb version 9.0.0"), Some((900, false)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn is_test_test() {
|
||||
assert_eq!(true, is_test(&OsString::from("a_test.rs")));
|
||||
@ -49,3 +61,11 @@ fn is_test_test() {
|
||||
assert_eq!(false, is_test(&OsString::from("#a_dog_gif")));
|
||||
assert_eq!(false, is_test(&OsString::from("~a_temp_file")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extract_llvm_version() {
|
||||
assert_eq!(extract_llvm_version("8.1.2-rust"), Some(80102));
|
||||
assert_eq!(extract_llvm_version("9.0.1-rust-1.43.0-dev"), Some(90001));
|
||||
assert_eq!(extract_llvm_version("9.3.1-rust-1.43.0-dev"), Some(90301));
|
||||
assert_eq!(extract_llvm_version("10.0.0-rust"), Some(100000));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user