Can decompress XZ files

This commit is contained in:
2025-06-09 17:04:35 +02:00
parent 759361d9f6
commit d7796e1459
2 changed files with 30 additions and 4 deletions

View File

@ -284,7 +284,7 @@ impl DiskFileInfo {
cmd cmd
} }
// Decompress Raw to not sparse file // Decompress Raw (Gz) to not sparse file
(DiskFileFormat::GzCompressedRaw, DiskFileFormat::Raw { is_sparse: false }) => { (DiskFileFormat::GzCompressedRaw, DiskFileFormat::Raw { is_sparse: false }) => {
let mut cmd = Command::new(constants::PROGRAM_GZIP); let mut cmd = Command::new(constants::PROGRAM_GZIP);
cmd.arg("--keep") cmd.arg("--keep")
@ -294,13 +294,23 @@ impl DiskFileInfo {
.stdout(File::create(&temp_file)?); .stdout(File::create(&temp_file)?);
cmd cmd
} }
// Decompress Raw (Xz) to not sparse file
(DiskFileFormat::XzCompressedRaw, DiskFileFormat::Raw { is_sparse: false }) => {
let mut cmd = Command::new(constants::PROGRAM_XZ);
cmd.arg("--keep")
.arg("--decompress")
.arg("--to-stdout")
.arg(&self.file_path)
.stdout(File::create(&temp_file)?);
cmd
}
// Decompress Raw to sparse file // Decompress Raw (Gz) to sparse file
// https://benou.fr/www/ben/decompressing-sparse-files.html // https://benou.fr/www/ben/decompressing-sparse-files.html
(DiskFileFormat::GzCompressedRaw, DiskFileFormat::Raw { is_sparse: true }) => { (DiskFileFormat::GzCompressedRaw, DiskFileFormat::Raw { is_sparse: true }) => {
let mut cmd = Command::new(constants::PROGRAM_BASH); let mut cmd = Command::new(constants::PROGRAM_BASH);
cmd.arg("-c").arg(format!( cmd.arg("-c").arg(format!(
"{} -d -c {} | {} conv=sparse of={}", "{} --decompress --to-stdout {} | {} conv=sparse of={}",
constants::PROGRAM_GZIP, constants::PROGRAM_GZIP,
self.file_path.display(), self.file_path.display(),
constants::PROGRAM_DD, constants::PROGRAM_DD,
@ -309,6 +319,20 @@ impl DiskFileInfo {
cmd cmd
} }
// Decompress Raw (XZ) to sparse file
// https://benou.fr/www/ben/decompressing-sparse-files.html
(DiskFileFormat::XzCompressedRaw, DiskFileFormat::Raw { is_sparse: true }) => {
let mut cmd = Command::new(constants::PROGRAM_BASH);
cmd.arg("-c").arg(format!(
"{} --decompress --to-stdout {} | {} conv=sparse of={}",
constants::PROGRAM_XZ,
self.file_path.display(),
constants::PROGRAM_DD,
temp_file.display()
));
cmd
}
// Dumb copy of file // Dumb copy of file
(a, b) if a == b => { (a, b) if a == b => {
let mut cmd = Command::new(constants::PROGRAM_COPY); let mut cmd = Command::new(constants::PROGRAM_COPY);

View File

@ -5,7 +5,9 @@ export type DiskImageFormat =
| { format: "Raw"; is_sparse: boolean } | { format: "Raw"; is_sparse: boolean }
| { format: "QCow2"; virtual_size?: number } | { format: "QCow2"; virtual_size?: number }
| { format: "GzCompressedQCow2" } | { format: "GzCompressedQCow2" }
| { format: "GzCompressedRaw" }; | { format: "GzCompressedRaw" }
| { format: "XzCompressedQCow2" }
| { format: "XzCompressedRaw" };
export type DiskImage = { export type DiskImage = {
file_size: number; file_size: number;