]> git.proxmox.com Git - proxmox-backup.git/commitdiff
client: pxar: json encode cli exclude pattern in prelude
authorChristian Ebner <c.ebner@proxmox.com>
Mon, 10 Jun 2024 11:06:20 +0000 (13:06 +0200)
committerFabian Grünbichler <f.gruenbichler@proxmox.com>
Mon, 10 Jun 2024 11:11:29 +0000 (13:11 +0200)
The current encoding is not extensible, so encode the cli exclude
patterns as json instead. By this, the prelude is easily seralized
and deserialized, while remaining human readable.

Originally-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
pbs-client/src/pxar/create.rs

index 12a4d92c30dad078b157d1864527f2d8d04ad925..dc0a31e7a52dc2e14b89ed57084a22bc67ba449d 100644 (file)
@@ -16,6 +16,7 @@ use nix::dir::Dir;
 use nix::errno::Errno;
 use nix::fcntl::OFlag;
 use nix::sys::stat::{FileStat, Mode};
+use serde::{Deserialize, Serialize};
 
 use pathpatterns::{MatchEntry, MatchFlag, MatchList, MatchType, PatternFlag};
 use proxmox_sys::error::SysError;
@@ -154,6 +155,13 @@ struct ReuseStats {
     total_reencoded_size: u64,
 }
 
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub(crate) struct PbsClientPrelude {
+    #[serde(skip_serializing_if = "Option::is_none")]
+    exclude_patterns: Option<String>,
+}
+
 struct Archiver {
     feature_flags: Flags,
     fs_feature_flags: Flags,
@@ -239,9 +247,13 @@ where
         )?);
     }
 
-    let cli_params_content = generate_pxar_excludes_cli(&patterns[..]);
-    let cli_params = if options.previous_ref.is_some() {
-        Some(cli_params_content.as_slice())
+    let prelude = if options.previous_ref.is_some() && !patterns.is_empty() {
+        let prelude = PbsClientPrelude {
+            exclude_patterns: Some(String::from_utf8(generate_pxar_excludes_cli(
+                &patterns[..],
+            ))?),
+        };
+        Some(serde_json::to_vec(&prelude)?)
     } else {
         None
     };
@@ -257,7 +269,7 @@ where
             (None, None)
         };
 
-    let mut encoder = Encoder::new(writers.archive, &metadata, cli_params).await?;
+    let mut encoder = Encoder::new(writers.archive, &metadata, prelude.as_deref()).await?;
 
     let mut archiver = Archiver {
         feature_flags,