refactor(nix-compat/store_path): use Path in from_absolute_path_full

These are not necessarily strings, and making it paths allows us to stop
converting them to lossy strings.

Change-Id: I11366c721dc5da1778aafe89092a1966b5a43178
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12617
Reviewed-by: Ilan Joselevich <personal@ilanjoselevich.com>
Reviewed-by: Jörg Thalheim <joerg@thalheim.io>
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
This commit is contained in:
Florian Klink 2024-10-14 15:51:29 +03:00 committed by clbot
parent da8fccba7a
commit 330145fa1f
2 changed files with 17 additions and 32 deletions

View file

@ -9,9 +9,6 @@ use std::{
};
use thiserror;
#[cfg(target_family = "unix")]
use std::os::unix::ffi::OsStrExt;
mod utils;
pub use utils::*;
@ -160,31 +157,27 @@ where
/// Decompose a string into a [StorePath] and a [PathBuf] containing the
/// rest of the path, or an error.
#[cfg(target_family = "unix")]
pub fn from_absolute_path_full<'a>(s: &'a str) -> Result<(Self, &'a Path), Error>
pub fn from_absolute_path_full<'a, P>(path: &'a P) -> Result<(Self, &'a Path), Error>
where
S: From<&'a str>,
P: AsRef<std::path::Path> + ?Sized,
{
// strip [STORE_DIR_WITH_SLASH] from s
let p = path
.as_ref()
.strip_prefix(STORE_DIR_WITH_SLASH)
.map_err(|_e| Error::MissingStoreDir)?;
match s.strip_prefix(STORE_DIR_WITH_SLASH) {
None => Err(Error::MissingStoreDir),
Some(rest) => {
let mut it = Path::new(rest).components();
let mut it = Path::new(p).components();
// The first component of the rest must be parse-able as a [StorePath]
if let Some(first_component) = it.next() {
// convert first component to StorePath
let store_path = StorePath::from_bytes(first_component.as_os_str().as_bytes())?;
// The first component of the rest must be parse-able as a [StorePath]
let first_component = it.next().ok_or(Error::InvalidLength)?;
let store_path = StorePath::from_bytes(first_component.as_os_str().as_encoded_bytes())?;
// collect rest
let rest_buf = it.as_path();
// collect rest
let rest_buf = it.as_path();
Ok((store_path, rest_buf))
} else {
Err(Error::InvalidLength) // Well, or missing "/"?
}
}
}
Ok((store_path, rest_buf))
}
/// Returns an absolute store path string.