diff --git a/Cargo.lock b/Cargo.lock index 21877876..5854229f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,6 +143,7 @@ version = "0.9.1" dependencies = [ "async-trait", "bytes", + "bzip2", "cargo_metadata", "cargo_toml", "clap 3.1.18", diff --git a/Cargo.toml b/Cargo.toml index 7cdbcc48..ccbee202 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ pkg-fmt = "zip" [dependencies] async-trait = "0.1.56" bytes = "1.1.0" +bzip2 = "0.4.3" cargo_metadata = "0.14.2" cargo_toml = "0.11.4" clap = { version = "3.1.18", features = ["derive"] } diff --git a/src/format.rs b/src/format.rs index 840ffc6a..1cb1d2ed 100644 --- a/src/format.rs +++ b/src/format.rs @@ -10,6 +10,8 @@ use strum_macros::{Display, EnumString, EnumVariantNames}; pub enum PkgFmt { /// Download format is TAR (uncompressed) Tar, + /// Download format is TAR + Bzip2 + Tbz2, /// Download format is TGZ (TAR + GZip) Tgz, /// Download format is TAR + XZ @@ -34,6 +36,7 @@ impl PkgFmt { pub fn decompose(self) -> PkgFmtDecomposed { match self { PkgFmt::Tar => PkgFmtDecomposed::Tar(TarBasedFmt::Tar), + PkgFmt::Tbz2 => PkgFmtDecomposed::Tar(TarBasedFmt::Tbz2), PkgFmt::Tgz => PkgFmtDecomposed::Tar(TarBasedFmt::Tgz), PkgFmt::Txz => PkgFmtDecomposed::Tar(TarBasedFmt::Txz), PkgFmt::Tzstd => PkgFmtDecomposed::Tar(TarBasedFmt::Tzstd), @@ -54,6 +57,8 @@ pub enum PkgFmtDecomposed { pub enum TarBasedFmt { /// Download format is TAR (uncompressed) Tar, + /// Download format is TAR + Bzip2 + Tbz2, /// Download format is TGZ (TAR + GZip) Tgz, /// Download format is TAR + XZ @@ -66,6 +71,7 @@ impl From for PkgFmt { fn from(fmt: TarBasedFmt) -> Self { match fmt { TarBasedFmt::Tar => PkgFmt::Tar, + TarBasedFmt::Tbz2 => PkgFmt::Tbz2, TarBasedFmt::Tgz => PkgFmt::Tgz, TarBasedFmt::Txz => PkgFmt::Txz, TarBasedFmt::Tzstd => PkgFmt::Tzstd, diff --git a/src/helpers/extracter.rs b/src/helpers/extracter.rs index 13f018b6..211f628e 100644 --- a/src/helpers/extracter.rs +++ b/src/helpers/extracter.rs @@ -2,6 +2,7 @@ use std::fs::File; use std::io::{self, BufRead, Read}; use std::path::Path; +use bzip2::bufread::BzDecoder; use flate2::bufread::GzDecoder; use log::debug; use tar::Archive; @@ -19,6 +20,7 @@ pub(super) fn create_tar_decoder( let r: Box = match fmt { Tar => Box::new(dat), + Tbz2 => Box::new(BzDecoder::new(dat)), Tgz => Box::new(GzDecoder::new(dat)), Txz => Box::new(XzDecoder::new(dat)), Tzstd => {