Tarball fetcher: Include revCount/lastModified in the fingerprint

This can influence the evaluation result so they should be included in
the fingerprint.
This commit is contained in:
Eelco Dolstra 2024-07-03 21:54:54 +02:00
parent 1ff186fc6e
commit 5b4102c3b2
2 changed files with 12 additions and 2 deletions

View file

@ -419,7 +419,7 @@ namespace nlohmann {
using namespace nix; using namespace nix;
fetchers::PublicKey adl_serializer<fetchers::PublicKey>::from_json(const json & json) { fetchers::PublicKey adl_serializer<fetchers::PublicKey>::from_json(const json & json) {
fetchers::PublicKey res = { }; fetchers::PublicKey res = { };
if (auto type = optionalValueAt(json, "type")) if (auto type = optionalValueAt(json, "type"))
res.type = getString(*type); res.type = getString(*type);

View file

@ -950,10 +950,20 @@ std::optional<Fingerprint> LockedFlake::getFingerprint(ref<Store> store) const
auto fingerprint = flake.lockedRef.input.getFingerprint(store); auto fingerprint = flake.lockedRef.input.getFingerprint(store);
if (!fingerprint) return std::nullopt; if (!fingerprint) return std::nullopt;
*fingerprint += fmt(";%s;%s", flake.lockedRef.subdir, lockFile);
/* Include revCount and lastModified because they're not
necessarily implied by the content fingerprint (e.g. for
tarball flakes) but can influence the evaluation result. */
if (auto revCount = flake.lockedRef.input.getRevCount())
*fingerprint += fmt(";revCount=%d", *revCount);
if (auto lastModified = flake.lockedRef.input.getLastModified())
*fingerprint += fmt(";lastModified=%d", *lastModified);
// FIXME: as an optimization, if the flake contains a lock file // FIXME: as an optimization, if the flake contains a lock file
// and we haven't changed it, then it's sufficient to use // and we haven't changed it, then it's sufficient to use
// flake.sourceInfo.storePath for the fingerprint. // flake.sourceInfo.storePath for the fingerprint.
return hashString(HashAlgorithm::SHA256, fmt("%s;%s;%s", *fingerprint, flake.lockedRef.subdir, lockFile)); return hashString(HashAlgorithm::SHA256, *fingerprint);
} }
Flake::~Flake() { } Flake::~Flake() { }