mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-29 19:17:26 +00:00
This reverts commit aeb7ee056e from
https://github.com/astral-sh/uv/pull/15991 since it will break `uv lock
--locked --refresh` otherwise.
This commit is contained in:
parent
aeb7ee056e
commit
c21b11edb9
3 changed files with 1 additions and 240 deletions
|
|
@ -9,7 +9,7 @@ use owo_colors::OwoColorize;
|
||||||
use rustc_hash::{FxBuildHasher, FxHashMap};
|
use rustc_hash::{FxBuildHasher, FxHashMap};
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
|
||||||
use uv_cache::{Cache, Refresh};
|
use uv_cache::Cache;
|
||||||
use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder};
|
use uv_client::{BaseClientBuilder, FlatIndexClient, RegistryClientBuilder};
|
||||||
use uv_configuration::{
|
use uv_configuration::{
|
||||||
Concurrency, Constraints, DependencyGroupsWithDefaults, DryRun, ExtrasSpecification, Reinstall,
|
Concurrency, Constraints, DependencyGroupsWithDefaults, DryRun, ExtrasSpecification, Reinstall,
|
||||||
|
|
@ -84,7 +84,6 @@ pub(crate) async fn lock(
|
||||||
locked: bool,
|
locked: bool,
|
||||||
frozen: bool,
|
frozen: bool,
|
||||||
dry_run: DryRun,
|
dry_run: DryRun,
|
||||||
refresh: Refresh,
|
|
||||||
python: Option<String>,
|
python: Option<String>,
|
||||||
install_mirrors: PythonInstallMirrors,
|
install_mirrors: PythonInstallMirrors,
|
||||||
settings: ResolverSettings,
|
settings: ResolverSettings,
|
||||||
|
|
@ -202,7 +201,6 @@ pub(crate) async fn lock(
|
||||||
printer,
|
printer,
|
||||||
preview,
|
preview,
|
||||||
)
|
)
|
||||||
.with_refresh(&refresh)
|
|
||||||
.execute(target)
|
.execute(target)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
|
|
@ -262,7 +260,6 @@ pub(super) enum LockMode<'env> {
|
||||||
pub(super) struct LockOperation<'env> {
|
pub(super) struct LockOperation<'env> {
|
||||||
mode: LockMode<'env>,
|
mode: LockMode<'env>,
|
||||||
constraints: Vec<NameRequirementSpecification>,
|
constraints: Vec<NameRequirementSpecification>,
|
||||||
refresh: Option<&'env Refresh>,
|
|
||||||
settings: &'env ResolverSettings,
|
settings: &'env ResolverSettings,
|
||||||
client_builder: &'env BaseClientBuilder<'env>,
|
client_builder: &'env BaseClientBuilder<'env>,
|
||||||
state: &'env UniversalState,
|
state: &'env UniversalState,
|
||||||
|
|
@ -291,7 +288,6 @@ impl<'env> LockOperation<'env> {
|
||||||
Self {
|
Self {
|
||||||
mode,
|
mode,
|
||||||
constraints: vec![],
|
constraints: vec![],
|
||||||
refresh: None,
|
|
||||||
settings,
|
settings,
|
||||||
client_builder,
|
client_builder,
|
||||||
state,
|
state,
|
||||||
|
|
@ -314,13 +310,6 @@ impl<'env> LockOperation<'env> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the refresh strategy for the [`LockOperation`].
|
|
||||||
#[must_use]
|
|
||||||
pub(super) fn with_refresh(mut self, refresh: &'env Refresh) -> Self {
|
|
||||||
self.refresh = Some(refresh);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Perform a [`LockOperation`].
|
/// Perform a [`LockOperation`].
|
||||||
pub(super) async fn execute(self, target: LockTarget<'_>) -> Result<LockResult, ProjectError> {
|
pub(super) async fn execute(self, target: LockTarget<'_>) -> Result<LockResult, ProjectError> {
|
||||||
match self.mode {
|
match self.mode {
|
||||||
|
|
@ -345,7 +334,6 @@ impl<'env> LockOperation<'env> {
|
||||||
interpreter,
|
interpreter,
|
||||||
Some(existing),
|
Some(existing),
|
||||||
self.constraints,
|
self.constraints,
|
||||||
self.refresh,
|
|
||||||
self.settings,
|
self.settings,
|
||||||
self.client_builder,
|
self.client_builder,
|
||||||
self.state,
|
self.state,
|
||||||
|
|
@ -388,7 +376,6 @@ impl<'env> LockOperation<'env> {
|
||||||
interpreter,
|
interpreter,
|
||||||
existing,
|
existing,
|
||||||
self.constraints,
|
self.constraints,
|
||||||
self.refresh,
|
|
||||||
self.settings,
|
self.settings,
|
||||||
self.client_builder,
|
self.client_builder,
|
||||||
self.state,
|
self.state,
|
||||||
|
|
@ -420,7 +407,6 @@ async fn do_lock(
|
||||||
interpreter: &Interpreter,
|
interpreter: &Interpreter,
|
||||||
existing_lock: Option<Lock>,
|
existing_lock: Option<Lock>,
|
||||||
external: Vec<NameRequirementSpecification>,
|
external: Vec<NameRequirementSpecification>,
|
||||||
refresh: Option<&Refresh>,
|
|
||||||
settings: &ResolverSettings,
|
settings: &ResolverSettings,
|
||||||
client_builder: &BaseClientBuilder<'_>,
|
client_builder: &BaseClientBuilder<'_>,
|
||||||
state: &UniversalState,
|
state: &UniversalState,
|
||||||
|
|
@ -758,7 +744,6 @@ async fn do_lock(
|
||||||
&requires_python,
|
&requires_python,
|
||||||
index_locations,
|
index_locations,
|
||||||
upgrade,
|
upgrade,
|
||||||
refresh,
|
|
||||||
&options,
|
&options,
|
||||||
&hasher,
|
&hasher,
|
||||||
state.index(),
|
state.index(),
|
||||||
|
|
@ -973,7 +958,6 @@ impl ValidatedLock {
|
||||||
requires_python: &RequiresPython,
|
requires_python: &RequiresPython,
|
||||||
index_locations: &IndexLocations,
|
index_locations: &IndexLocations,
|
||||||
upgrade: &Upgrade,
|
upgrade: &Upgrade,
|
||||||
refresh: Option<&Refresh>,
|
|
||||||
options: &Options,
|
options: &Options,
|
||||||
hasher: &HashStrategy,
|
hasher: &HashStrategy,
|
||||||
index: &InMemoryIndex,
|
index: &InMemoryIndex,
|
||||||
|
|
@ -1159,12 +1143,6 @@ impl ValidatedLock {
|
||||||
return Ok(Self::Versions(lock));
|
return Ok(Self::Versions(lock));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the user specified `--refresh`, then we have to re-resolve.
|
|
||||||
if matches!(refresh, Some(Refresh::All(..) | Refresh::Packages(..))) {
|
|
||||||
debug!("Resolving despite existing lockfile due to `--refresh`");
|
|
||||||
return Ok(Self::Preferable(lock));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the user provided at least one index URL (from the command line, or from a configuration
|
// If the user provided at least one index URL (from the command line, or from a configuration
|
||||||
// file), don't use the existing lockfile if it references any registries that are no longer
|
// file), don't use the existing lockfile if it references any registries that are no longer
|
||||||
// included in the current configuration.
|
// included in the current configuration.
|
||||||
|
|
|
||||||
|
|
@ -1902,7 +1902,6 @@ async fn run_project(
|
||||||
// Initialize the cache.
|
// Initialize the cache.
|
||||||
let cache = cache.init()?.with_refresh(
|
let cache = cache.init()?.with_refresh(
|
||||||
args.refresh
|
args.refresh
|
||||||
.clone()
|
|
||||||
.combine(Refresh::from(args.settings.upgrade.clone())),
|
.combine(Refresh::from(args.settings.upgrade.clone())),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -1924,7 +1923,6 @@ async fn run_project(
|
||||||
args.locked,
|
args.locked,
|
||||||
args.frozen,
|
args.frozen,
|
||||||
args.dry_run,
|
args.dry_run,
|
||||||
args.refresh,
|
|
||||||
args.python,
|
args.python,
|
||||||
args.install_mirrors,
|
args.install_mirrors,
|
||||||
args.settings,
|
args.settings,
|
||||||
|
|
|
||||||
|
|
@ -31658,221 +31658,6 @@ fn lock_required_intersection() -> Result<()> {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn lock_refresh() -> Result<()> {
|
|
||||||
let context = TestContext::new("3.12");
|
|
||||||
|
|
||||||
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
||||||
pyproject_toml.write_str(
|
|
||||||
r#"
|
|
||||||
[project]
|
|
||||||
name = "project"
|
|
||||||
version = "0.1.0"
|
|
||||||
requires-python = ">=3.12"
|
|
||||||
dependencies = ["anyio==3.7.0"]
|
|
||||||
"#,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
||||||
success: true
|
|
||||||
exit_code: 0
|
|
||||||
----- stdout -----
|
|
||||||
|
|
||||||
----- stderr -----
|
|
||||||
Resolved 4 packages in [TIME]
|
|
||||||
"###);
|
|
||||||
|
|
||||||
// Write a `uv.lock` that accidentally omits the `anyio` wheel.
|
|
||||||
context.temp_dir.child("uv.lock").write_str(
|
|
||||||
r#"
|
|
||||||
version = 1
|
|
||||||
revision = 3
|
|
||||||
requires-python = ">=3.12"
|
|
||||||
|
|
||||||
[options]
|
|
||||||
exclude-newer = "2024-03-25T00:00:00Z"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anyio"
|
|
||||||
version = "3.7.0"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "idna" },
|
|
||||||
{ name = "sniffio" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737, upload-time = "2023-05-27T11:12:46.688Z" }
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "idna"
|
|
||||||
version = "3.6"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "project"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = { virtual = "." }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "anyio" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.metadata]
|
|
||||||
requires-dist = [{ name = "anyio", specifier = "==3.7.0" }]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sniffio"
|
|
||||||
version = "1.3.1"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
||||||
]
|
|
||||||
"#,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
// Run `uv lock`.
|
|
||||||
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
||||||
success: true
|
|
||||||
exit_code: 0
|
|
||||||
----- stdout -----
|
|
||||||
|
|
||||||
----- stderr -----
|
|
||||||
Resolved 4 packages in [TIME]
|
|
||||||
"###);
|
|
||||||
|
|
||||||
let lock = context.read("uv.lock");
|
|
||||||
|
|
||||||
// The wheel should still be missing.
|
|
||||||
insta::with_settings!({
|
|
||||||
filters => context.filters(),
|
|
||||||
}, {
|
|
||||||
assert_snapshot!(
|
|
||||||
lock, @r#"
|
|
||||||
version = 1
|
|
||||||
revision = 3
|
|
||||||
requires-python = ">=3.12"
|
|
||||||
|
|
||||||
[options]
|
|
||||||
exclude-newer = "2024-03-25T00:00:00Z"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anyio"
|
|
||||||
version = "3.7.0"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "idna" },
|
|
||||||
{ name = "sniffio" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737, upload-time = "2023-05-27T11:12:46.688Z" }
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "idna"
|
|
||||||
version = "3.6"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "project"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = { virtual = "." }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "anyio" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.metadata]
|
|
||||||
requires-dist = [{ name = "anyio", specifier = "==3.7.0" }]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sniffio"
|
|
||||||
version = "1.3.1"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
||||||
]
|
|
||||||
"#
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Re-run with `--refresh`.
|
|
||||||
uv_snapshot!(context.filters(), context.lock().arg("--refresh"), @r"
|
|
||||||
success: true
|
|
||||||
exit_code: 0
|
|
||||||
----- stdout -----
|
|
||||||
|
|
||||||
----- stderr -----
|
|
||||||
Resolved 4 packages in [TIME]
|
|
||||||
");
|
|
||||||
|
|
||||||
let lock = context.read("uv.lock");
|
|
||||||
|
|
||||||
// The wheel should be present.
|
|
||||||
insta::with_settings!({
|
|
||||||
filters => context.filters(),
|
|
||||||
}, {
|
|
||||||
assert_snapshot!(
|
|
||||||
lock, @r#"
|
|
||||||
version = 1
|
|
||||||
revision = 3
|
|
||||||
requires-python = ">=3.12"
|
|
||||||
|
|
||||||
[options]
|
|
||||||
exclude-newer = "2024-03-25T00:00:00Z"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anyio"
|
|
||||||
version = "3.7.0"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "idna" },
|
|
||||||
{ name = "sniffio" },
|
|
||||||
]
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737, upload-time = "2023-05-27T11:12:46.688Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0", size = 80873, upload-time = "2023-05-27T11:12:44.474Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "idna"
|
|
||||||
version = "3.6"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "project"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = { virtual = "." }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "anyio" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.metadata]
|
|
||||||
requires-dist = [{ name = "anyio", specifier = "==3.7.0" }]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sniffio"
|
|
||||||
version = "1.3.1"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
||||||
]
|
|
||||||
"#
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Ensure conflicts on virtual packages (such as markers) give good error messages.
|
/// Ensure conflicts on virtual packages (such as markers) give good error messages.
|
||||||
#[test]
|
#[test]
|
||||||
fn collapsed_error_with_marker_packages() -> Result<()> {
|
fn collapsed_error_with_marker_packages() -> Result<()> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue