Skip to content

Commit 5ded270

Browse files
committed
feat: do not use system package managers by default
resolves #364 Actually, the default depends on the state of a CI env var. - if CI env var is present and its value is one of "true", "on", or "1", then system package managers are used by default. - if CI is not present (or its value is not "true", "on", or "1"), then the new `--mod-sys` switch can allow explicit opt-in to use system package managers.
1 parent 7253c7c commit 5ded270

4 files changed

Lines changed: 40 additions & 12 deletions

File tree

clang-tools-manager/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ required-features = ["bin"]
2121
[dependencies]
2222
anyhow = { workspace = true, optional = true }
2323
blake2 = "0.10.6"
24-
clap = { workspace = true, features = ["derive"], optional = true }
24+
clap = { workspace = true, features = ["derive", "env"], optional = true }
2525
colored = { workspace = true, optional = true }
2626
directories = "6.0.0"
2727
log = { workspace = true }

clang-tools-manager/src/main.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,19 @@ pub struct CliOptions {
138138
/// This will only overwrite an existing symlink.
139139
#[arg(short, long)]
140140
pub force: bool,
141+
142+
/// Whether to use the system's available package managers.
143+
///
144+
/// This matches the value of a CI environment variable.
145+
/// For non-CI contexts, this allows users to opt-in to using
146+
/// system package managers as a fallback in case PyPI offerings
147+
/// are unsatisfactory.
148+
///
149+
/// If system package managers are not allowed or fail, then
150+
/// static binaries built by cpp-linter are sought (for
151+
/// compatible platforms).
152+
#[arg(long, action = clap::ArgAction::SetTrue, env = "CI")]
153+
pub mod_sys: bool,
141154
}
142155

143156
#[tokio::main]
@@ -161,7 +174,7 @@ async fn main() -> Result<()> {
161174
let mut map_tools = HashMap::new();
162175
for t in tool {
163176
if let Some(version) = req_ver
164-
.eval_tool(&t, options.force, options.directory.as_ref())
177+
.eval_tool(&t, options.force, options.directory.as_ref(), options.mod_sys)
165178
.await?
166179
{
167180
map_tools.entry(t).or_insert(version);

clang-tools-manager/src/version.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ impl RequestedVersion {
7878
tool: &ClangTool,
7979
overwrite_symlink: bool,
8080
directory: Option<&PathBuf>,
81+
allow_system_package_manager: bool,
8182
) -> Result<Option<ClangVersion>, GetToolError> {
8283
match self {
8384
RequestedVersion::Path(_) => {
@@ -139,8 +140,9 @@ impl RequestedVersion {
139140
Ok(bin) => bin,
140141
Err(e) => {
141142
log::error!("Failed to download {tool} {version_req} from PyPi: {e}");
142-
if let Some(result) =
143-
try_install_package(tool, version_req, &min_ver).await?
143+
if allow_system_package_manager
144+
&& let Some(result) =
145+
try_install_package(tool, version_req, &min_ver).await?
144146
{
145147
return Ok(Some(result));
146148
}
@@ -245,7 +247,7 @@ impl FromStr for RequestedVersion {
245247

246248
#[cfg(test)]
247249
mod tests {
248-
use std::{path::PathBuf, str::FromStr};
250+
use std::{env, path::PathBuf, str::FromStr};
249251

250252
use semver::VersionReq;
251253
use tempfile::TempDir;
@@ -281,7 +283,7 @@ mod tests {
281283
#[tokio::test]
282284
async fn eval_no_value() {
283285
let result = RequestedVersion::NoValue
284-
.eval_tool(&ClangTool::ClangFormat, false, None)
286+
.eval_tool(&ClangTool::ClangFormat, false, None, false)
285287
.await
286288
.unwrap();
287289
assert!(result.is_none());
@@ -301,14 +303,19 @@ mod tests {
301303
let version_req =
302304
VersionReq::parse(option_env!("MIN_CLANG_TOOLS_VERSION").unwrap_or("16")).unwrap();
303305
let downloaded_clang = RequestedVersion::Requirement(version_req.clone())
304-
.eval_tool(&tool, false, Some(&PathBuf::from(tmp_cache_dir.path())))
306+
.eval_tool(
307+
&tool,
308+
false,
309+
Some(&PathBuf::from(tmp_cache_dir.path())),
310+
false,
311+
)
305312
.await
306313
.unwrap()
307314
.unwrap();
308315
println!("Downloaded clang-format: {downloaded_clang:?}");
309316
let req_ver = RequestedVersion::Path(downloaded_clang.path.parent().unwrap().to_owned());
310317
let result = req_ver
311-
.eval_tool(&tool, false, None)
318+
.eval_tool(&tool, false, None, false)
312319
.await
313320
.unwrap()
314321
.unwrap();
@@ -331,7 +338,13 @@ mod tests {
331338
let version_req = VersionReq::parse(clang_version).unwrap();
332339
println!("Installing {tool} with version requirement: {version_req}");
333340
let clang_path = RequestedVersion::Requirement(version_req.clone())
334-
.eval_tool(&tool, false, None)
341+
.eval_tool(
342+
&tool,
343+
false,
344+
None,
345+
env::var("CI")
346+
.is_ok_and(|v| ["true", "on", "1"].contains(&v.to_lowercase().as_str())),
347+
)
335348
.await
336349
.unwrap()
337350
.unwrap();

cpp-linter/src/clang_tools/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//! clang-tidy.
33
44
use std::{
5-
fs,
5+
env, fs,
66
path::PathBuf,
77
sync::{Arc, Mutex},
88
};
@@ -105,10 +105,12 @@ pub async fn capture_clang_tools_output(
105105
let mut clang_versions = ClangVersions::default();
106106
// find the executable paths for clang-tidy and/or clang-format and show version
107107
// info as debugging output.
108+
let in_ci =
109+
env::var("CI").is_ok_and(|v| ["true", "on", "1"].contains(&v.to_lowercase().as_str()));
108110
if clang_params.tidy_checks != "-*" {
109111
let tool = ClangTool::ClangTidy;
110112
let tool_info = version
111-
.eval_tool(&tool, false, None)
113+
.eval_tool(&tool, false, None, in_ci)
112114
.await?
113115
.ok_or(ClangTaskError::FindToolError(tool.as_str()))?;
114116
log::info!(
@@ -123,7 +125,7 @@ pub async fn capture_clang_tools_output(
123125
if !clang_params.style.is_empty() {
124126
let tool = ClangTool::ClangFormat;
125127
let tool_info = version
126-
.eval_tool(&tool, false, None)
128+
.eval_tool(&tool, false, None, in_ci)
127129
.await?
128130
.ok_or(ClangTaskError::FindToolError(tool.as_str()))?;
129131
log::info!(

0 commit comments

Comments
 (0)