Skip to content

Commit f277539

Browse files
authored
fix(svm-builds): handle prerelease solidity versions (#179)
closes #177 superseeds #178 Fixes `Releases::get_checksum()` version matching logic.
1 parent 820995d commit f277539

File tree

2 files changed

+37
-26
lines changed

2 files changed

+37
-26
lines changed

crates/svm-builds/build.rs

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::fs::{self, File};
44
use std::path::PathBuf;
55

6-
use semver::Version;
6+
use semver::{BuildMetadata, Prerelease, Version};
77
use svm::Releases;
88

99
/// The string describing the [svm::Platform] to build for
@@ -41,45 +41,57 @@ fn get_platform() -> svm::Platform {
4141
}
4242

4343
fn version_const_name(version: &Version) -> String {
44-
format!(
45-
"SOLC_VERSION_{}_{}_{}",
46-
version.major, version.minor, version.patch
47-
)
44+
if version.pre == Prerelease::EMPTY {
45+
format!(
46+
"SOLC_VERSION_{}_{}_{}",
47+
version.major, version.minor, version.patch
48+
)
49+
} else {
50+
let sanitized_pre = version
51+
.pre
52+
.as_str()
53+
.replace(|c: char| !c.is_alphanumeric(), "")
54+
.to_uppercase();
55+
format!(
56+
"SOLC_VERSION_{}_{}_{}_{}",
57+
version.major, version.minor, version.patch, sanitized_pre
58+
)
59+
}
4860
}
4961

5062
/// Adds build info related constants
5163
fn add_build_info_constants(output: &mut String, releases: &Releases, platform: svm::Platform) {
5264
let mut version_idents = Vec::with_capacity(releases.builds.len());
5365
let mut checksum_match_arms = Vec::with_capacity(releases.builds.len());
54-
5566
for build in releases.builds.iter() {
56-
let version = Version::new(
57-
build.version.major,
58-
build.version.minor,
59-
build.version.patch,
60-
);
67+
let prerelease = build.prerelease.clone().unwrap_or_default();
68+
let version = Version {
69+
major: build.version.major,
70+
minor: build.version.minor,
71+
patch: build.version.patch,
72+
pre: Prerelease::new(&prerelease).unwrap_or_default(),
73+
build: BuildMetadata::EMPTY,
74+
};
6175
let version_name = version_const_name(&version);
6276

6377
output.push_str(&format!(
6478
"/// Solidity compiler version `{version}`.\n\
6579
pub const {version_name}: semver::Version = semver::Version::new({}, {}, {});\n\n",
6680
version.major, version.minor, version.patch
6781
));
68-
version_idents.push(version_name);
6982

7083
let sha256 = hex::encode(&build.sha256);
71-
let checksum_name = format!(
72-
"SOLC_VERSION_{}_{}_{}_CHECKSUM",
73-
build.version.major, build.version.minor, build.version.patch
74-
);
84+
let checksum_name = format!("{version_name}_CHECKSUM");
85+
86+
version_idents.push(version_name);
7587

7688
output.push_str(&format!(
7789
"/// Checksum for Solidity compiler version `{version}`.\n\
7890
pub const {checksum_name}: &str = \"{sha256}\";\n\n",
7991
));
8092
checksum_match_arms.push(format!(
81-
"({}, {}, {}) => {}",
82-
version.major, version.minor, version.patch, checksum_name
93+
"({}, {}, {}, \"{}\") => {}",
94+
version.major, version.minor, version.patch, version.pre, checksum_name
8395
));
8496
}
8597

@@ -100,7 +112,7 @@ pub static ALL_SOLC_VERSIONS : [semver::Version; {}] = [
100112
r#"
101113
/// Get the checksum of a solc version's binary if it exists.
102114
pub fn get_checksum(version: &semver::Version) -> Option<Vec<u8>> {{
103-
let checksum = match (version.major, version.minor, version.patch) {{
115+
let checksum = match (version.major, version.minor, version.patch, version.pre.as_str()) {{
104116
{},
105117
_ => return None
106118
}};

crates/svm-rs/src/releases.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,12 @@ impl Releases {
7979
/// Checks for exact version match or for prerelease.
8080
pub fn get_checksum(&self, v: &Version) -> Option<Vec<u8>> {
8181
let matches = |build_info: &BuildInfo| {
82-
let matched_release = build_info.version == *v;
83-
84-
let matched_prelease = !v.pre.is_empty()
85-
&& build_info.version == Version::new(v.major, v.minor, v.patch)
86-
&& build_info.prerelease.as_deref() == Some(v.pre.as_str());
87-
88-
matched_release || matched_prelease
82+
build_info.version == Version::new(v.major, v.minor, v.patch)
83+
&& build_info
84+
.prerelease
85+
.as_deref()
86+
.unwrap_or("")
87+
.eq_ignore_ascii_case(v.pre.as_str())
8988
};
9089

9190
self.builds

0 commit comments

Comments
 (0)