refactor(tvix/nix-compat): introduce CaHash::algo_str

This is the `{fixed,fixed:r,text}:{sha*,md5}` prefix used in various
string representations.

Factor that code out, and use it in the two places it can be used in.

Change-Id: Ic9555fa9e1884198d435e55c7f630b8d3ba2a032
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12041
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: Brian Olsen <me@griff.name>
This commit is contained in:
Florian Klink 2024-07-27 13:04:29 +03:00 committed by clbot
parent 5114504b67
commit c8f92c6e9f
2 changed files with 27 additions and 28 deletions

View file

@ -47,6 +47,26 @@ impl CAHash {
} }
} }
/// Returns a colon-separated string consisting of mode, recursiveness and
/// hash algo. Used as a prefix in various string representations.
pub fn algo_str(&self) -> &'static str {
match self.mode() {
HashMode::Flat => match self.hash().as_ref() {
NixHash::Md5(_) => "fixed:md5",
NixHash::Sha1(_) => "fixed:sha1",
NixHash::Sha256(_) => "fixed:sha256",
NixHash::Sha512(_) => "fixed:sha512",
},
HashMode::Nar => match self.hash().as_ref() {
NixHash::Md5(_) => "fixed:r:md5",
NixHash::Sha1(_) => "fixed:r:sha1",
NixHash::Sha256(_) => "fixed:r:sha256",
NixHash::Sha512(_) => "fixed:r:sha512",
},
HashMode::Text => "text:sha256",
}
}
/// Constructs a [CAHash] from the textual representation, /// Constructs a [CAHash] from the textual representation,
/// which is one of the three: /// which is one of the three:
/// - `text:sha256:$nixbase32sha256digest` /// - `text:sha256:$nixbase32sha256digest`
@ -76,13 +96,11 @@ impl CAHash {
/// Formats a [CAHash] in the Nix default hash format, which is the format /// Formats a [CAHash] in the Nix default hash format, which is the format
/// that's used in NARInfos for example. /// that's used in NARInfos for example.
pub fn to_nix_nixbase32_string(&self) -> String { pub fn to_nix_nixbase32_string(&self) -> String {
match self { format!(
CAHash::Flat(nh) => format!("fixed:{}", nh.to_nix_nixbase32_string()), "{}:{}",
CAHash::Nar(nh) => format!("fixed:r:{}", nh.to_nix_nixbase32_string()), self.algo_str(),
CAHash::Text(digest) => { nixbase32::encode(self.hash().digest_as_bytes())
format!("text:sha256:{}", nixbase32::encode(digest)) )
}
}
} }
/// This takes a serde_json::Map and turns it into this structure. This is necessary to do such /// This takes a serde_json::Map and turns it into this structure. This is necessary to do such

View file

@ -12,7 +12,6 @@ use jemallocator::Jemalloc;
use nix_compat::{ use nix_compat::{
narinfo::{self, NarInfo}, narinfo::{self, NarInfo},
nixbase32, nixbase32,
nixhash::{CAHash, NixHash},
}; };
use polars::{io::parquet::ParquetWriter, prelude::*}; use polars::{io::parquet::ParquetWriter, prelude::*};
use std::{ use std::{
@ -177,26 +176,8 @@ impl FrameBuilder {
})); }));
if let Some(ca) = &entry.ca { if let Some(ca) = &entry.ca {
// decompose the CAHash into algo and hash parts self.ca_algo.append_value(ca.algo_str());
// TODO(edef): move this into CAHash self.ca_hash.append_value(ca.hash().digest_as_bytes());
let (algo, hash) = match ca {
CAHash::Flat(h) => match h {
NixHash::Md5(h) => ("fixed:md5", &h[..]),
NixHash::Sha1(h) => ("fixed:sha1", &h[..]),
NixHash::Sha256(h) => ("fixed:sha256", &h[..]),
NixHash::Sha512(h) => ("fixed:sha512", &h[..]),
},
CAHash::Nar(h) => match h {
NixHash::Md5(h) => ("fixed:r:md5", &h[..]),
NixHash::Sha1(h) => ("fixed:r:sha1", &h[..]),
NixHash::Sha256(h) => ("fixed:r:sha256", &h[..]),
NixHash::Sha512(h) => ("fixed:r:sha512", &h[..]),
},
CAHash::Text(h) => ("text:sha256", &h[..]),
};
self.ca_algo.append_value(algo);
self.ca_hash.append_value(hash);
} else { } else {
self.ca_algo.append_null(); self.ca_algo.append_null();
self.ca_hash.append_null(); self.ca_hash.append_null();