diff options
author | Florian Klink <flokli@flokli.de> | 2023-03-30T11·27+0200 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2023-03-30T14·03+0000 |
commit | 971080c9120725c0bec21ea2e5e14847b0e996e6 (patch) | |
tree | 42132ef1f2c39e25e87f416bede5df5985853e6e /tvix/nix-compat/src/texthash.rs | |
parent | 14c5781389838f05f3f0063e8c7f04b1eeceaf2e (diff) |
refactor(tvix/nix-compat): add text_hash_string function r/6057
Use it to calculate the text_hash_string, which is then used in the calculate_derivation_path and path_with_references functions. Relates to b/263. Change-Id: I7478825e2a23a11224212fea5e3fd06daa97d5e5 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8364 Autosubmit: flokli <flokli@flokli.de> Reviewed-by: tazjin <tazjin@tvl.su> Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/nix-compat/src/texthash.rs')
-rw-r--r-- | tvix/nix-compat/src/texthash.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tvix/nix-compat/src/texthash.rs b/tvix/nix-compat/src/texthash.rs new file mode 100644 index 000000000000..959a4dc3dcf0 --- /dev/null +++ b/tvix/nix-compat/src/texthash.rs @@ -0,0 +1,42 @@ +use sha2::{Digest, Sha256}; + +use crate::{nixhash::NixHash, store_path}; + +/// This contains the Nix logic to create "text hash strings", which are used +/// in `builtins.toFile`, as well as in Derivation Path calculation. +/// +/// A text hash is calculated by concatenating the following fields, separated by a `:`: +/// +/// - text +/// - references, individually joined by `:` +/// - the nix_hash_string representation of the sha256 digest of some contents +/// - the value of `storeDir` +/// - the name +pub fn text_hash_string<S: AsRef<str>, I: IntoIterator<Item = S>, C: AsRef<[u8]>>( + name: &str, + content: C, + references: I, +) -> String { + let mut s = String::from("text:"); + + for reference in references { + s.push_str(reference.as_ref()); + s.push(':'); + } + + // the nix_hash_string representation of the sha256 digest of some contents + s.push_str( + &{ + let content_digest = { + let hasher = Sha256::new_with_prefix(content); + hasher.finalize() + }; + NixHash::new(crate::nixhash::HashAlgo::Sha256, content_digest.to_vec()) + } + .to_nix_hash_string(), + ); + + s.push_str(&format!(":{}:{}", store_path::STORE_DIR, name)); + + s +} |