Skip to content

Commit 07cf2cd

Browse files
committed
Make cache robust to removed archives
1 parent d954a76 commit 07cf2cd

File tree

5 files changed

+45
-74
lines changed

5 files changed

+45
-74
lines changed

crates/uv-cli/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,8 +2382,6 @@ pub struct AddArgs {
23822382
pub packages: Vec<String>,
23832383

23842384
/// Add all packages listed in the given `requirements.txt` files.
2385-
///
2386-
/// Implies `--raw-sources`.
23872385
#[arg(long, short, group = "sources", value_parser = parse_file_path)]
23882386
pub requirements: Vec<PathBuf>,
23892387

crates/uv-workspace/src/pyproject.rs

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -351,31 +351,32 @@ impl Source {
351351
subdirectory,
352352
..
353353
} => {
354-
// We can only resolve a full commit hash from a pep508 URL, everything else is ambiguous.
355-
let rev = match reference {
356-
GitReference::FullCommit(ref mut rev) => Some(mem::take(rev)),
357-
_ => None,
358-
}
359-
// Give precedence to an explicit argument.
360-
.or(rev);
361-
362-
// Error if the user tried to specify a reference but didn't disambiguate.
363-
if reference != GitReference::DefaultBranch
364-
&& rev.is_none()
365-
&& tag.is_none()
366-
&& branch.is_none()
367-
{
368-
return Err(SourceError::UnresolvedReference(
369-
reference.as_str().unwrap().to_owned(),
370-
));
371-
}
372-
373-
Source::Git {
374-
rev,
375-
tag,
376-
branch,
377-
git: repository,
378-
subdirectory: subdirectory.map(|path| path.to_string_lossy().into_owned()),
354+
if rev.is_none() && tag.is_none() && branch.is_none() {
355+
let rev = match reference {
356+
GitReference::FullCommit(ref mut rev) => Some(mem::take(rev)),
357+
GitReference::Branch(ref mut rev) => Some(mem::take(rev)),
358+
GitReference::Tag(ref mut rev) => Some(mem::take(rev)),
359+
GitReference::ShortCommit(ref mut rev) => Some(mem::take(rev)),
360+
GitReference::BranchOrTag(ref mut rev) => Some(mem::take(rev)),
361+
GitReference::BranchOrTagOrCommit(ref mut rev) => Some(mem::take(rev)),
362+
GitReference::NamedRef(ref mut rev) => Some(mem::take(rev)),
363+
GitReference::DefaultBranch => None,
364+
};
365+
Source::Git {
366+
rev,
367+
tag,
368+
branch,
369+
git: repository,
370+
subdirectory: subdirectory.map(|path| path.to_string_lossy().into_owned()),
371+
}
372+
} else {
373+
Source::Git {
374+
rev,
375+
tag,
376+
branch,
377+
git: repository,
378+
subdirectory: subdirectory.map(|path| path.to_string_lossy().into_owned()),
379+
}
379380
}
380381
}
381382
};

crates/uv/src/commands/project/add.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ fn resolve_requirement(
622622
let source = match result {
623623
Ok(source) => source,
624624
Err(SourceError::UnresolvedReference(rev)) => {
625-
anyhow::bail!(
625+
bail!(
626626
"Cannot resolve Git reference `{rev}` for requirement `{name}`. Specify the reference with one of `--tag`, `--branch`, or `--rev`, or use the `--raw-sources` flag.",
627627
name = requirement.name
628628
)

crates/uv/src/lib.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,16 +1113,6 @@ async fn run_project(
11131113
.combine(Refresh::from(args.settings.upgrade.clone())),
11141114
);
11151115

1116-
// Use raw sources if requirements files are provided as input.
1117-
let raw_sources = if args.requirements.is_empty() {
1118-
args.raw_sources
1119-
} else {
1120-
if args.raw_sources {
1121-
warn_user!("`--raw-sources` is a no-op for `requirements.txt` files, which are always treated as raw sources");
1122-
}
1123-
true
1124-
};
1125-
11261116
let requirements = args
11271117
.packages
11281118
.into_iter()
@@ -1141,7 +1131,7 @@ async fn run_project(
11411131
requirements,
11421132
args.editable,
11431133
args.dependency_type,
1144-
raw_sources,
1134+
args.raw_sources,
11451135
args.rev,
11461136
args.tag,
11471137
args.branch,

crates/uv/tests/edit.rs

Lines changed: 17 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,19 @@ fn add_git() -> Result<()> {
168168
+ sniffio==1.3.1
169169
"###);
170170

171-
// Adding with an ambiguous Git reference will fail.
171+
// Adding with an ambiguous Git reference should treat it as a revision.
172172
uv_snapshot!(context.filters(), context.add(&["uv-public-pypackage @ git+https://github.com/astral-test/[email protected]"]).arg("--preview"), @r###"
173-
success: false
174-
exit_code: 2
173+
success: true
174+
exit_code: 0
175175
----- stdout -----
176176
177177
----- stderr -----
178-
error: Cannot resolve Git reference `0.0.1` for requirement `uv-public-pypackage`. Specify the reference with one of `--tag`, `--branch`, or `--rev`, or use the `--raw-sources` flag.
178+
Resolved 5 packages in [TIME]
179+
Prepared 2 packages in [TIME]
180+
Uninstalled 1 package in [TIME]
181+
Installed 2 packages in [TIME]
182+
~ project==0.1.0 (from file://[TEMP_DIR]/)
183+
+ uv-public-pypackage==0.1.0 (from git+https://github.com/astral-test/uv-public-pypackage@0dacfd662c64cb4ceb16e6cf65a157a8b715b979)
179184
"###);
180185

181186
uv_snapshot!(context.filters(), context.add(&["uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage"]).arg("--tag=0.0.1").arg("--preview"), @r###"
@@ -185,11 +190,10 @@ fn add_git() -> Result<()> {
185190
186191
----- stderr -----
187192
Resolved 5 packages in [TIME]
188-
Prepared 2 packages in [TIME]
193+
Prepared 1 package in [TIME]
189194
Uninstalled 1 package in [TIME]
190-
Installed 2 packages in [TIME]
195+
Installed 1 package in [TIME]
191196
~ project==0.1.0 (from file://[TEMP_DIR]/)
192-
+ uv-public-pypackage==0.1.0 (from git+https://github.com/astral-test/uv-public-pypackage@0dacfd662c64cb4ceb16e6cf65a157a8b715b979)
193197
"###);
194198

195199
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
@@ -3339,7 +3343,8 @@ fn add_requirements_file() -> Result<()> {
33393343
"#})?;
33403344

33413345
let requirements_txt = context.temp_dir.child("requirements.txt");
3342-
requirements_txt.write_str("Flask==2.3.2\ngit+https://github.com/agronholm/[email protected]")?;
3346+
requirements_txt
3347+
.write_str("Flask==2.3.2\nanyio @ git+https://github.com/agronholm/[email protected]")?;
33433348

33443349
uv_snapshot!(context.filters(), context.add(&[]).arg("-r").arg("requirements.txt"), @r###"
33453350
success: true
@@ -3377,24 +3382,15 @@ fn add_requirements_file() -> Result<()> {
33773382
requires-python = ">=3.12"
33783383
dependencies = [
33793384
"flask==2.3.2",
3380-
"anyio @ git+https://github.com/agronholm/[email protected]",
3385+
"anyio",
33813386
]
3387+
3388+
[tool.uv.sources]
3389+
anyio = { git = "https://github.com/agronholm/anyio.git", rev = "4.4.0" }
33823390
"###
33833391
);
33843392
});
33853393

3386-
// Using `--raw-sources` with `-r` should warn.
3387-
uv_snapshot!(context.filters(), context.add(&[]).arg("-r").arg("requirements.txt").arg("--raw-sources"), @r###"
3388-
success: true
3389-
exit_code: 0
3390-
----- stdout -----
3391-
3392-
----- stderr -----
3393-
warning: `--raw-sources` is a no-op for `requirements.txt` files, which are always treated as raw sources
3394-
Resolved [N] packages in [TIME]
3395-
Audited [N] packages in [TIME]
3396-
"###);
3397-
33983394
// Passing a `setup.py` should fail.
33993395
uv_snapshot!(context.filters(), context.add(&[]).arg("-r").arg("setup.py"), @r###"
34003396
success: false
@@ -3775,20 +3771,6 @@ fn add_git_to_script() -> Result<()> {
37753771
pprint([(k, v["title"]) for k, v in data.items()][:10])
37763772
"#})?;
37773773

3778-
// Adding with an ambiguous Git reference will fail.
3779-
uv_snapshot!(context.filters(), context
3780-
.add(&["uv-public-pypackage @ git+https://github.com/astral-test/[email protected]"])
3781-
.arg("--preview")
3782-
.arg("--script")
3783-
.arg("script.py"), @r###"
3784-
success: false
3785-
exit_code: 2
3786-
----- stdout -----
3787-
3788-
----- stderr -----
3789-
error: Cannot resolve Git reference `0.0.1` for requirement `uv-public-pypackage`. Specify the reference with one of `--tag`, `--branch`, or `--rev`, or use the `--raw-sources` flag.
3790-
"###);
3791-
37923774
uv_snapshot!(context.filters(), context
37933775
.add(&["uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage"])
37943776
.arg("--tag=0.0.1")

0 commit comments

Comments
 (0)