mirror of
https://github.com/esp-rs/espup.git
synced 2025-10-02 23:25:16 +00:00
Merge pull request #38 from esp-rs/feature/improve-update
Avoid using hardcoded Xtensa Rust version
This commit is contained in:
commit
26f971f8ff
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -433,6 +433,7 @@ dependencies = [
|
|||||||
"regex",
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"strum",
|
"strum",
|
||||||
"strum_macros",
|
"strum_macros",
|
||||||
"tar",
|
"tar",
|
||||||
|
@ -35,6 +35,7 @@ directories-next = "2.0.0"
|
|||||||
serde = { version = "1.0.146", features = ["derive"] }
|
serde = { version = "1.0.146", features = ["derive"] }
|
||||||
miette = "5.4.1"
|
miette = "5.4.1"
|
||||||
regex = "1.6.0"
|
regex = "1.6.0"
|
||||||
|
serde_json = "1.0.87"
|
||||||
|
|
||||||
[target.aarch64-unknown-linux-gnu.dependencies]
|
[target.aarch64-unknown-linux-gnu.dependencies]
|
||||||
openssl = { version = "0.10", features = ["vendored"] }
|
openssl = { version = "0.10", features = ["vendored"] }
|
||||||
|
@ -35,7 +35,7 @@ impl Config {
|
|||||||
let dirs = ProjectDirs::from("rs", "esp", "espup").unwrap();
|
let dirs = ProjectDirs::from("rs", "esp", "espup").unwrap();
|
||||||
let file = dirs.config_dir().join("espup.toml");
|
let file = dirs.config_dir().join("espup.toml");
|
||||||
|
|
||||||
let config = if let Ok(data) = read(&file) {
|
let config = if let Ok(data) = read(file) {
|
||||||
toml::from_slice(&data).into_diagnostic()?
|
toml::from_slice(&data).into_diagnostic()?
|
||||||
} else {
|
} else {
|
||||||
return Err(ErrReport::msg("No config file found"));
|
return Err(ErrReport::msg("No config file found"));
|
||||||
|
41
src/main.rs
41
src/main.rs
@ -21,7 +21,6 @@ use espup::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
use log::{debug, info, warn};
|
use log::{debug, info, warn};
|
||||||
use regex::Regex;
|
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet,
|
collections::HashSet,
|
||||||
fs::{remove_dir_all, remove_file, File},
|
fs::{remove_dir_all, remove_file, File},
|
||||||
@ -33,10 +32,6 @@ use std::{
|
|||||||
const DEFAULT_EXPORT_FILE: &str = "export-esp.ps1";
|
const DEFAULT_EXPORT_FILE: &str = "export-esp.ps1";
|
||||||
#[cfg(not(windows))]
|
#[cfg(not(windows))]
|
||||||
const DEFAULT_EXPORT_FILE: &str = "export-esp.sh";
|
const DEFAULT_EXPORT_FILE: &str = "export-esp.sh";
|
||||||
/// Xtensa Rust Toolchain version regex.
|
|
||||||
const RE_TOOLCHAIN_VERSION: &str = r"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)\.(?P<subpatch>0|[1-9]\d*)?$";
|
|
||||||
/// Latest Xtensa Rust Toolchain version.
|
|
||||||
const LATEST_TOOLCHAIN_VERSION: &str = "1.65.0.0";
|
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[command(
|
#[command(
|
||||||
@ -103,8 +98,8 @@ pub struct InstallOpts {
|
|||||||
#[arg(short = 't', long, default_value = "all")]
|
#[arg(short = 't', long, default_value = "all")]
|
||||||
pub targets: String,
|
pub targets: String,
|
||||||
/// Xtensa Rust toolchain version.
|
/// Xtensa Rust toolchain version.
|
||||||
#[arg(short = 'v', long, default_value = LATEST_TOOLCHAIN_VERSION, value_parser = parse_version)]
|
#[arg(short = 'v', long, value_parser = XtensaRust::parse_version)]
|
||||||
pub toolchain_version: String,
|
pub toolchain_version: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Parser)]
|
#[derive(Debug, Parser)]
|
||||||
@ -116,7 +111,7 @@ pub struct UpdateOpts {
|
|||||||
#[arg(short = 'l', long, default_value = "info", value_parser = ["debug", "info", "warn", "error"])]
|
#[arg(short = 'l', long, default_value = "info", value_parser = ["debug", "info", "warn", "error"])]
|
||||||
pub log_level: String,
|
pub log_level: String,
|
||||||
/// Xtensa Rust toolchain version.
|
/// Xtensa Rust toolchain version.
|
||||||
#[arg(short = 'v', long, default_value = LATEST_TOOLCHAIN_VERSION, value_parser = parse_version)]
|
#[arg(short = 'v', long, value_parser = XtensaRust::parse_version)]
|
||||||
pub toolchain_version: Option<String>,
|
pub toolchain_version: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,18 +122,6 @@ pub struct UninstallOpts {
|
|||||||
pub log_level: String,
|
pub log_level: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses the version of the Xtensa toolchain.
|
|
||||||
fn parse_version(arg: &str) -> Result<String> {
|
|
||||||
let re = Regex::new(RE_TOOLCHAIN_VERSION).unwrap();
|
|
||||||
if !re.is_match(arg) {
|
|
||||||
bail!(
|
|
||||||
"{} Invalid toolchain version, must be in the form of '<major>.<minor>.<patch>.<subpatch>'",
|
|
||||||
emoji::ERROR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Ok(arg.to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Installs the Rust for ESP chips environment
|
/// Installs the Rust for ESP chips environment
|
||||||
fn install(args: InstallOpts) -> Result<()> {
|
fn install(args: InstallOpts) -> Result<()> {
|
||||||
initialize_logger(&args.log_level);
|
initialize_logger(&args.log_level);
|
||||||
@ -153,7 +136,13 @@ fn install(args: InstallOpts) -> Result<()> {
|
|||||||
|| targets.contains(&Target::ESP32S2)
|
|| targets.contains(&Target::ESP32S2)
|
||||||
|| targets.contains(&Target::ESP32S3)
|
|| targets.contains(&Target::ESP32S3)
|
||||||
{
|
{
|
||||||
Some(XtensaRust::new(&args.toolchain_version, &host_triple))
|
let xtensa_rust: XtensaRust = if let Some(toolchain_version) = &args.toolchain_version {
|
||||||
|
XtensaRust::new(toolchain_version, &host_triple)
|
||||||
|
} else {
|
||||||
|
let latest_version = XtensaRust::get_latest_version()?;
|
||||||
|
XtensaRust::new(&latest_version, &host_triple)
|
||||||
|
};
|
||||||
|
Some(xtensa_rust)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
@ -308,12 +297,12 @@ fn update(args: UpdateOpts) -> Result<()> {
|
|||||||
info!("{} Updating ESP Rust environment", emoji::DISC);
|
info!("{} Updating ESP Rust environment", emoji::DISC);
|
||||||
let host_triple = get_host_triple(args.default_host)?;
|
let host_triple = get_host_triple(args.default_host)?;
|
||||||
let mut config = Config::load().unwrap();
|
let mut config = Config::load().unwrap();
|
||||||
let xtensa_rust: XtensaRust;
|
let xtensa_rust: XtensaRust = if let Some(toolchain_version) = args.toolchain_version {
|
||||||
if let Some(toolchain_version) = args.toolchain_version {
|
XtensaRust::new(&toolchain_version, &host_triple)
|
||||||
xtensa_rust = XtensaRust::new(&toolchain_version, &host_triple);
|
|
||||||
} else {
|
} else {
|
||||||
xtensa_rust = XtensaRust::new(LATEST_TOOLCHAIN_VERSION, &host_triple);
|
let latest_version = XtensaRust::get_latest_version()?;
|
||||||
}
|
XtensaRust::new(&latest_version, &host_triple)
|
||||||
|
};
|
||||||
|
|
||||||
debug!(
|
debug!(
|
||||||
"{} Arguments:
|
"{} Arguments:
|
||||||
|
@ -9,13 +9,20 @@ use crate::{
|
|||||||
};
|
};
|
||||||
use anyhow::{bail, Result};
|
use anyhow::{bail, Result};
|
||||||
use embuild::cmd;
|
use embuild::cmd;
|
||||||
use log::{info, warn};
|
use log::{debug, info, warn};
|
||||||
|
use regex::Regex;
|
||||||
|
use reqwest::header;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::{env, fs::remove_dir_all, path::PathBuf, process::Stdio};
|
use std::{env, fs::remove_dir_all, path::PathBuf, process::Stdio};
|
||||||
|
|
||||||
|
/// Xtensa Rust Toolchain repository
|
||||||
const DEFAULT_XTENSA_RUST_REPOSITORY: &str =
|
const DEFAULT_XTENSA_RUST_REPOSITORY: &str =
|
||||||
"https://github.com/esp-rs/rust-build/releases/download";
|
"https://github.com/esp-rs/rust-build/releases/download";
|
||||||
|
/// Xtensa Rust Toolchain API URL
|
||||||
|
const XTENSA_RUST_API_URL: &str = "https://api.github.com/repos/esp-rs/rust-build/releases/latest";
|
||||||
|
/// Xtensa Rust Toolchain version regex.
|
||||||
|
const RE_TOOLCHAIN_VERSION: &str = r"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)\.(?P<subpatch>0|[1-9]\d*)?$";
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
|
||||||
pub struct XtensaRust {
|
pub struct XtensaRust {
|
||||||
@ -42,6 +49,30 @@ pub struct XtensaRust {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl XtensaRust {
|
impl XtensaRust {
|
||||||
|
/// Get the latest version of Xtensa Rust toolchain.
|
||||||
|
pub fn get_latest_version() -> Result<String> {
|
||||||
|
let mut headers = header::HeaderMap::new();
|
||||||
|
headers.insert("Accept", "application/vnd.github.v3+json".parse().unwrap());
|
||||||
|
|
||||||
|
let client = reqwest::blocking::Client::builder()
|
||||||
|
.redirect(reqwest::redirect::Policy::none())
|
||||||
|
.user_agent("espup")
|
||||||
|
.build()
|
||||||
|
.unwrap();
|
||||||
|
let res = client
|
||||||
|
.get(XTENSA_RUST_API_URL)
|
||||||
|
.headers(headers)
|
||||||
|
.send()?
|
||||||
|
.text()?;
|
||||||
|
let json: serde_json::Value = serde_json::from_str(&res)?;
|
||||||
|
let mut version = json["tag_name"].to_string();
|
||||||
|
|
||||||
|
version.retain(|c| c != 'v' && c != '"');
|
||||||
|
Self::parse_version(&version)?;
|
||||||
|
debug!("{} Latest Xtensa Rust version: {}", emoji::DEBUG, version);
|
||||||
|
Ok(version)
|
||||||
|
}
|
||||||
|
|
||||||
/// Installs the Xtensa Rust toolchain.
|
/// Installs the Xtensa Rust toolchain.
|
||||||
pub fn install(&self) -> Result<()> {
|
pub fn install(&self) -> Result<()> {
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
@ -148,6 +179,19 @@ impl XtensaRust {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parses the version of the Xtensa toolchain.
|
||||||
|
pub fn parse_version(arg: &str) -> Result<String> {
|
||||||
|
debug!("{} Parsing Xtensa Rust version: {}", emoji::DEBUG, arg);
|
||||||
|
let re = Regex::new(RE_TOOLCHAIN_VERSION).unwrap();
|
||||||
|
if !re.is_match(arg) {
|
||||||
|
bail!(
|
||||||
|
"{} Invalid toolchain version, must be in the form of '<major>.<minor>.<patch>.<subpatch>'",
|
||||||
|
emoji::ERROR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Ok(arg.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
/// Removes the Xtensa Rust toolchain.
|
/// Removes the Xtensa Rust toolchain.
|
||||||
pub fn uninstall(&self) -> Result<()> {
|
pub fn uninstall(&self) -> Result<()> {
|
||||||
info!("{} Uninstalling Xtensa Rust toolchain", emoji::WRENCH);
|
info!("{} Uninstalling Xtensa Rust toolchain", emoji::WRENCH);
|
||||||
@ -264,3 +308,19 @@ fn install_rust_nightly(version: &str) -> Result<()> {
|
|||||||
.run()?;
|
.run()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::toolchain::rust::XtensaRust;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_xtensa_rust_parse_version() {
|
||||||
|
assert_eq!(XtensaRust::parse_version("1.45.0.0").unwrap(), "1.45.0.0");
|
||||||
|
assert_eq!(XtensaRust::parse_version("1.45.0.1").unwrap(), "1.45.0.1");
|
||||||
|
assert_eq!(XtensaRust::parse_version("1.1.1.1").unwrap(), "1.1.1.1");
|
||||||
|
assert!(XtensaRust::parse_version("a.1.1.1").is_err());
|
||||||
|
assert!(XtensaRust::parse_version("1.1.1.1.1").is_err());
|
||||||
|
assert!(XtensaRust::parse_version("1..1.1").is_err());
|
||||||
|
assert!(XtensaRust::parse_version("1._.*.1").is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user