Box clap args some more for uv init (#4796)

Fixes stack overflows in tests for
https://github.com/astral-sh/uv/pull/4791
This commit is contained in:
konsti 2024-07-04 19:22:24 +02:00 committed by GitHub
parent 35afcfd053
commit 892106fef0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 171 additions and 140 deletions

View file

@ -177,7 +177,7 @@ pub enum Commands {
Python(PythonNamespace), Python(PythonNamespace),
/// Manage Python projects. /// Manage Python projects.
#[command(flatten)] #[command(flatten)]
Project(ProjectCommand), Project(Box<ProjectCommand>),
/// Create a virtual environment. /// Create a virtual environment.
#[command(alias = "virtualenv", alias = "v")] #[command(alias = "virtualenv", alias = "v")]
Venv(VenvArgs), Venv(VenvArgs),

View file

@ -23,9 +23,10 @@ use uv_cli::{SelfCommand, SelfNamespace};
use uv_configuration::Concurrency; use uv_configuration::Concurrency;
use uv_distribution::Workspace; use uv_distribution::Workspace;
use uv_requirements::RequirementsSource; use uv_requirements::RequirementsSource;
use uv_settings::Combine; use uv_settings::{Combine, FilesystemOptions};
use crate::commands::ExitStatus; use crate::commands::ExitStatus;
use crate::printer::Printer;
use crate::settings::{ use crate::settings::{
CacheSettings, GlobalSettings, PipCheckSettings, PipCompileSettings, PipFreezeSettings, CacheSettings, GlobalSettings, PipCheckSettings, PipCompileSettings, PipFreezeSettings,
PipInstallSettings, PipListSettings, PipShowSettings, PipSyncSettings, PipUninstallSettings, PipInstallSettings, PipListSettings, PipShowSettings, PipSyncSettings, PipUninstallSettings,
@ -166,11 +167,11 @@ async fn run() -> Result<ExitStatus> {
// Configure the `Printer`, which controls user-facing output in the CLI. // Configure the `Printer`, which controls user-facing output in the CLI.
let printer = if globals.quiet { let printer = if globals.quiet {
printer::Printer::Quiet Printer::Quiet
} else if globals.verbose > 0 { } else if globals.verbose > 0 {
printer::Printer::Verbose Printer::Verbose
} else { } else {
printer::Printer::Default Printer::Default
}; };
// Configure the `warn!` macros, which control user-facing warnings in the CLI. // Configure the `warn!` macros, which control user-facing warnings in the CLI.
@ -636,141 +637,8 @@ async fn run() -> Result<ExitStatus> {
) )
.await .await
} }
Commands::Project(ProjectCommand::Run(args)) => { Commands::Project(project) => {
// Resolve the settings from the command-line arguments and workspace configuration. run_project(project, globals, filesystem, cache, printer).await
let args = settings::RunSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
let requirements = args
.with
.into_iter()
.map(RequirementsSource::from_package)
.collect::<Vec<_>>();
commands::run(
args.command,
requirements,
args.package,
args.extras,
args.dev,
args.python,
args.settings,
globals.isolated,
globals.preview,
globals.python_preference,
globals.python_fetch,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
Commands::Project(ProjectCommand::Sync(args)) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::SyncSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
commands::sync(
args.extras,
args.dev,
args.modifications,
args.python,
globals.python_preference,
globals.python_fetch,
args.settings,
globals.preview,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
Commands::Project(ProjectCommand::Lock(args)) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::LockSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
commands::lock(
args.python,
args.settings,
globals.preview,
globals.python_preference,
globals.python_fetch,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
Commands::Project(ProjectCommand::Add(args)) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::AddSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
commands::add(
args.requirements,
args.editable,
args.dependency_type,
args.raw_sources,
args.rev,
args.tag,
args.branch,
args.extras,
args.package,
args.python,
args.settings,
globals.python_preference,
globals.python_fetch,
globals.preview,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
Commands::Project(ProjectCommand::Remove(args)) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::RemoveSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?;
commands::remove(
args.requirements,
args.dependency_type,
args.package,
args.python,
globals.python_preference,
globals.python_fetch,
globals.preview,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
} }
#[cfg(feature = "self-update")] #[cfg(feature = "self-update")]
Commands::Self_(SelfNamespace { Commands::Self_(SelfNamespace {
@ -943,6 +811,169 @@ async fn run() -> Result<ExitStatus> {
} }
} }
/// Run a [`ProjectCommand`].
async fn run_project(
project_command: Box<ProjectCommand>,
globals: GlobalSettings,
filesystem: Option<FilesystemOptions>,
cache: Cache,
printer: Printer,
) -> Result<ExitStatus> {
// Write out any resolved settings.
macro_rules! show_settings {
($arg:expr) => {
if globals.show_settings {
writeln!(printer.stdout(), "{:#?}", $arg)?;
return Ok(ExitStatus::Success);
}
};
($arg:expr, false) => {
if globals.show_settings {#
writeln!(printer.stdout(), "{:#?}", $arg)?;
}
};
}
match *project_command {
ProjectCommand::Run(args) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::RunSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
let requirements = args
.with
.into_iter()
.map(RequirementsSource::from_package)
.collect::<Vec<_>>();
commands::run(
args.command,
requirements,
args.package,
args.extras,
args.dev,
args.python,
args.settings,
globals.isolated,
globals.preview,
globals.python_preference,
globals.python_fetch,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
ProjectCommand::Sync(args) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::SyncSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
commands::sync(
args.extras,
args.dev,
args.modifications,
args.python,
globals.python_preference,
globals.python_fetch,
args.settings,
globals.preview,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
ProjectCommand::Lock(args) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::LockSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
commands::lock(
args.python,
args.settings,
globals.preview,
globals.python_preference,
globals.python_fetch,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
ProjectCommand::Add(args) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::AddSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?.with_refresh(args.refresh);
commands::add(
args.requirements,
args.editable,
args.dependency_type,
args.raw_sources,
args.rev,
args.tag,
args.branch,
args.extras,
args.package,
args.python,
args.settings,
globals.python_preference,
globals.python_fetch,
globals.preview,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
ProjectCommand::Remove(args) => {
// Resolve the settings from the command-line arguments and workspace configuration.
let args = settings::RemoveSettings::resolve(args, filesystem);
show_settings!(args);
// Initialize the cache.
let cache = cache.init()?;
commands::remove(
args.requirements,
args.dependency_type,
args.package,
args.python,
globals.python_preference,
globals.python_fetch,
globals.preview,
globals.connectivity,
Concurrency::default(),
globals.native_tls,
&cache,
printer,
)
.await
}
}
}
fn main() -> ExitCode { fn main() -> ExitCode {
let result = if let Ok(stack_size) = env::var("UV_STACK_SIZE") { let result = if let Ok(stack_size) = env::var("UV_STACK_SIZE") {
// Artificially limit or increase the stack size to test without stack overflows in debug // Artificially limit or increase the stack size to test without stack overflows in debug