From 42f22c110c949442a9f2a6749af4b729fed5c6e1 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Thu, 29 May 2025 15:33:32 +0200 Subject: [PATCH] Can compress raw files --- virtweb_backend/src/utils/file_disks_utils.rs | 39 +++++++++++++++++++ .../src/routes/DiskImagesRoute.tsx | 9 +++++ 2 files changed, 48 insertions(+) diff --git a/virtweb_backend/src/utils/file_disks_utils.rs b/virtweb_backend/src/utils/file_disks_utils.rs index fce7212..068f46f 100644 --- a/virtweb_backend/src/utils/file_disks_utils.rs +++ b/virtweb_backend/src/utils/file_disks_utils.rs @@ -212,6 +212,45 @@ impl DiskFileInfo { cmd } + // Render raw file non sparse + (DiskFileFormat::Raw { is_sparse: true }, DiskFileFormat::Raw { is_sparse: false }) => { + let mut cmd = Command::new(constants::COPY_PROGRAM); + cmd.arg("--sparse=never") + .arg(&self.file_path) + .arg(&temp_file); + cmd + } + + // Render raw file sparse + (DiskFileFormat::Raw { is_sparse: false }, DiskFileFormat::Raw { is_sparse: true }) => { + let mut cmd = Command::new(constants::COPY_PROGRAM); + cmd.arg("--sparse=always") + .arg(&self.file_path) + .arg(&temp_file); + cmd + } + + // Compress Raw + (DiskFileFormat::Raw { .. }, DiskFileFormat::CompressedRaw) => { + let mut cmd = Command::new(constants::GZIP_PROGRAM); + cmd.arg("--keep") + .arg("--to-stdout") + .arg(&self.file_path) + .stdout(File::create(&temp_file)?); + cmd + } + + // Decompress Raw to not sparse file + (DiskFileFormat::CompressedRaw, DiskFileFormat::Raw { is_sparse: false }) => { + let mut cmd = Command::new(constants::GZIP_PROGRAM); + cmd.arg("--keep") + .arg("--decompress") + .arg("--to-stdout") + .arg(&self.file_path) + .stdout(File::create(&temp_file)?); + cmd + } + // Dumb copy of file (a, b) if a == b => { let mut cmd = Command::new(constants::COPY_PROGRAM); diff --git a/virtweb_frontend/src/routes/DiskImagesRoute.tsx b/virtweb_frontend/src/routes/DiskImagesRoute.tsx index 9ce411b..11d61c2 100644 --- a/virtweb_frontend/src/routes/DiskImagesRoute.tsx +++ b/virtweb_frontend/src/routes/DiskImagesRoute.tsx @@ -226,6 +226,15 @@ function DiskImageList(p: { field: "format", headerName: "Format", flex: 1, + renderCell(params) { + let content = params.row.format; + + if (params.row.format === "Raw") { + content += params.row.is_sparse ? " (Sparse)" : " (Fixed)"; + } + + return content; + }, }, { field: "file_size",