Skip to content

Commit

Permalink
Make --directory a global argument (#5579)
Browse files Browse the repository at this point in the history
## Summary

Cargo makes this global (and uses the same technique). It's still hidden
so we can always decide to remove it.
  • Loading branch information
charliermarsh authored Jul 29, 2024
1 parent 3e32902 commit c46adee
Show file tree
Hide file tree
Showing 7 changed files with 18 additions and 59 deletions.
16 changes: 4 additions & 12 deletions crates/uv-cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ pub struct GlobalArgs {
/// Hides all progress outputs when set
#[arg(global = true, long)]
pub no_progress: bool,

/// Change to the given directory prior to running the command.
#[arg(global = true, long, hide = true)]
pub directory: Option<PathBuf>,
}

#[derive(Debug, Copy, Clone, clap::ValueEnum)]
Expand Down Expand Up @@ -1932,10 +1936,6 @@ pub struct RunArgs {
/// - `/home/ferris/.local/bin/python3.10` uses the exact Python at the given path.
#[arg(long, short, env = "UV_PYTHON", verbatim_doc_comment)]
pub python: Option<String>,

/// The path to the project. Defaults to the current working directory.
#[arg(long, hide = true)]
pub directory: Option<PathBuf>,
}

#[derive(Args)]
Expand Down Expand Up @@ -2000,10 +2000,6 @@ pub struct SyncArgs {
/// - `/home/ferris/.local/bin/python3.10` uses the exact Python at the given path.
#[arg(long, short, env = "UV_PYTHON", verbatim_doc_comment)]
pub python: Option<String>,

/// The path to the project. Defaults to the current working directory.
#[arg(long, hide = true)]
pub directory: Option<PathBuf>,
}

#[derive(Args)]
Expand Down Expand Up @@ -2039,10 +2035,6 @@ pub struct LockArgs {
/// - `/home/ferris/.local/bin/python3.10` uses the exact Python at the given path.
#[arg(long, short, env = "UV_PYTHON", verbatim_doc_comment)]
pub python: Option<String>,

/// The path to the project. Defaults to the current working directory.
#[arg(long, hide = true)]
pub directory: Option<PathBuf>,
}

#[derive(Args)]
Expand Down
12 changes: 2 additions & 10 deletions crates/uv/src/commands/project/lock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

use std::collections::BTreeSet;
use std::fmt::Write;
use std::path::PathBuf;

use anstream::eprint;
use owo_colors::OwoColorize;
Expand All @@ -17,7 +16,7 @@ use uv_client::{Connectivity, FlatIndexClient, RegistryClientBuilder};
use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode, Reinstall, SetupPyStrategy};
use uv_dispatch::BuildDispatch;
use uv_distribution::DEV_DEPENDENCIES;
use uv_fs::{Simplified, CWD};
use uv_fs::CWD;
use uv_git::ResolvedRepositoryReference;
use uv_normalize::PackageName;
use uv_python::{Interpreter, PythonFetch, PythonPreference, PythonRequest};
Expand Down Expand Up @@ -49,7 +48,6 @@ pub(crate) async fn lock(
frozen: bool,
python: Option<String>,
settings: ResolverSettings,
directory: Option<PathBuf>,
preview: PreviewMode,
python_preference: PythonPreference,
python_fetch: PythonFetch,
Expand All @@ -63,14 +61,8 @@ pub(crate) async fn lock(
warn_user_once!("`uv lock` is experimental and may change without warning");
}

let directory = if let Some(directory) = directory {
directory.simple_canonicalize()?
} else {
CWD.to_path_buf()
};

// Find the project requirements.
let workspace = Workspace::discover(&directory, &DiscoveryOptions::default()).await?;
let workspace = Workspace::discover(&CWD, &DiscoveryOptions::default()).await?;

// Find an interpreter for the project
let interpreter = FoundInterpreter::discover(
Expand Down
13 changes: 3 additions & 10 deletions crates/uv/src/commands/project/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ pub(crate) async fn run(
extras: ExtrasSpecification,
dev: bool,
python: Option<String>,
directory: Option<PathBuf>,
settings: ResolverInstallerSettings,
isolated: bool,
preview: PreviewMode,
Expand Down Expand Up @@ -90,12 +89,6 @@ pub(crate) async fn run(

let reporter = PythonDownloadReporter::single(printer);

let directory = if let Some(directory) = directory {
directory.simple_canonicalize()?
} else {
CWD.to_path_buf()
};

// Determine whether the command to execute is a PEP 723 script.
let script_interpreter = if let RunCommand::Python(target, _) = &command {
if let Some(metadata) = uv_scripts::read_pep723_metadata(&target).await? {
Expand All @@ -109,7 +102,7 @@ pub(crate) async fn run(
let python_request = if let Some(request) = python.as_deref() {
Some(PythonRequest::parse(request))
// (2) Request from `.python-version`
} else if let Some(request) = request_from_version_file(&directory).await? {
} else if let Some(request) = request_from_version_file(&CWD).await? {
Some(request)
// (3) `Requires-Python` in `pyproject.toml`
} else {
Expand Down Expand Up @@ -174,13 +167,13 @@ pub(crate) async fn run(
// We need a workspace, but we don't need to have a current package, we can be e.g. in
// the root of a virtual workspace and then switch into the selected package.
Some(VirtualProject::Project(
Workspace::discover(&directory, &DiscoveryOptions::default())
Workspace::discover(&CWD, &DiscoveryOptions::default())
.await?
.with_current_project(package.clone())
.with_context(|| format!("Package `{package}` not found in workspace"))?,
))
} else {
match VirtualProject::discover(&directory, &DiscoveryOptions::default()).await {
match VirtualProject::discover(&CWD, &DiscoveryOptions::default()).await {
Ok(project) => Some(project),
Err(WorkspaceError::MissingPyprojectToml) => None,
Err(WorkspaceError::NonWorkspace(_)) => None,
Expand Down
13 changes: 2 additions & 11 deletions crates/uv/src/commands/project/sync.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::path::PathBuf;

use anyhow::Result;

use uv_auth::store_credentials_from_url;
Expand All @@ -10,7 +8,7 @@ use uv_configuration::{
};
use uv_dispatch::BuildDispatch;
use uv_distribution::DEV_DEPENDENCIES;
use uv_fs::{Simplified, CWD};
use uv_fs::CWD;
use uv_installer::SitePackages;
use uv_python::{PythonEnvironment, PythonFetch, PythonPreference, PythonRequest};
use uv_resolver::{FlatIndex, Lock};
Expand All @@ -37,7 +35,6 @@ pub(crate) async fn sync(
python_preference: PythonPreference,
python_fetch: PythonFetch,
settings: ResolverInstallerSettings,
directory: Option<PathBuf>,
preview: PreviewMode,
connectivity: Connectivity,
concurrency: Concurrency,
Expand All @@ -49,14 +46,8 @@ pub(crate) async fn sync(
warn_user_once!("`uv sync` is experimental and may change without warning");
}

let directory = if let Some(directory) = directory {
directory.simple_canonicalize()?
} else {
CWD.to_path_buf()
};

// Identify the project
let project = VirtualProject::discover(&directory, &DiscoveryOptions::default()).await?;
let project = VirtualProject::discover(&CWD, &DiscoveryOptions::default()).await?;

// Discover or create the virtual environment.
let venv = project::get_or_init_environment(
Expand Down
8 changes: 5 additions & 3 deletions crates/uv/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ async fn run(cli: Cli) -> Result<ExitStatus> {
uv_warnings::enable();
}

// Switch directories as early as possible.
if let Some(directory) = cli.global_args.directory.as_ref() {
std::env::set_current_dir(directory)?;
}

// Load configuration from the filesystem, prioritizing (in order):
// 1. The configuration file specified on the command-line.
// 2. The configuration file in the current workspace (i.e., the `pyproject.toml` or `uv.toml`
Expand Down Expand Up @@ -915,7 +920,6 @@ async fn run_project(
args.extras,
args.dev,
args.python,
args.directory,
args.settings,
globals.isolated,
globals.preview,
Expand Down Expand Up @@ -949,7 +953,6 @@ async fn run_project(
globals.python_preference,
globals.python_fetch,
args.settings,
args.directory,
globals.preview,
globals.connectivity,
Concurrency::default(),
Expand All @@ -972,7 +975,6 @@ async fn run_project(
args.frozen,
args.python,
args.settings,
args.directory,
globals.preview,
globals.python_preference,
globals.python_fetch,
Expand Down
9 changes: 0 additions & 9 deletions crates/uv/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,6 @@ pub(crate) struct RunSettings {
pub(crate) with_requirements: Vec<PathBuf>,
pub(crate) package: Option<PackageName>,
pub(crate) python: Option<String>,
pub(crate) directory: Option<PathBuf>,
pub(crate) refresh: Refresh,
pub(crate) settings: ResolverInstallerSettings,
}
Expand All @@ -218,7 +217,6 @@ impl RunSettings {
refresh,
package,
python,
directory,
} = args;

Self {
Expand All @@ -237,7 +235,6 @@ impl RunSettings {
.collect(),
package,
python,
directory,
refresh: Refresh::from(refresh),
settings: ResolverInstallerSettings::combine(
resolver_installer_options(installer, build),
Expand Down Expand Up @@ -530,7 +527,6 @@ pub(crate) struct SyncSettings {
pub(crate) python: Option<String>,
pub(crate) refresh: Refresh,
pub(crate) settings: ResolverInstallerSettings,
pub(crate) directory: Option<PathBuf>,
}

impl SyncSettings {
Expand All @@ -550,7 +546,6 @@ impl SyncSettings {
build,
refresh,
python,
directory,
} = args;

let modifications = if no_clean {
Expand All @@ -574,7 +569,6 @@ impl SyncSettings {
resolver_installer_options(installer, build),
filesystem,
),
directory,
}
}
}
Expand All @@ -588,7 +582,6 @@ pub(crate) struct LockSettings {
pub(crate) python: Option<String>,
pub(crate) refresh: Refresh,
pub(crate) settings: ResolverSettings,
pub(crate) directory: Option<PathBuf>,
}

impl LockSettings {
Expand All @@ -602,7 +595,6 @@ impl LockSettings {
build,
refresh,
python,
directory,
} = args;

Self {
Expand All @@ -611,7 +603,6 @@ impl LockSettings {
python,
refresh: Refresh::from(refresh),
settings: ResolverSettings::combine(resolver_options(resolver, build), filesystem),
directory,
}
}
}
Expand Down
6 changes: 2 additions & 4 deletions crates/uv/tests/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -865,17 +865,15 @@ fn run_from_directory() -> Result<()> {
.arg("project")
.arg("main");

let mut filters = context.filters();
filters.push((r"project(\\|/).venv", "[VENV]"));
uv_snapshot!(filters, command_with_args, @r###"
uv_snapshot!(context.filters(), command_with_args, @r###"
success: true
exit_code: 0
----- stdout -----
3.12.[X]
----- stderr -----
Using Python 3.12.[X] interpreter at: [PYTHON-3.12]
Creating virtualenv at: [VENV]
Creating virtualenv at: .venv
Resolved 1 package in [TIME]
Prepared 1 package in [TIME]
Installed 1 package in [TIME]
Expand Down

0 comments on commit c46adee

Please sign in to comment.