Use cached current directory everywhere (#5574)

This commit is contained in:
Charlie Marsh 2024-07-29 17:03:45 -04:00 committed by GitHub
parent 37388f0987
commit 51a03738a2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 43 additions and 45 deletions

View file

@ -1,7 +1,6 @@
use fs2::FileExt;
use std::fmt::Display; use std::fmt::Display;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use fs2::FileExt;
use tempfile::NamedTempFile; use tempfile::NamedTempFile;
use tracing::{debug, error, trace, warn}; use tracing::{debug, error, trace, warn};

View file

@ -43,7 +43,7 @@ use pypi_types::VerbatimParsedUrl;
use requirements_txt::{RequirementsTxt, RequirementsTxtRequirement}; use requirements_txt::{RequirementsTxt, RequirementsTxtRequirement};
use uv_client::BaseClientBuilder; use uv_client::BaseClientBuilder;
use uv_configuration::{NoBinary, NoBuild}; use uv_configuration::{NoBinary, NoBuild};
use uv_fs::Simplified; use uv_fs::{Simplified, CWD};
use uv_normalize::{ExtraName, PackageName}; use uv_normalize::{ExtraName, PackageName};
use uv_workspace::pyproject::PyProjectToml; use uv_workspace::pyproject::PyProjectToml;
@ -86,18 +86,16 @@ impl RequirementsSpecification {
) -> Result<Self> { ) -> Result<Self> {
Ok(match source { Ok(match source {
RequirementsSource::Package(name) => { RequirementsSource::Package(name) => {
let requirement = let requirement = RequirementsTxtRequirement::parse(name, &*CWD, false)
RequirementsTxtRequirement::parse(name, std::env::current_dir()?, false) .with_context(|| format!("Failed to parse: `{name}`"))?;
.with_context(|| format!("Failed to parse: `{name}`"))?;
Self { Self {
requirements: vec![UnresolvedRequirementSpecification::from(requirement)], requirements: vec![UnresolvedRequirementSpecification::from(requirement)],
..Self::default() ..Self::default()
} }
} }
RequirementsSource::Editable(name) => { RequirementsSource::Editable(name) => {
let requirement = let requirement = RequirementsTxtRequirement::parse(name, &*CWD, true)
RequirementsTxtRequirement::parse(name, std::env::current_dir()?, true) .with_context(|| format!("Failed to parse: `{name}`"))?;
.with_context(|| format!("Failed to parse: `{name}`"))?;
Self { Self {
requirements: vec![UnresolvedRequirementSpecification::from( requirements: vec![UnresolvedRequirementSpecification::from(
requirement.into_editable()?, requirement.into_editable()?,
@ -114,8 +112,7 @@ impl RequirementsSpecification {
return Err(anyhow::anyhow!("File not found: `{}`", path.user_display())); return Err(anyhow::anyhow!("File not found: `{}`", path.user_display()));
} }
let requirements_txt = let requirements_txt = RequirementsTxt::parse(path, &*CWD, client_builder).await?;
RequirementsTxt::parse(path, std::env::current_dir()?, client_builder).await?;
Self { Self {
requirements: requirements_txt requirements: requirements_txt
.requirements .requirements
@ -313,7 +310,7 @@ impl RequirementsSpecification {
/// Parse an individual package requirement. /// Parse an individual package requirement.
pub fn parse_package(name: &str) -> Result<UnresolvedRequirementSpecification> { pub fn parse_package(name: &str) -> Result<UnresolvedRequirementSpecification> {
let requirement = RequirementsTxtRequirement::parse(name, std::env::current_dir()?, false) let requirement = RequirementsTxtRequirement::parse(name, &*CWD, false)
.with_context(|| format!("Failed to parse: `{name}`"))?; .with_context(|| format!("Failed to parse: `{name}`"))?;
Ok(UnresolvedRequirementSpecification::from(requirement)) Ok(UnresolvedRequirementSpecification::from(requirement))
} }

View file

@ -5,6 +5,7 @@ use anyhow::Result;
use requirements_txt::RequirementsTxt; use requirements_txt::RequirementsTxt;
use uv_client::{BaseClientBuilder, Connectivity}; use uv_client::{BaseClientBuilder, Connectivity};
use uv_configuration::Upgrade; use uv_configuration::Upgrade;
use uv_fs::CWD;
use uv_git::ResolvedRepositoryReference; use uv_git::ResolvedRepositoryReference;
use uv_resolver::{Lock, Preference, PreferenceError}; use uv_resolver::{Lock, Preference, PreferenceError};
@ -34,7 +35,7 @@ pub async fn read_requirements_txt(
// Parse the requirements from the lockfile. // Parse the requirements from the lockfile.
let requirements_txt = RequirementsTxt::parse( let requirements_txt = RequirementsTxt::parse(
output_file, output_file,
std::env::current_dir()?, &*CWD,
&BaseClientBuilder::new().connectivity(Connectivity::Offline), &BaseClientBuilder::new().connectivity(Connectivity::Offline),
) )
.await?; .await?;

View file

@ -1,6 +1,5 @@
//! Create a virtual environment. //! Create a virtual environment.
use std::env;
use std::env::consts::EXE_SUFFIX; use std::env::consts::EXE_SUFFIX;
use std::io; use std::io;
use std::io::{BufWriter, Write}; use std::io::{BufWriter, Write};
@ -12,7 +11,7 @@ use itertools::Itertools;
use tracing::info; use tracing::info;
use pypi_types::Scheme; use pypi_types::Scheme;
use uv_fs::{cachedir, Simplified}; use uv_fs::{cachedir, Simplified, CWD};
use uv_python::{Interpreter, VirtualEnvironment}; use uv_python::{Interpreter, VirtualEnvironment};
use uv_version::version; use uv_version::version;
@ -131,7 +130,7 @@ pub(crate) fn create(
}; };
let scripts = location.join(&interpreter.virtualenv().scripts); let scripts = location.join(&interpreter.virtualenv().scripts);
let prompt = match prompt { let prompt = match prompt {
Prompt::CurrentDirectoryName => env::current_dir()? Prompt::CurrentDirectoryName => CWD
.file_name() .file_name()
.map(|name| name.to_string_lossy().to_string()), .map(|name| name.to_string_lossy().to_string()),
Prompt::Static(value) => Some(value), Prompt::Static(value) => Some(value),

View file

@ -7,6 +7,7 @@ use uv_client::{BaseClientBuilder, Connectivity, FlatIndexClient, RegistryClient
use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode, SetupPyStrategy}; use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode, SetupPyStrategy};
use uv_dispatch::BuildDispatch; use uv_dispatch::BuildDispatch;
use uv_distribution::DistributionDatabase; use uv_distribution::DistributionDatabase;
use uv_fs::CWD;
use uv_normalize::PackageName; use uv_normalize::PackageName;
use uv_python::{PythonFetch, PythonPreference, PythonRequest}; use uv_python::{PythonFetch, PythonPreference, PythonRequest};
use uv_requirements::{NamedRequirementsResolver, RequirementsSource, RequirementsSpecification}; use uv_requirements::{NamedRequirementsResolver, RequirementsSource, RequirementsSpecification};
@ -55,12 +56,12 @@ pub(crate) async fn add(
// Find the project in the workspace. // Find the project in the workspace.
let project = if let Some(package) = package { let project = if let Some(package) = package {
Workspace::discover(&std::env::current_dir()?, &DiscoveryOptions::default()) Workspace::discover(&CWD, &DiscoveryOptions::default())
.await? .await?
.with_current_project(package.clone()) .with_current_project(package.clone())
.with_context(|| format!("Package `{package}` not found in workspace"))? .with_context(|| format!("Package `{package}` not found in workspace"))?
} else { } else {
ProjectWorkspace::discover(&std::env::current_dir()?, &DiscoveryOptions::default()).await? ProjectWorkspace::discover(&CWD, &DiscoveryOptions::default()).await?
}; };
// Discover or create the virtual environment. // Discover or create the virtual environment.

View file

@ -3,12 +3,13 @@ use std::path::Path;
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use owo_colors::OwoColorize; use owo_colors::OwoColorize;
use pep440_rs::Version; use pep440_rs::Version;
use pep508_rs::PackageName; use pep508_rs::PackageName;
use uv_cache::Cache; use uv_cache::Cache;
use uv_client::{BaseClientBuilder, Connectivity}; use uv_client::{BaseClientBuilder, Connectivity};
use uv_configuration::PreviewMode; use uv_configuration::PreviewMode;
use uv_fs::{absolutize_path, Simplified}; use uv_fs::{absolutize_path, Simplified, CWD};
use uv_python::{ use uv_python::{
EnvironmentPreference, PythonFetch, PythonInstallation, PythonPreference, PythonRequest, EnvironmentPreference, PythonFetch, PythonInstallation, PythonPreference, PythonRequest,
VersionRequest, VersionRequest,
@ -46,7 +47,7 @@ pub(crate) async fn init(
// Default to the current directory if a path was not provided. // Default to the current directory if a path was not provided.
let path = match explicit_path { let path = match explicit_path {
None => std::env::current_dir()?.canonicalize()?, None => CWD.to_path_buf(),
Some(ref path) => absolutize_path(Path::new(path))?.to_path_buf(), Some(ref path) => absolutize_path(Path::new(path))?.to_path_buf(),
}; };

View file

@ -17,6 +17,7 @@ use uv_client::{Connectivity, FlatIndexClient, RegistryClientBuilder};
use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode, Reinstall, SetupPyStrategy}; use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode, Reinstall, SetupPyStrategy};
use uv_dispatch::BuildDispatch; use uv_dispatch::BuildDispatch;
use uv_distribution::DEV_DEPENDENCIES; use uv_distribution::DEV_DEPENDENCIES;
use uv_fs::{Simplified, CWD};
use uv_git::ResolvedRepositoryReference; use uv_git::ResolvedRepositoryReference;
use uv_normalize::PackageName; use uv_normalize::PackageName;
use uv_python::{Interpreter, PythonFetch, PythonPreference, PythonRequest}; use uv_python::{Interpreter, PythonFetch, PythonPreference, PythonRequest};
@ -63,9 +64,9 @@ pub(crate) async fn lock(
} }
let directory = if let Some(directory) = directory { let directory = if let Some(directory) = directory {
directory directory.simple_canonicalize()?
} else { } else {
std::env::current_dir()? CWD.to_path_buf()
}; };
// Find the project requirements. // Find the project requirements.

View file

@ -4,6 +4,7 @@ use pep508_rs::PackageName;
use uv_cache::Cache; use uv_cache::Cache;
use uv_client::Connectivity; use uv_client::Connectivity;
use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode}; use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode};
use uv_fs::CWD;
use uv_python::{PythonFetch, PythonPreference, PythonRequest}; use uv_python::{PythonFetch, PythonPreference, PythonRequest};
use uv_warnings::{warn_user, warn_user_once}; use uv_warnings::{warn_user, warn_user_once};
use uv_workspace::pyproject::DependencyType; use uv_workspace::pyproject::DependencyType;
@ -39,12 +40,12 @@ pub(crate) async fn remove(
// Find the project in the workspace. // Find the project in the workspace.
let project = if let Some(package) = package { let project = if let Some(package) = package {
Workspace::discover(&std::env::current_dir()?, &DiscoveryOptions::default()) Workspace::discover(&CWD, &DiscoveryOptions::default())
.await? .await?
.with_current_project(package.clone()) .with_current_project(package.clone())
.with_context(|| format!("Package `{package}` not found in workspace"))? .with_context(|| format!("Package `{package}` not found in workspace"))?
} else { } else {
ProjectWorkspace::discover(&std::env::current_dir()?, &DiscoveryOptions::default()).await? ProjectWorkspace::discover(&CWD, &DiscoveryOptions::default()).await?
}; };
let mut pyproject = PyProjectTomlMut::from_toml(project.current_project().pyproject_toml())?; let mut pyproject = PyProjectTomlMut::from_toml(project.current_project().pyproject_toml())?;

View file

@ -14,7 +14,7 @@ use uv_cache::Cache;
use uv_cli::ExternalCommand; use uv_cli::ExternalCommand;
use uv_client::{BaseClientBuilder, Connectivity}; use uv_client::{BaseClientBuilder, Connectivity};
use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode}; use uv_configuration::{Concurrency, ExtrasSpecification, PreviewMode};
use uv_fs::{PythonExt, Simplified}; use uv_fs::{PythonExt, Simplified, CWD};
use uv_installer::{SatisfiesResult, SitePackages}; use uv_installer::{SatisfiesResult, SitePackages};
use uv_normalize::PackageName; use uv_normalize::PackageName;
use uv_python::{ use uv_python::{
@ -93,7 +93,7 @@ pub(crate) async fn run(
let directory = if let Some(directory) = directory { let directory = if let Some(directory) = directory {
directory.simple_canonicalize()? directory.simple_canonicalize()?
} else { } else {
std::env::current_dir()? CWD.to_path_buf()
}; };
// Determine whether the command to execute is a PEP 723 script. // Determine whether the command to execute is a PEP 723 script.

View file

@ -1,5 +1,7 @@
use anyhow::Result;
use std::path::PathBuf; use std::path::PathBuf;
use anyhow::Result;
use uv_auth::store_credentials_from_url; use uv_auth::store_credentials_from_url;
use uv_cache::Cache; use uv_cache::Cache;
use uv_client::{Connectivity, FlatIndexClient, RegistryClientBuilder}; use uv_client::{Connectivity, FlatIndexClient, RegistryClientBuilder};
@ -8,6 +10,7 @@ use uv_configuration::{
}; };
use uv_dispatch::BuildDispatch; use uv_dispatch::BuildDispatch;
use uv_distribution::DEV_DEPENDENCIES; use uv_distribution::DEV_DEPENDENCIES;
use uv_fs::{Simplified, CWD};
use uv_installer::SitePackages; use uv_installer::SitePackages;
use uv_python::{PythonEnvironment, PythonFetch, PythonPreference, PythonRequest}; use uv_python::{PythonEnvironment, PythonFetch, PythonPreference, PythonRequest};
use uv_resolver::{FlatIndex, Lock}; use uv_resolver::{FlatIndex, Lock};
@ -47,9 +50,9 @@ pub(crate) async fn sync(
} }
let directory = if let Some(directory) = directory { let directory = if let Some(directory) = directory {
directory directory.simple_canonicalize()?
} else { } else {
std::env::current_dir()? CWD.to_path_buf()
}; };
// Identify the project // Identify the project

View file

@ -8,6 +8,7 @@ use pep508_rs::PackageName;
use uv_cache::Cache; use uv_cache::Cache;
use uv_client::Connectivity; use uv_client::Connectivity;
use uv_configuration::{Concurrency, PreviewMode}; use uv_configuration::{Concurrency, PreviewMode};
use uv_fs::CWD;
use uv_python::{PythonFetch, PythonPreference, PythonRequest}; use uv_python::{PythonFetch, PythonPreference, PythonRequest};
use uv_warnings::warn_user_once; use uv_warnings::warn_user_once;
use uv_workspace::{DiscoveryOptions, Workspace}; use uv_workspace::{DiscoveryOptions, Workspace};
@ -47,8 +48,7 @@ pub(crate) async fn tree(
} }
// Find the project requirements. // Find the project requirements.
let workspace = let workspace = Workspace::discover(&CWD, &DiscoveryOptions::default()).await?;
Workspace::discover(&std::env::current_dir()?, &DiscoveryOptions::default()).await?;
// Find an interpreter for the project // Find an interpreter for the project
let interpreter = FoundInterpreter::discover( let interpreter = FoundInterpreter::discover(

View file

@ -11,6 +11,7 @@ use tracing::debug;
use uv_cache::Cache; use uv_cache::Cache;
use uv_client::Connectivity; use uv_client::Connectivity;
use uv_configuration::PreviewMode; use uv_configuration::PreviewMode;
use uv_fs::CWD;
use uv_python::downloads::{DownloadResult, ManagedPythonDownload, PythonDownloadRequest}; use uv_python::downloads::{DownloadResult, ManagedPythonDownload, PythonDownloadRequest};
use uv_python::managed::{ManagedPythonInstallation, ManagedPythonInstallations}; use uv_python::managed::{ManagedPythonInstallation, ManagedPythonInstallations};
use uv_python::{ use uv_python::{
@ -55,7 +56,7 @@ pub(crate) async fn install(
} }
None None
} else { } else {
requests_from_version_file(&std::env::current_dir()?).await? requests_from_version_file(&CWD).await?
}; };
version_file_requests.unwrap_or_else(|| vec![PythonRequest::Any]) version_file_requests.unwrap_or_else(|| vec![PythonRequest::Any])
} else { } else {

View file

@ -7,7 +7,7 @@ use tracing::debug;
use uv_cache::Cache; use uv_cache::Cache;
use uv_configuration::PreviewMode; use uv_configuration::PreviewMode;
use uv_fs::Simplified; use uv_fs::{Simplified, CWD};
use uv_python::{ use uv_python::{
request_from_version_file, requests_from_version_file, write_version_file, request_from_version_file, requests_from_version_file, write_version_file,
EnvironmentPreference, PythonInstallation, PythonPreference, PythonRequest, EnvironmentPreference, PythonInstallation, PythonPreference, PythonRequest,
@ -36,9 +36,7 @@ pub(crate) async fn pin(
let virtual_project = if isolated { let virtual_project = if isolated {
None None
} else { } else {
match VirtualProject::discover(&std::env::current_dir()?, &DiscoveryOptions::default()) match VirtualProject::discover(&CWD, &DiscoveryOptions::default()).await {
.await
{
Ok(virtual_project) => Some(virtual_project), Ok(virtual_project) => Some(virtual_project),
Err(err) => { Err(err) => {
debug!("Failed to discover virtual project: {err}"); debug!("Failed to discover virtual project: {err}");
@ -49,7 +47,7 @@ pub(crate) async fn pin(
let Some(request) = request else { let Some(request) = request else {
// Display the current pinned Python version // Display the current pinned Python version
if let Some(pins) = requests_from_version_file(&std::env::current_dir()?).await? { if let Some(pins) = requests_from_version_file(&CWD).await? {
for pin in pins { for pin in pins {
writeln!(printer.stdout(), "{}", pin.to_canonical_string())?; writeln!(printer.stdout(), "{}", pin.to_canonical_string())?;
if let Some(virtual_project) = &virtual_project { if let Some(virtual_project) = &virtual_project {
@ -126,10 +124,7 @@ pub(crate) async fn pin(
request.to_canonical_string() request.to_canonical_string()
}; };
let existing = request_from_version_file(&std::env::current_dir()?) let existing = request_from_version_file(&CWD).await.ok().flatten();
.await
.ok()
.flatten();
write_version_file(&output).await?; write_version_file(&output).await?;
if let Some(existing) = existing if let Some(existing) = existing

View file

@ -21,6 +21,7 @@ use uv_cli::{PythonCommand, PythonNamespace, ToolCommand, ToolNamespace};
#[cfg(feature = "self-update")] #[cfg(feature = "self-update")]
use uv_cli::{SelfCommand, SelfNamespace}; use uv_cli::{SelfCommand, SelfNamespace};
use uv_configuration::Concurrency; use uv_configuration::Concurrency;
use uv_fs::CWD;
use uv_requirements::RequirementsSource; use uv_requirements::RequirementsSource;
use uv_settings::{Combine, FilesystemOptions}; use uv_settings::{Combine, FilesystemOptions};
use uv_workspace::{DiscoveryOptions, Workspace}; use uv_workspace::{DiscoveryOptions, Workspace};
@ -73,14 +74,12 @@ async fn run(cli: Cli) -> Result<ExitStatus> {
Some(FilesystemOptions::from_file(config_file)?) Some(FilesystemOptions::from_file(config_file)?)
} else if cli.global_args.isolated || cli.no_config { } else if cli.global_args.isolated || cli.no_config {
None None
} else if let Ok(project) = } else if let Ok(project) = Workspace::discover(&CWD, &DiscoveryOptions::default()).await {
Workspace::discover(&std::env::current_dir()?, &DiscoveryOptions::default()).await
{
let project = FilesystemOptions::from_directory(project.install_path())?; let project = FilesystemOptions::from_directory(project.install_path())?;
let user = FilesystemOptions::user()?; let user = FilesystemOptions::user()?;
project.combine(user) project.combine(user)
} else { } else {
let project = FilesystemOptions::find(std::env::current_dir()?)?; let project = FilesystemOptions::find(&*CWD)?;
let user = FilesystemOptions::user()?; let user = FilesystemOptions::user()?;
project.combine(user) project.combine(user)
}; };