[pbs-devel] [PATCH v3 proxmox-backup 05/10] client: tools: factor out entry path prefix helper
Christian Ebner
c.ebner at proxmox.com
Mon Aug 12 12:31:34 CEST 2024
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 at proxmox.com>
---
changes since version 2:
- only factor out code as is, thereby avoiding issue with
relative/absolute paths depending on given prefix
pbs-client/src/pxar/tools.rs | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/pbs-client/src/pxar/tools.rs b/pbs-client/src/pxar/tools.rs
index 1598aeb2e..25500f748 100644
--- a/pbs-client/src/pxar/tools.rs
+++ b/pbs-client/src/pxar/tools.rs
@@ -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())
+ }
+}
--
2.39.2
More information about the pbs-devel
mailing list