Fixup diagnostic_endpoint setting to be more flexible (#374)
* Fixup diagnostic_endpoint setting to be more flexible * Fixup doctests
This commit is contained in:
parent
b7839953dc
commit
709e81565c
|
@ -163,7 +163,7 @@ impl Planner for MyPlanner {
|
|||
.into_keys()
|
||||
.collect::<Vec<_>>(),
|
||||
self.common.ssl_cert_file.clone(),
|
||||
))
|
||||
)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -65,18 +65,22 @@ pub struct DiagnosticData {
|
|||
|
||||
impl DiagnosticData {
|
||||
pub fn new(
|
||||
endpoint: Option<Url>,
|
||||
endpoint: Option<String>,
|
||||
planner: String,
|
||||
configured_settings: Vec<String>,
|
||||
ssl_cert_file: Option<PathBuf>,
|
||||
) -> Self {
|
||||
) -> Result<Self, DiagnosticError> {
|
||||
let endpoint = match endpoint {
|
||||
Some(endpoint) => diagnostic_endpoint_parser(&endpoint)?,
|
||||
None => None,
|
||||
};
|
||||
let (os_name, os_version) = match OsRelease::new() {
|
||||
Ok(os_release) => (os_release.name, os_release.version),
|
||||
Err(_) => ("unknown".into(), "unknown".into()),
|
||||
};
|
||||
let is_ci = is_ci::cached()
|
||||
|| std::env::var("NIX_INSTALLER_CI").unwrap_or_else(|_| "0".into()) == "1";
|
||||
Self {
|
||||
Ok(Self {
|
||||
endpoint,
|
||||
version: env!("CARGO_PKG_VERSION").into(),
|
||||
planner,
|
||||
|
@ -87,7 +91,7 @@ impl DiagnosticData {
|
|||
is_ci,
|
||||
ssl_cert_file,
|
||||
failure_chain: None,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn failure(mut self, err: &NixInstallerError) -> Self {
|
||||
|
@ -215,6 +219,13 @@ pub enum DiagnosticError {
|
|||
#[source]
|
||||
reqwest::Error,
|
||||
),
|
||||
/// Parsing URL
|
||||
#[error("Parsing URL")]
|
||||
Parse(
|
||||
#[source]
|
||||
#[from]
|
||||
url::ParseError,
|
||||
),
|
||||
#[error("Write path `{0}`")]
|
||||
Write(std::path::PathBuf, #[source] std::io::Error),
|
||||
#[error("Serializing receipt")]
|
||||
|
@ -237,3 +248,24 @@ impl ErrorDiagnostic for DiagnosticError {
|
|||
return static_str.to_string();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn diagnostic_endpoint_parser(input: &str) -> Result<Option<Url>, DiagnosticError> {
|
||||
match Url::parse(input) {
|
||||
Ok(v) => match v.scheme() {
|
||||
"https" | "http" | "file" => Ok(Some(v)),
|
||||
_ => Err(DiagnosticError::UnknownUrlScheme),
|
||||
},
|
||||
Err(url_error) if url_error == url::ParseError::RelativeUrlWithoutBase => {
|
||||
match Url::parse(&format!("file://{input}")) {
|
||||
Ok(v) => Ok(Some(v)),
|
||||
Err(file_error) => Err(file_error)?,
|
||||
}
|
||||
},
|
||||
Err(url_error) => Err(url_error)?,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn diagnostic_endpoint_validator(input: &str) -> Result<String, DiagnosticError> {
|
||||
let _ = diagnostic_endpoint_parser(input)?;
|
||||
Ok(input.to_string())
|
||||
}
|
||||
|
|
|
@ -135,7 +135,7 @@ impl Planner for Linux {
|
|||
.into_keys()
|
||||
.collect::<Vec<_>>(),
|
||||
self.settings.ssl_cert_file.clone(),
|
||||
))
|
||||
)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -211,7 +211,7 @@ impl Planner for Macos {
|
|||
.into_keys()
|
||||
.collect::<Vec<_>>(),
|
||||
self.settings.ssl_cert_file.clone(),
|
||||
))
|
||||
)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,7 @@ impl Planner for MyPlanner {
|
|||
.into_keys()
|
||||
.collect::<Vec<_>>(),
|
||||
self.common.ssl_cert_file.clone(),
|
||||
))
|
||||
)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -317,6 +317,9 @@ pub enum PlannerError {
|
|||
NixExists,
|
||||
#[error("WSL1 is not supported, please upgrade to WSL2: https://learn.microsoft.com/en-us/windows/wsl/install#upgrade-version-from-wsl-1-to-wsl-2")]
|
||||
Wsl1,
|
||||
#[cfg(feature = "diagnostics")]
|
||||
#[error(transparent)]
|
||||
Diagnostic(#[from] crate::diagnostics::DiagnosticError),
|
||||
}
|
||||
|
||||
impl HasExpectedErrors for PlannerError {
|
||||
|
@ -334,6 +337,8 @@ impl HasExpectedErrors for PlannerError {
|
|||
this @ PlannerError::NixOs => Some(Box::new(this)),
|
||||
this @ PlannerError::NixExists => Some(Box::new(this)),
|
||||
this @ PlannerError::Wsl1 => Some(Box::new(this)),
|
||||
#[cfg(feature = "diagnostics")]
|
||||
PlannerError::Diagnostic(diagnostic_error) => Some(Box::new(diagnostic_error)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -287,7 +287,7 @@ impl Planner for SteamDeck {
|
|||
.into_keys()
|
||||
.collect::<Vec<_>>(),
|
||||
self.settings.ssl_cert_file.clone(),
|
||||
))
|
||||
)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -214,14 +214,16 @@ pub struct CommonSettings {
|
|||
/// "status": "Success"
|
||||
/// }
|
||||
///
|
||||
/// To disable diagnostic reporting, unset the default with `--diagnostic-endpoint=`
|
||||
/// To disable diagnostic reporting, unset the default with `--diagnostic-endpoint ""`, or `NIX_INSTALLER_DIAGNOSTIC_ENDPOINT=""`
|
||||
#[clap(
|
||||
long,
|
||||
env = "NIX_INSTALLER_DIAGNOSTIC_ENDPOINT",
|
||||
global = true,
|
||||
default_value = "https://install.determinate.systems/nix/diagnostic"
|
||||
value_parser = crate::diagnostics::diagnostic_endpoint_validator,
|
||||
num_args = 0..=1, // Required to allow `--diagnostic-endpoint` or `NIX_INSTALLER_DIAGNOSTIC_ENDPOINT=""`
|
||||
default_missing_value = "https://install.determinate.systems/nix/diagnostic"
|
||||
)]
|
||||
pub diagnostic_endpoint: Option<Url>,
|
||||
pub diagnostic_endpoint: Option<String>,
|
||||
}
|
||||
|
||||
impl CommonSettings {
|
||||
|
@ -285,9 +287,7 @@ impl CommonSettings {
|
|||
force: false,
|
||||
ssl_cert_file: Default::default(),
|
||||
#[cfg(feature = "diagnostics")]
|
||||
diagnostic_endpoint: Some(
|
||||
"https://install.determinate.systems/nix/diagnostic".try_into()?,
|
||||
),
|
||||
diagnostic_endpoint: Some("https://install.determinate.systems/nix/diagnostic".into()),
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue