refactor(nix-compat): use StorePathRef for hash derivation modulo
Rather than passing strings around, use a StorePathRef. This makes things a bit more typesafe, and more aligned with what we want to do in b/264. Change-Id: Ib7080addf27e7f1a9c8da1d8aaa66744468e3b5a Reviewed-on: https://cl.tvl.fyi/c/depot/+/10633 Tested-by: BuildkiteCI Reviewed-by: raitobezarius <tvl@lahfa.xyz>
This commit is contained in:
parent
c8114810c9
commit
e2c79e39f0
4 changed files with 34 additions and 30 deletions
|
@ -1,4 +1,6 @@
|
|||
use crate::store_path::{self, build_ca_path, build_output_path, build_text_path, StorePath};
|
||||
use crate::store_path::{
|
||||
self, build_ca_path, build_output_path, build_text_path, StorePath, StorePathRef,
|
||||
};
|
||||
use bstr::BString;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sha2::{Digest, Sha256};
|
||||
|
@ -162,7 +164,7 @@ impl Derivation {
|
|||
/// drv path).
|
||||
pub fn derivation_or_fod_hash<F>(&self, fn_get_derivation_or_fod_hash: F) -> NixHash
|
||||
where
|
||||
F: Fn(&str) -> NixHash,
|
||||
F: Fn(&StorePathRef) -> NixHash,
|
||||
{
|
||||
// Fixed-output derivations return a fixed hash.
|
||||
// Non-Fixed-output derivations return a hash of the ATerm notation, but with all
|
||||
|
@ -178,10 +180,13 @@ impl Derivation {
|
|||
// derivation_or_fod_hash, and replace the derivation path with it's HEXLOWER
|
||||
// digest.
|
||||
// This is not the [NixHash::to_nix_hash_string], but without the sha256: prefix).
|
||||
for (drv_path, output_names) in &self.input_derivations {
|
||||
for (drv_path_str, output_names) in &self.input_derivations {
|
||||
// parse drv_path to StorePathRef
|
||||
let drv_path = StorePathRef::from_absolute_path(drv_path_str.as_bytes())
|
||||
.expect("invalid input derivation path");
|
||||
replaced_input_derivations.insert(
|
||||
data_encoding::HEXLOWER
|
||||
.encode(fn_get_derivation_or_fod_hash(drv_path).digest_as_bytes()),
|
||||
.encode(fn_get_derivation_or_fod_hash(&drv_path).digest_as_bytes()),
|
||||
output_names.clone(),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -208,10 +208,10 @@ fn derivation_or_fod_hash(drv_path: &str, expected_nix_hash_string: &str) {
|
|||
#[test_case("unicode", "52a9id8hx688hvlnz4d1n25ml1jdykz0-unicode.drv"; "unicode")]
|
||||
#[test_case("cp1252", "m1vfixn8iprlf0v9abmlrz7mjw1xj8kp-cp1252.drv"; "cp1252")]
|
||||
#[test_case("latin1", "x6p0hg79i3wg0kkv7699935f7rrj9jf3-latin1.drv"; "latin1")]
|
||||
fn output_paths(name: &str, drv_path: &str) {
|
||||
fn output_paths(name: &str, drv_path_str: &str) {
|
||||
// read in the derivation
|
||||
let expected_derivation = Derivation::from_aterm_bytes(
|
||||
read_file(&format!("{}/ok/{}", RESOURCES_PATHS, drv_path)).as_ref(),
|
||||
read_file(&format!("{}/ok/{}", RESOURCES_PATHS, drv_path_str)).as_ref(),
|
||||
)
|
||||
.expect("must succeed");
|
||||
|
||||
|
@ -225,10 +225,10 @@ fn output_paths(name: &str, drv_path: &str) {
|
|||
// 4wvvbi4jwn0prsdxb7vs673qa5h9gr7x-foo.drv may lookup /nix/store/0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv
|
||||
// ch49594n9avinrf8ip0aslidkc4lxkqv-foo.drv may lookup /nix/store/ss2p4wmxijn652haqyd7dckxwl4c7hxx-bar.drv
|
||||
if name == "foo"
|
||||
&& ((drv_path == "4wvvbi4jwn0prsdxb7vs673qa5h9gr7x-foo.drv"
|
||||
&& parent_drv_path == "/nix/store/0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv")
|
||||
|| (drv_path == "ch49594n9avinrf8ip0aslidkc4lxkqv-foo.drv"
|
||||
&& parent_drv_path == "/nix/store/ss2p4wmxijn652haqyd7dckxwl4c7hxx-bar.drv"))
|
||||
&& ((drv_path_str == "4wvvbi4jwn0prsdxb7vs673qa5h9gr7x-foo.drv"
|
||||
&& parent_drv_path.to_string() == "0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv")
|
||||
|| (drv_path_str == "ch49594n9avinrf8ip0aslidkc4lxkqv-foo.drv"
|
||||
&& parent_drv_path.to_string() == "ss2p4wmxijn652haqyd7dckxwl4c7hxx-bar.drv"))
|
||||
{
|
||||
// do the lookup, by reading in the fixture of the requested
|
||||
// drv_name, and calculating its drv replacement (on the non-stripped version)
|
||||
|
@ -237,7 +237,7 @@ fn output_paths(name: &str, drv_path: &str) {
|
|||
let json_bytes = read_file(&format!(
|
||||
"{}/ok/{}.json",
|
||||
RESOURCES_PATHS,
|
||||
Path::new(parent_drv_path)
|
||||
Path::new(&parent_drv_path.to_string())
|
||||
.file_name()
|
||||
.unwrap()
|
||||
.to_string_lossy()
|
||||
|
@ -390,7 +390,7 @@ fn output_path_construction() {
|
|||
let foo_calc_result = foo_drv.calculate_output_paths(
|
||||
"foo",
|
||||
&foo_drv.derivation_or_fod_hash(|drv_path| {
|
||||
if drv_path != "/nix/store/0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv" {
|
||||
if drv_path.to_string() != "0hm2f1psjpcwg8fijsmr4wwxrx59s092-bar.drv" {
|
||||
panic!("lookup called with unexpected drv_path: {}", drv_path);
|
||||
}
|
||||
bar_drv_derivation_or_fod_hash.clone()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue