tvl-depot/tvix/glue/src/tvix_io.rs
Ryan Lahfa 099ca6b7c0 feat(tvix/glue): contextful derivation
We calculate the input context by performing the union of context
over all input of the derivation.

Then, we just pass the rest of it to the remaining machinery.

Finally, we re-emit an `outPath` and a `drvPath` containing the expected
contexts.

Change-Id: I74905fb258b5bee8b08d1208c9eb87f51b92a890
Reviewed-on: https://cl.tvl.fyi/c/depot/+/10436
Autosubmit: raitobezarius <tvl@lahfa.xyz>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
2024-01-03 23:23:33 +00:00

65 lines
2 KiB
Rust

//! This module implements a wrapper around tvix-eval's [EvalIO] type,
//! adding functionality which is required by tvix-cli:
//!
//! 1. Marking plain paths known to the reference scanner.
//! 2. Handling the C++ Nix `__corepkgs__`-hack for nixpkgs bootstrapping.
//!
//! All uses of [EvalIO] in tvix-cli must make use of this wrapper,
//! otherwise fundamental features like nixpkgs bootstrapping and hash
//! calculation will not work.
use std::io;
use std::path::{Path, PathBuf};
use tvix_eval::{EvalIO, FileType};
// TODO: Merge this together with TvixStoreIO?
pub struct TvixIO<T: EvalIO> {
// Actual underlying [EvalIO] implementation.
actual: T,
}
impl<T: EvalIO> TvixIO<T> {
pub fn new(actual: T) -> Self {
Self { actual }
}
}
impl<T: EvalIO> EvalIO for TvixIO<T> {
fn store_dir(&self) -> Option<String> {
self.actual.store_dir()
}
fn import_path(&self, path: &Path) -> io::Result<PathBuf> {
let imported_path = self.actual.import_path(path)?;
Ok(imported_path)
}
fn path_exists(&self, path: &Path) -> io::Result<bool> {
if path.starts_with("/__corepkgs__") {
return Ok(true);
}
self.actual.path_exists(path)
}
fn read_to_string(&self, path: &Path) -> io::Result<String> {
// Bundled version of corepkgs/fetchurl.nix. The counterpart
// of this happens in [crate::configure_nix_path], where the `nix_path`
// of the evaluation has `nix=/__corepkgs__` added to it.
//
// This workaround is similar to what cppnix does for passing
// the path through.
//
// TODO: this comparison is bad and allocates, we should use
// the sane path library.
if path.starts_with("/__corepkgs__/fetchurl.nix") {
return Ok(include_str!("fetchurl.nix").to_string());
}
self.actual.read_to_string(path)
}
fn read_dir(&self, path: &Path) -> io::Result<Vec<(bytes::Bytes, FileType)>> {
self.actual.read_dir(path)
}
}