refactor(tvix/derivation): minor structure simplification

Fixes some module comments and embeds the `compress_hash` function in
the `derivation` module, as it was not used outside of this module
anyways.

Change-Id: I6c5c92b3f0c03c2cdcbcfc2f813909a968c4d44c
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7905
Tested-by: BuildkiteCI
Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
Vincent Ambo 2023-01-23 15:19:27 +03:00 committed by tazjin
parent 5719763fd3
commit be7f64ac87
4 changed files with 27 additions and 18 deletions

View file

@ -1,6 +1,6 @@
use crate::output::{Hash, Output};
use crate::write;
use crate::{nix_hash, DerivationError};
use crate::DerivationError;
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use std::collections::BTreeSet;
@ -29,6 +29,26 @@ pub struct Derivation {
pub system: String,
}
/// compress_hash takes an arbitrarily long sequence of bytes (usually
/// a hash digest), and returns a sequence of bytes of length
/// output_size.
///
/// It's calculated by rotating through the bytes in the output buffer
/// (zero- initialized), and XOR'ing with each byte of the passed
/// input. It consumes 1 byte at a time, and XOR's it with the current
/// value in the output buffer.
///
/// This mimics equivalent functionality in C++ Nix.
fn compress_hash(input: &[u8], output_size: usize) -> Vec<u8> {
let mut output: Vec<u8> = vec![0; output_size];
for (ii, ch) in input.iter().enumerate() {
output[ii % output_size] ^= ch;
}
output
}
/// 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(
@ -36,7 +56,7 @@ fn build_store_path(
path_hash: &[u8],
name: &str,
) -> Result<StorePath, DerivationError> {
let compressed = nix_hash::compress_hash(path_hash, 20);
let compressed = compress_hash(path_hash, 20);
if is_derivation {
StorePath::from_string(
format!(

View file

@ -1,6 +1,5 @@
mod derivation;
mod errors;
mod nix_hash;
mod output;
mod string_escape;
mod validate;

View file

@ -1,15 +0,0 @@
/// CompressHash takes an arbitrary long sequence of bytes (usually a hash
/// digest), and returns a sequence of bytes of length output_size.
/// It's calculated by rotating through the bytes in the output buffer (zero-
/// initialized), and XOR'ing with each byte of the passed input.
/// It consumes 1 byte at a time, and XOR's it with the current value in the
/// output buffer.
pub fn compress_hash(input: &[u8], output_size: usize) -> Vec<u8> {
let mut output: Vec<u8> = vec![0; output_size];
for (ii, ch) in input.iter().enumerate() {
output[ii % output_size] ^= ch;
}
output
}

View file

@ -1,3 +1,8 @@
//! This module implements the serialisation of derivations into the
//! [ATerm][] format used by C++ Nix.
//!
//! [ATerm]: http://program-transformation.org/Tools/ATermFormat.html
use crate::output::Output;
use crate::string_escape::escape_string;
use std::collections::BTreeSet;