fix(tvix/castore/import): symlink targets are Vec<u8>

These can be arbitrary bytes in theory. Some of our libraries might
be more strict, or inconsistent w.r.t. their representation of path
separators.

Change-Id: I7981b74fc7d3dd79f5589cf2ef52ced7b71dd003
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11551
Tested-by: BuildkiteCI
Reviewed-by: edef <edef@edef.eu>
This commit is contained in:
Florian Klink 2024-04-30 12:16:40 +03:00 committed by flokli
parent ca64881cb3
commit 5e8cfcfcd6
3 changed files with 9 additions and 4 deletions

View file

@ -150,7 +150,9 @@ where
target: entry
.link_name()?
.ok_or_else(|| Error::MissingSymlinkTarget(path.clone()))?
.into(),
.into_owned()
.into_os_string()
.into_encoded_bytes(),
path,
},
// Push a bogus directory marker so we can make sure this directoy gets

View file

@ -2,6 +2,7 @@
use futures::stream::BoxStream;
use futures::StreamExt;
use std::os::unix::ffi::OsStringExt;
use std::os::unix::fs::MetadataExt;
use std::os::unix::fs::PermissionsExt;
use std::path::Path;
@ -108,7 +109,9 @@ where
Ok(IngestionEntry::Dir { path })
} else if file_type.is_symlink() {
let target = std::fs::read_link(entry.path())
.map_err(|e| Error::UnableToStat(entry.path().to_path_buf(), e))?;
.map_err(|e| Error::UnableToStat(entry.path().to_path_buf(), e))?
.into_os_string()
.into_vec();
Ok(IngestionEntry::Symlink { path, target })
} else if file_type.is_file() {

View file

@ -114,7 +114,7 @@ where
}
IngestionEntry::Symlink { ref target, .. } => Node::Symlink(SymlinkNode {
name,
target: target.as_os_str().as_bytes().to_owned().into(),
target: target.to_owned().into(),
}),
IngestionEntry::Regular {
size,
@ -209,7 +209,7 @@ pub enum IngestionEntry {
},
Symlink {
path: PathBuf,
target: PathBuf,
target: Vec<u8>,
},
Dir {
path: PathBuf,