[pbs-devel] [PATCH proxmox-backup 3/4] file-restore: Add 'v' (Virtual) ArchiveEntry type
Stefan Reiter
s.reiter at proxmox.com
Wed Apr 21 15:18:08 CEST 2021
Encoded as "None", to avoid cluttering DirEntryAttribute, where it
wouldn't make any sense to have.
Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
---
src/api2/helpers.rs | 2 +-
src/api2/types/mod.rs | 13 ++++++++-----
src/bin/proxmox-file-restore.rs | 9 +++++++--
src/bin/proxmox_restore_daemon/api.rs | 9 +++++----
4 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/src/api2/helpers.rs b/src/api2/helpers.rs
index 41391b77..52f80bad 100644
--- a/src/api2/helpers.rs
+++ b/src/api2/helpers.rs
@@ -48,7 +48,7 @@ pub fn list_dir_content<R: Read + Seek>(
let mut components = path.clone();
components.push(b'/');
components.extend(&direntry.name);
- let mut entry = ArchiveEntry::new(&components, &direntry.attr);
+ let mut entry = ArchiveEntry::new(&components, Some(&direntry.attr));
if let DirEntryAttribute::File { size, mtime } = direntry.attr {
entry.size = size.into();
entry.mtime = mtime.into();
diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs
index 19186ea2..9d1bd301 100644
--- a/src/api2/types/mod.rs
+++ b/src/api2/types/mod.rs
@@ -1354,19 +1354,22 @@ pub struct ArchiveEntry {
}
impl ArchiveEntry {
- pub fn new(filepath: &[u8], entry_type: &DirEntryAttribute) -> Self {
+ pub fn new(filepath: &[u8], entry_type: Option<&DirEntryAttribute>) -> Self {
Self {
filepath: base64::encode(filepath),
text: String::from_utf8_lossy(filepath.split(|x| *x == b'/').last().unwrap())
.to_string(),
- entry_type: CatalogEntryType::from(entry_type).to_string(),
- leaf: !matches!(entry_type, DirEntryAttribute::Directory { .. }),
+ entry_type: match entry_type {
+ Some(entry_type) => CatalogEntryType::from(entry_type).to_string(),
+ None => "v".to_owned(),
+ },
+ leaf: !matches!(entry_type, None | Some(DirEntryAttribute::Directory { .. })),
size: match entry_type {
- DirEntryAttribute::File { size, .. } => Some(*size),
+ Some(DirEntryAttribute::File { size, .. }) => Some(*size),
_ => None
},
mtime: match entry_type {
- DirEntryAttribute::File { mtime, .. } => Some(*mtime),
+ Some(DirEntryAttribute::File { mtime, .. }) => Some(*mtime),
_ => None
},
}
diff --git a/src/bin/proxmox-file-restore.rs b/src/bin/proxmox-file-restore.rs
index 36fdd391..7799a76d 100644
--- a/src/bin/proxmox-file-restore.rs
+++ b/src/bin/proxmox-file-restore.rs
@@ -174,8 +174,13 @@ async fn list(
continue;
}
let path = format!("/{}", file.filename);
- let attr = DirEntryAttribute::Directory { start: 0 };
- entries.push(ArchiveEntry::new(path.as_bytes(), &attr));
+ let attr = if file.filename.ends_with(".pxar.didx") {
+ // a pxar file is a file archive, so it's root is also a directory root
+ Some(&DirEntryAttribute::Directory { start: 0 })
+ } else {
+ None
+ };
+ entries.push(ArchiveEntry::new(path.as_bytes(), attr));
}
Ok(entries)
diff --git a/src/bin/proxmox_restore_daemon/api.rs b/src/bin/proxmox_restore_daemon/api.rs
index 7ac70278..82ead647 100644
--- a/src/bin/proxmox_restore_daemon/api.rs
+++ b/src/bin/proxmox_restore_daemon/api.rs
@@ -148,7 +148,7 @@ fn list(
match root_entry {
DirEntryAttribute::File { .. } => {
// list on file, return details
- res.push(ArchiveEntry::new(¶m_path, &root_entry));
+ res.push(ArchiveEntry::new(¶m_path, Some(&root_entry)));
}
DirEntryAttribute::Directory { .. } => {
// list on directory, return all contained files/dirs
@@ -176,7 +176,7 @@ fn list(
if let Ok(entry) = entry {
res.push(ArchiveEntry::new(
full_path.as_os_str().as_bytes(),
- &entry,
+ Some(&entry),
));
}
}
@@ -192,7 +192,7 @@ fn list(
t_path.extend(t.as_bytes());
res.push(ArchiveEntry::new(
&t_path[..],
- &DirEntryAttribute::Directory { start: 0 },
+ None,
));
}
}
@@ -203,7 +203,8 @@ fn list(
c_path.extend(c.as_bytes());
res.push(ArchiveEntry::new(
&c_path[..],
- &DirEntryAttribute::Directory { start: 0 },
+ // this marks the beginning of a filesystem, i.e. '/', so this is a Directory
+ Some(&DirEntryAttribute::Directory { start: 0 }),
));
}
}
--
2.20.1
More information about the pbs-devel
mailing list