From 5847c7b10eead1105cb19d76199599a820789501 Mon Sep 17 00:00:00 2001 From: Bill Avery Date: Mon, 22 Sep 2025 20:04:12 -0700 Subject: [PATCH] feat: add --mirror-url cli args --- download-cef/src/lib.rs | 71 +++++++++++++++++++++++++++++++--- export-cef-dir/src/main.rs | 19 ++++++--- get-latest/src/main.rs | 18 ++++++--- sys/build.rs | 7 ++-- update-bindings/src/main.rs | 14 +++++-- update-bindings/src/upgrade.rs | 2 +- 6 files changed, 107 insertions(+), 24 deletions(-) diff --git a/download-cef/src/lib.rs b/download-cef/src/lib.rs index e4bb594..3f2ceb8 100644 --- a/download-cef/src/lib.rs +++ b/download-cef/src/lib.rs @@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize}; use sha1_smol::Sha1; use std::{ collections::HashMap, + env, fmt::{self, Display}, fs::{self, File}, io::{self, BufReader, IsTerminal, Write}, @@ -128,6 +129,10 @@ where pub const DEFAULT_CDN_URL: &str = "https://cef-builds.spotifycdn.com"; +pub fn default_download_url() -> String { + env::var("CEF_DOWNLOAD_URL").unwrap_or(DEFAULT_CDN_URL.to_owned()) +} + #[derive(Clone, PartialEq, Eq, Deserialize, Serialize, ValueEnum)] #[serde(rename_all = "lowercase")] pub enum Channel { @@ -157,7 +162,11 @@ pub struct CefIndex { } impl CefIndex { - pub fn download(url: &str) -> Result { + pub fn download() -> Result { + Self::download_from(DEFAULT_CDN_URL) + } + + pub fn download_from(url: &str) -> Result { Ok(ureq::get(&format!("{url}/index.json")) .call()? .into_body() @@ -224,7 +233,14 @@ pub struct CefVersion { } impl CefVersion { - pub fn download_archive

( + pub fn download_archive

(&self, location: P, show_progress: bool) -> Result + where + P: AsRef, + { + self.download_archive_from(DEFAULT_CDN_URL, location, show_progress) + } + + pub fn download_archive_from

( &self, url: &str, location: P, @@ -312,6 +328,25 @@ impl CefVersion { } pub fn download_archive_with_retry

( + &self, + location: P, + show_progress: bool, + retry_delay: Duration, + max_retries: u32, + ) -> Result + where + P: AsRef, + { + self.download_archive_with_retry_from( + DEFAULT_CDN_URL, + location, + show_progress, + retry_delay, + max_retries, + ) + } + + pub fn download_archive_with_retry_from

( &self, url: &str, location: P, @@ -322,7 +357,7 @@ impl CefVersion { where P: AsRef, { - let mut result = self.download_archive(&url, &location, show_progress); + let mut result = self.download_archive_from(&url, &location, show_progress); let mut retry = 0; while let Err(Error::Io(_)) = &result { @@ -333,7 +368,7 @@ impl CefVersion { retry += 1; thread::sleep(retry_delay * retry); - result = self.download_archive(&url, &location, show_progress); + result = self.download_archive_from(&url, &location, show_progress); } result @@ -393,6 +428,24 @@ impl TryFrom<&Path> for CefFile { } pub fn download_target_archive

( + target: &str, + cef_version: &str, + location: P, + show_progress: bool, +) -> Result +where + P: AsRef, +{ + download_target_archive_from( + DEFAULT_CDN_URL, + target, + cef_version, + location, + show_progress, + ) +} + +pub fn download_target_archive_from

( url: &str, target: &str, cef_version: &str, @@ -406,11 +459,17 @@ where println!("Downloading CEF archive for {target}..."); } - let index = CefIndex::download(&url)?; + let index = CefIndex::download_from(&url)?; let platform = index.platform(target)?; let version = platform.version(cef_version)?; - version.download_archive_with_retry(url, location, show_progress, Duration::from_secs(15), 3) + version.download_archive_with_retry_from( + url, + location, + show_progress, + Duration::from_secs(15), + 3, + ) } pub fn extract_target_archive( diff --git a/export-cef-dir/src/main.rs b/export-cef-dir/src/main.rs index 577d2ca..943990c 100644 --- a/export-cef-dir/src/main.rs +++ b/export-cef-dir/src/main.rs @@ -1,7 +1,7 @@ #![doc = include_str!("../README.md")] use clap::Parser; -use download_cef::{CefFile, CefIndex, OsAndArch, DEFAULT_CDN_URL, DEFAULT_TARGET}; +use download_cef::{CefFile, CefIndex, OsAndArch, DEFAULT_TARGET}; use std::{ fs, path::{Path, PathBuf}, @@ -16,6 +16,13 @@ fn default_version() -> &'static str { .as_str() } +fn default_download_url() -> &'static str { + static DEFAULT_DOWNLOAD_URL: OnceLock = OnceLock::new(); + DEFAULT_DOWNLOAD_URL + .get_or_init(|| download_cef::default_download_url()) + .as_str() +} + #[derive(Parser, Debug)] #[command(about, long_about = None)] struct Args { @@ -27,6 +34,8 @@ struct Args { target: String, #[arg(short, long, default_value = default_version())] version: String, + #[arg(short, long, default_value = default_download_url())] + mirror_url: String, #[arg(short, long)] archive: Option, output: String, @@ -35,7 +44,7 @@ struct Args { fn main() -> anyhow::Result<()> { let args = Args::parse(); let output = PathBuf::from(args.output); - let url = std::env::var("CEF_DOWNLOAD_URL").unwrap_or(DEFAULT_CDN_URL.into()); + let url = args.mirror_url.as_str(); let parent = PathBuf::from( output @@ -86,12 +95,12 @@ fn main() -> anyhow::Result<()> { } None => { let cef_version = args.version.as_str(); - let index = CefIndex::download(url.as_str())?; + let index = CefIndex::download_from(url)?; let platform = index.platform(target)?; let version = platform.version(cef_version)?; - let archive = version.download_archive_with_retry( - url.as_str(), + let archive = version.download_archive_with_retry_from( + url, &parent, true, Duration::from_secs(15), diff --git a/get-latest/src/main.rs b/get-latest/src/main.rs index 6ff53bf..f060b18 100644 --- a/get-latest/src/main.rs +++ b/get-latest/src/main.rs @@ -4,9 +4,7 @@ extern crate thiserror; use clap::Parser; -use download_cef::{ - CefIndex, Channel, DEFAULT_CDN_URL, LINUX_TARGETS, MACOS_TARGETS, WINDOWS_TARGETS, -}; +use download_cef::{CefIndex, Channel, LINUX_TARGETS, MACOS_TARGETS, WINDOWS_TARGETS}; use git_cliff::args::*; use regex::Regex; use semver::{BuildMetadata, Version}; @@ -15,6 +13,7 @@ use std::{ io::Write, path::PathBuf, process::{Command, ExitStatus}, + sync::OnceLock, }; use toml_edit::{value, DocumentMut}; @@ -42,9 +41,18 @@ enum Error { type Result = std::result::Result; +fn default_download_url() -> &'static str { + static DEFAULT_DOWNLOAD_URL: OnceLock = OnceLock::new(); + DEFAULT_DOWNLOAD_URL + .get_or_init(|| download_cef::default_download_url()) + .as_str() +} + #[derive(Parser)] #[command(about, long_about = None)] struct Args { + #[arg(short, long, default_value = default_download_url())] + mirror_url: String, #[arg(short, long, default_value = "stable")] channel: Channel, #[arg(short, long)] @@ -56,9 +64,9 @@ fn main() -> Result<()> { let args = Args::parse(); let channel = args.channel; - let url = std::env::var("CEF_DOWNLOAD_URL").unwrap_or(DEFAULT_CDN_URL.into()); + let url = args.mirror_url.as_str(); - let index = CefIndex::download(url.as_str())?; + let index = CefIndex::download_from(url)?; let latest_versions: Vec<_> = LINUX_TARGETS .iter() .chain(MACOS_TARGETS.iter()) diff --git a/sys/build.rs b/sys/build.rs index e6d015e..cfde33b 100644 --- a/sys/build.rs +++ b/sys/build.rs @@ -1,13 +1,12 @@ #[cfg(not(feature = "dox"))] fn main() -> anyhow::Result<()> { - use download_cef::{CefIndex, OsAndArch, DEFAULT_CDN_URL}; + use download_cef::{CefIndex, OsAndArch}; use std::{env, fs, path::PathBuf}; println!("cargo::rerun-if-changed=build.rs"); let target = env::var("TARGET")?; let os_arch = OsAndArch::try_from(target.as_str())?; - let url = std::env::var("CEF_DOWNLOAD_URL").unwrap_or(DEFAULT_CDN_URL.into()); println!("cargo::rerun-if-env-changed=FLATPAK"); println!("cargo::rerun-if-env-changed=CEF_PATH"); @@ -29,11 +28,11 @@ fn main() -> anyhow::Result<()> { if !fs::exists(&cef_dir)? { let cef_version = download_cef::default_version(&env::var("CARGO_PKG_VERSION")?); - let index = CefIndex::download(url.as_str())?; + let index = CefIndex::download()?; let platform = index.platform(&target)?; let version = platform.version(&cef_version)?; - let archive = version.download_archive(url.as_str(), &out_dir, false)?; + let archive = version.download_archive(&out_dir, false)?; let extracted_dir = download_cef::extract_target_archive(&target, &archive, &out_dir, false)?; if extracted_dir != cef_dir { diff --git a/update-bindings/src/main.rs b/update-bindings/src/main.rs index 1f5f4a0..03baad0 100644 --- a/update-bindings/src/main.rs +++ b/update-bindings/src/main.rs @@ -4,7 +4,7 @@ extern crate thiserror; use clap::Parser; -use download_cef::{DEFAULT_CDN_URL, DEFAULT_TARGET}; +use download_cef::DEFAULT_TARGET; use std::{fs, io::Read, path::Path, sync::OnceLock}; #[derive(Debug, Error)] @@ -38,6 +38,13 @@ fn default_version() -> &'static str { .as_str() } +fn default_download_url() -> &'static str { + static DEFAULT_DOWNLOAD_URL: OnceLock = OnceLock::new(); + DEFAULT_DOWNLOAD_URL + .get_or_init(|| download_cef::default_download_url()) + .as_str() +} + #[derive(Parser, Debug)] #[command(about, long_about = None)] struct Args { @@ -49,16 +56,17 @@ struct Args { target: String, #[arg(short, long, default_value = default_version())] version: String, + #[arg(short, long, default_value = default_download_url())] + mirror_url: String, } fn main() -> Result<()> { let args = Args::parse(); let target = args.target.as_str(); - let url = std::env::var("CEF_DOWNLOAD_URL").unwrap_or(DEFAULT_CDN_URL.into()); if args.bindgen { if args.download { - let _ = upgrade::download(url.as_str(), target, args.version.as_str()); + let _ = upgrade::download(args.mirror_url.as_str(), target, args.version.as_str()); } upgrade::sys_bindgen(target)?; diff --git a/update-bindings/src/upgrade.rs b/update-bindings/src/upgrade.rs index e0e9788..fb98090 100755 --- a/update-bindings/src/upgrade.rs +++ b/update-bindings/src/upgrade.rs @@ -22,7 +22,7 @@ pub fn download(url: &str, target: &str, version: &str) -> PathBuf { assert!(TARGETS.contains(&target), "unsupported target {target}"); let archive = - download_cef::download_target_archive(url, target, version, dirs::get_out_dir(), true) + download_cef::download_target_archive_from(url, target, version, dirs::get_out_dir(), true) .expect("download failed"); download_cef::extract_target_archive(target, &archive, dirs::get_out_dir(), true)