client: tools: factor out entry path prefix helper

Move the logic to generate `FileEntry` paths with a given prefix to
its own helper function for it to be reusable for the catalog shell
implementation of split pxar archives.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
Christian Ebner 2024-08-12 12:31:34 +02:00 committed by Fabian Grünbichler
parent 3e6318a535
commit 50d20e9b64

View File

@ -8,7 +8,7 @@ use std::sync::Arc;
use anyhow::{bail, format_err, Context, Error};
use nix::sys::stat::Mode;
use pxar::accessor::aio::Accessor;
use pxar::accessor::aio::{Accessor, FileEntry};
use pxar::accessor::ReadAt;
use pxar::format::{SignedDuration, StatxTimestamp};
use pxar::{mode, Entry, EntryKind, Metadata};
@ -322,16 +322,7 @@ pub async fn pxar_metadata_catalog_lookup<T: Clone + ReadAt>(
EntryKind::Socket => DirEntryAttribute::Socket,
};
let entry_path = if let Some(prefix) = path_prefix {
let mut entry_path = PathBuf::from(prefix);
match entry.path().strip_prefix("/") {
Ok(path) => entry_path.push(path),
Err(_) => entry_path.push(entry.path()),
}
entry_path
} else {
PathBuf::from(entry.path())
};
let entry_path = entry_path_with_prefix(&entry, path_prefix);
entries.push(ArchiveEntry::new(
entry_path.as_os_str().as_bytes(),
Some(&entry_attr),
@ -407,3 +398,20 @@ pub async fn get_remote_pxar_reader(
Ok((LocalDynamicReadAt::new(reader), archive_size))
}
/// Generate entry path for given [`FileEntry`], prefixed by given `path_prefix` component(s).
pub(crate) fn entry_path_with_prefix<T: Clone + ReadAt>(
entry: &FileEntry<T>,
path_prefix: Option<&str>,
) -> PathBuf {
if let Some(prefix) = path_prefix {
let mut entry_path = PathBuf::from(prefix);
match entry.path().strip_prefix("/") {
Ok(path) => entry_path.push(path),
Err(_) => entry_path.push(entry.path()),
}
entry_path
} else {
PathBuf::from(entry.path())
}
}