refactor(tvix/nix-compat): Inline texthash mod

It is moved into `store_path::utils` with the other path builders.

Change-Id: I3257170e442af5d83bcf79e63fa7387dd914597c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/8410
Reviewed-by: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
This commit is contained in:
John Ericson 2023-03-30 17:30:28 -04:00 committed by John Ericson
parent ce502bdc89
commit df78a4d24e
3 changed files with 40 additions and 44 deletions

View file

@ -5,4 +5,3 @@ pub mod nixhash;
mod nixhash_algos;
mod nixhash_with_mode;
pub mod store_path;
mod texthash;

View file

@ -1,6 +1,6 @@
use crate::nixbase32;
use crate::nixhash::NixHash;
use crate::store_path::StorePath;
use crate::texthash::text_hash_string;
use sha2::{Digest, Sha256};
use super::Error;
@ -60,6 +60,45 @@ pub fn build_store_path_from_fingerprint(
StorePath::from_string(format!("{}-{}", nixbase32::encode(&compressed), name).as_str())
}
/// 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!(":{}:{}", crate::store_path::STORE_DIR, name));
s
}
/// Nix placeholders (i.e. values returned by `builtins.placeholder`)
/// are used to populate outputs with paths that must be
/// string-replaced with the actual placeholders later, at runtime.

View file

@ -1,42 +0,0 @@
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
}