refactor(derivation): return NixPath in calculate_derivation_path
This moves all the hash compression logic into a common helper function. Also update the docstring, which said "path" here, which could have been confused with output paths. Change-Id: Iedfb59aeb24f7638afac669dcd18d57b6cfaece2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7759 Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
This commit is contained in:
parent
87c80895cd
commit
d4603fc0af
2 changed files with 34 additions and 17 deletions
|
@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use std::{collections::BTreeMap, fmt, fmt::Write, iter::FromIterator};
|
use std::{collections::BTreeMap, fmt, fmt::Write, iter::FromIterator};
|
||||||
use tvix_store::nixbase32::NIXBASE32;
|
use tvix_store::nixbase32::NIXBASE32;
|
||||||
use tvix_store::nixpath::STORE_DIR;
|
use tvix_store::nixpath::{NixPath, ParseNixPathError, STORE_DIR};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct Derivation {
|
pub struct Derivation {
|
||||||
|
@ -28,6 +28,29 @@ pub struct Derivation {
|
||||||
pub system: String,
|
pub system: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This returns a store path, either of a derivation or a regular output.
|
||||||
|
/// The path_hash is compressed to 20 bytes, and nixbase32-encoded (32 characters)
|
||||||
|
fn build_store_path(
|
||||||
|
is_derivation: bool,
|
||||||
|
path_hash: &[u8],
|
||||||
|
name: &str,
|
||||||
|
) -> Result<NixPath, ParseNixPathError> {
|
||||||
|
let compressed = nix_hash::compress_hash(path_hash, 20);
|
||||||
|
if is_derivation {
|
||||||
|
NixPath::from_string(
|
||||||
|
format!(
|
||||||
|
"{}-{}{}",
|
||||||
|
NIXBASE32.encode(&compressed),
|
||||||
|
name,
|
||||||
|
write::DOT_FILE_EXT,
|
||||||
|
)
|
||||||
|
.as_str(),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
NixPath::from_string(format!("{}-{}", NIXBASE32.encode(&compressed), name,).as_str())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Derivation {
|
impl Derivation {
|
||||||
pub fn serialize(&self, writer: &mut impl Write) -> Result<(), fmt::Error> {
|
pub fn serialize(&self, writer: &mut impl Write) -> Result<(), fmt::Error> {
|
||||||
writer.write_str(write::DERIVATION_PREFIX)?;
|
writer.write_str(write::DERIVATION_PREFIX)?;
|
||||||
|
@ -46,9 +69,9 @@ impl Derivation {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path of a Derivation struct.
|
/// Returns the drv path of a Derivation struct.
|
||||||
///
|
///
|
||||||
/// The path is calculated like this:
|
/// The drv path is calculated like this:
|
||||||
/// - Write the fingerprint of the Derivation to the sha256 hash function.
|
/// - Write the fingerprint of the Derivation to the sha256 hash function.
|
||||||
/// This is: `text:`,
|
/// This is: `text:`,
|
||||||
/// all d.InputDerivations and d.InputSources (sorted, separated by a `:`),
|
/// all d.InputDerivations and d.InputSources (sorted, separated by a `:`),
|
||||||
|
@ -61,8 +84,8 @@ impl Derivation {
|
||||||
/// - Write the .drv A-Term contents to a hash function
|
/// - Write the .drv A-Term contents to a hash function
|
||||||
/// - Take the digest, run hash.CompressHash(digest, 20) on it.
|
/// - Take the digest, run hash.CompressHash(digest, 20) on it.
|
||||||
/// - Encode it with nixbase32
|
/// - Encode it with nixbase32
|
||||||
/// - Construct the full path $storeDir/$nixbase32EncodedCompressedHash-$name.drv
|
/// - Use it (and the name) to construct a NixPath.
|
||||||
pub fn calculate_derivation_path(&self, name: &str) -> String {
|
pub fn calculate_derivation_path(&self, name: &str) -> Result<NixPath, ParseNixPathError> {
|
||||||
let mut hasher = Sha256::new();
|
let mut hasher = Sha256::new();
|
||||||
|
|
||||||
// collect the list of paths from input_sources and input_derivations
|
// collect the list of paths from input_sources and input_derivations
|
||||||
|
@ -101,17 +124,7 @@ impl Derivation {
|
||||||
hasher.update(name);
|
hasher.update(name);
|
||||||
hasher.update(write::DOT_FILE_EXT);
|
hasher.update(write::DOT_FILE_EXT);
|
||||||
|
|
||||||
let compressed = {
|
build_store_path(true, &hasher.finalize(), name)
|
||||||
let aterm_digest = Vec::from_iter(hasher.finalize());
|
|
||||||
nix_hash::compress_hash(&aterm_digest, 20)
|
|
||||||
};
|
|
||||||
|
|
||||||
format!(
|
|
||||||
"{}-{}{}",
|
|
||||||
NIXBASE32.encode(&compressed),
|
|
||||||
name,
|
|
||||||
write::DOT_FILE_EXT
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ use std::io::Read;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use test_case::test_case;
|
use test_case::test_case;
|
||||||
use test_generator::test_resources;
|
use test_generator::test_resources;
|
||||||
|
use tvix_store::nixpath::NixPath;
|
||||||
|
|
||||||
const RESOURCES_PATHS: &str = "src/tests/derivation_tests";
|
const RESOURCES_PATHS: &str = "src/tests/derivation_tests";
|
||||||
|
|
||||||
|
@ -61,5 +62,8 @@ fn derivation_path(name: &str, expected_path: &str) {
|
||||||
let data = read_file(&format!("{}/{}.json", RESOURCES_PATHS, expected_path));
|
let data = read_file(&format!("{}/{}.json", RESOURCES_PATHS, expected_path));
|
||||||
let derivation: Derivation = serde_json::from_str(&data).expect("JSON was not well-formatted");
|
let derivation: Derivation = serde_json::from_str(&data).expect("JSON was not well-formatted");
|
||||||
|
|
||||||
assert_eq!(derivation.calculate_derivation_path(name), expected_path);
|
assert_eq!(
|
||||||
|
derivation.calculate_derivation_path(name).unwrap(),
|
||||||
|
NixPath::from_string(expected_path).unwrap()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue