Update hashes without --upgrade if not present (#2966)
## Summary If the user runs with `--generate-hashes`, and the lockfile doesn't contain _any_ hashes for a package (despite being pinned), we should add new hashes. This mirrors running `uv pip compile --generate-hashes` for the first time with an existing lockfile. Closes #2962.
This commit is contained in:
@@ -96,14 +96,17 @@ impl ResolutionGraph {
|
||||
|
||||
// Add its hashes to the index, preserving those that were already present in
|
||||
// the lockfile if necessary.
|
||||
if let Some(hash) = preferences.match_hashes(package_name, version) {
|
||||
hashes.insert(package_name.clone(), hash.to_vec());
|
||||
if let Some(digests) = preferences
|
||||
.match_hashes(package_name, version)
|
||||
.filter(|digests| !digests.is_empty())
|
||||
{
|
||||
hashes.insert(package_name.clone(), digests.to_vec());
|
||||
} else if let Some(versions_response) = packages.get(package_name) {
|
||||
if let VersionsResponse::Found(ref version_maps) = *versions_response {
|
||||
for version_map in version_maps {
|
||||
if let Some(mut hash) = version_map.hashes(version) {
|
||||
hash.sort_unstable();
|
||||
hashes.insert(package_name.clone(), hash);
|
||||
if let Some(mut digests) = version_map.hashes(version) {
|
||||
digests.sort_unstable();
|
||||
hashes.insert(package_name.clone(), digests);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -126,14 +129,17 @@ impl ResolutionGraph {
|
||||
|
||||
// Add its hashes to the index, preserving those that were already present in
|
||||
// the lockfile if necessary.
|
||||
if let Some(hash) = preferences.match_hashes(package_name, version) {
|
||||
hashes.insert(package_name.clone(), hash.to_vec());
|
||||
if let Some(digests) = preferences
|
||||
.match_hashes(package_name, version)
|
||||
.filter(|digests| !digests.is_empty())
|
||||
{
|
||||
hashes.insert(package_name.clone(), digests.to_vec());
|
||||
} else if let Some(versions_response) = packages.get(package_name) {
|
||||
if let VersionsResponse::Found(ref version_maps) = *versions_response {
|
||||
for version_map in version_maps {
|
||||
if let Some(mut hash) = version_map.hashes(version) {
|
||||
hash.sort_unstable();
|
||||
hashes.insert(package_name.clone(), hash);
|
||||
if let Some(mut digests) = version_map.hashes(version) {
|
||||
digests.sort_unstable();
|
||||
hashes.insert(package_name.clone(), digests);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6298,6 +6298,93 @@ fn preserve_hashes_upgrade() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// `--generate-hashes` should update the hashes in the "lockfile" if the package does not have
|
||||
/// hashes, even if `--upgrade` is _not_ specified.
|
||||
#[test]
|
||||
fn preserve_hashes_no_existing_hashes() -> Result<()> {
|
||||
let context = TestContext::new("3.12");
|
||||
let requirements_in = context.temp_dir.child("requirements.in");
|
||||
requirements_in.write_str("markupsafe")?;
|
||||
|
||||
// Write a subset of the hashes to the "lockfile".
|
||||
let requirements_txt = context.temp_dir.child("requirements.txt");
|
||||
requirements_txt.write_str(indoc! {r"
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile requirements.in --python-version 3.12 --cache-dir [CACHE_DIR]
|
||||
markupsafe==2.1.2
|
||||
"})?;
|
||||
|
||||
// Add additional hashes to the "lockfile".
|
||||
uv_snapshot!(context.compile()
|
||||
.arg("requirements.in")
|
||||
.arg("--output-file")
|
||||
.arg("requirements.txt")
|
||||
.arg("--generate-hashes"), @r###"
|
||||
success: true
|
||||
exit_code: 0
|
||||
----- stdout -----
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv pip compile --cache-dir [CACHE_DIR] --exclude-newer 2024-03-25T00:00:00Z requirements.in --output-file requirements.txt --generate-hashes
|
||||
markupsafe==2.1.2 \
|
||||
--hash=sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed \
|
||||
--hash=sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc \
|
||||
--hash=sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2 \
|
||||
--hash=sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460 \
|
||||
--hash=sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7 \
|
||||
--hash=sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0 \
|
||||
--hash=sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1 \
|
||||
--hash=sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa \
|
||||
--hash=sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03 \
|
||||
--hash=sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323 \
|
||||
--hash=sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65 \
|
||||
--hash=sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013 \
|
||||
--hash=sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036 \
|
||||
--hash=sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f \
|
||||
--hash=sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4 \
|
||||
--hash=sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419 \
|
||||
--hash=sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2 \
|
||||
--hash=sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619 \
|
||||
--hash=sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a \
|
||||
--hash=sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a \
|
||||
--hash=sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd \
|
||||
--hash=sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7 \
|
||||
--hash=sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666 \
|
||||
--hash=sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65 \
|
||||
--hash=sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859 \
|
||||
--hash=sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625 \
|
||||
--hash=sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff \
|
||||
--hash=sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156 \
|
||||
--hash=sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd \
|
||||
--hash=sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba \
|
||||
--hash=sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f \
|
||||
--hash=sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1 \
|
||||
--hash=sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094 \
|
||||
--hash=sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a \
|
||||
--hash=sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513 \
|
||||
--hash=sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed \
|
||||
--hash=sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d \
|
||||
--hash=sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3 \
|
||||
--hash=sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147 \
|
||||
--hash=sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c \
|
||||
--hash=sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603 \
|
||||
--hash=sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601 \
|
||||
--hash=sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a \
|
||||
--hash=sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1 \
|
||||
--hash=sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d \
|
||||
--hash=sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3 \
|
||||
--hash=sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54 \
|
||||
--hash=sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2 \
|
||||
--hash=sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6 \
|
||||
--hash=sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58
|
||||
|
||||
----- stderr -----
|
||||
Resolved 1 package in [TIME]
|
||||
"###
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// `--generate-hashes` should update the hashes in the "lockfile" if the package is upgraded due
|
||||
/// to a change in requirements.
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user