Improve logic for store path construction.

This commit is contained in:
r-vdp 2023-05-16 19:10:11 +02:00
parent bf4c9042f0
commit 4f2b808a29
No known key found for this signature in database

View file

@ -43,15 +43,29 @@ impl TryFrom<PathBuf> for StorePath {
type Error = anyhow::Error; type Error = anyhow::Error;
fn try_from(path: PathBuf) -> Result<Self> { fn try_from(path: PathBuf) -> Result<Self> {
let canon = path.canonicalize().unwrap_or(path.clone()); let nix_store = PathBuf::from("/").join("nix").join("store");
if !canon.starts_with(PathBuf::from("/").join("nix").join("store")) {
if path.starts_with(&nix_store) {
Ok(Self { store_path: path })
} else if path.is_symlink() {
if let Ok(target) = path.read_link() {
if target.starts_with(&nix_store) {
Ok(Self { store_path: target })
} else {
Self::try_from(target)
}
} else {
anyhow::bail!(
"Error constructing store path: cannot read symlink: {}",
path.display()
)
}
} else {
anyhow::bail!( anyhow::bail!(
"Error constructing store path, not in store: {} (canonicalised: {})", "Error constructing store path: not in nix store: {}",
path.display(), path.display()
canon.display() )
);
} }
Ok(Self { store_path: canon })
} }
} }