Skip to content

Commit 4a8f962

Browse files
committed
feat(oma-fetch,oma-refresh): support lzma and lz4 file download and decompress
1 parent 31d67a3 commit 4a8f962

File tree

5 files changed

+87
-23
lines changed

5 files changed

+87
-23
lines changed

Cargo.lock

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

oma-fetch/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ faster-hex = "0.10"
1515
sha2 = "0.10"
1616
futures = "0.3"
1717
# FIXME: issue https://github.com/AOSC-Dev/oma/issues/547, workaround downgrade to 0.4.27
18-
async-compression = { version = "=0.4.27", features = ["gzip", "xz", "futures-io", "bzip2", "zstd"] }
18+
async-compression = { version = "=0.4.27", features = ["gzip", "xz", "futures-io", "bzip2", "zstd", "lz4"] }
1919
# Note: Use the `uncheck_liblzma_version` feature here to force dynamic linking
2020
# even with older liblzma (Ubuntu 22.04 uses 5.2.x). Be mindful, however, that
2121
# async-compression depends on a different liblzma-rs than what is specified here.

oma-fetch/src/download.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ use std::{
66
time::Duration,
77
};
88

9-
use async_compression::futures::bufread::{BzDecoder, GzipDecoder, XzDecoder, ZstdDecoder};
9+
use async_compression::futures::bufread::{
10+
BzDecoder, GzipDecoder, Lz4Decoder, LzmaDecoder, XzDecoder, ZstdDecoder,
11+
};
1012
use bon::bon;
1113
use futures::{AsyncRead, TryStreamExt, io::BufReader};
1214
use reqwest::{
@@ -477,10 +479,10 @@ impl<'a> SingleDownloader<'a> {
477479
CompressFile::Xz => &mut XzDecoder::new(BufReader::new(bytes_stream)),
478480
CompressFile::Gzip => &mut GzipDecoder::new(BufReader::new(bytes_stream)),
479481
CompressFile::Bz2 => &mut BzDecoder::new(BufReader::new(bytes_stream)),
480-
CompressFile::Nothing => &mut BufReader::new(bytes_stream),
481482
CompressFile::Zstd => &mut ZstdDecoder::new(BufReader::new(bytes_stream)),
482-
CompressFile::Lzma => unimplemented!(),
483-
CompressFile::Lz4 => unimplemented!(),
483+
CompressFile::Lzma => &mut LzmaDecoder::new(BufReader::new(bytes_stream)),
484+
CompressFile::Lz4 => &mut Lz4Decoder::new(BufReader::new(bytes_stream)),
485+
CompressFile::Nothing => &mut BufReader::new(bytes_stream),
484486
};
485487

486488
let mut reader = reader.compat();
@@ -627,10 +629,10 @@ impl<'a> SingleDownloader<'a> {
627629
CompressFile::Xz => &mut XzDecoder::new(BufReader::new(from)),
628630
CompressFile::Gzip => &mut GzipDecoder::new(BufReader::new(from)),
629631
CompressFile::Bz2 => &mut BzDecoder::new(BufReader::new(from)),
630-
CompressFile::Nothing => &mut BufReader::new(from),
631632
CompressFile::Zstd => &mut ZstdDecoder::new(BufReader::new(from)),
632-
CompressFile::Lzma => unimplemented!(),
633-
CompressFile::Lz4 => unimplemented!(),
633+
CompressFile::Lzma => &mut LzmaDecoder::new(BufReader::new(from)),
634+
CompressFile::Lz4 => &mut Lz4Decoder::new(BufReader::new(from)),
635+
CompressFile::Nothing => &mut BufReader::new(from),
634636
};
635637

636638
let mut reader = reader.compat();

oma-refresh/src/config.rs

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ use aho_corasick::AhoCorasick;
55
#[cfg(feature = "apt")]
66
use oma_apt::config::{Config, ConfigTree};
77
use oma_fetch::CompressFile;
8+
use once_cell::sync::OnceCell;
89
use tracing::debug;
910

1011
use crate::{db::RefreshError, inrelease::ChecksumItem};
1112

13+
static COMPRESSION_ORDER: OnceCell<Vec<CompressFileWrapper>> = OnceCell::new();
14+
1215
#[derive(Debug, Eq, PartialEq)]
1316
struct CompressFileWrapper {
1417
compress_file: CompressFile,
@@ -36,7 +39,10 @@ impl From<&str> for CompressFileWrapper {
3639
compress_file: CompressFile::Zstd,
3740
},
3841
x => {
39-
debug!("{x} format is not compress format");
42+
if !x.is_ascii() {
43+
debug!("{x} format is not compress format");
44+
}
45+
4046
CompressFileWrapper {
4147
compress_file: CompressFile::Nothing,
4248
}
@@ -55,11 +61,13 @@ impl PartialOrd for CompressFileWrapper {
5561
impl Ord for CompressFileWrapper {
5662
fn cmp(&self, other: &Self) -> Ordering {
5763
let config = Config::new();
58-
let t = config
59-
.get_compression_types()
60-
.iter()
61-
.map(|t| CompressFileWrapper::from(t.as_str()))
62-
.collect::<Vec<_>>();
64+
let t = COMPRESSION_ORDER.get_or_init(|| {
65+
config
66+
.get_compression_types()
67+
.iter()
68+
.map(|t| CompressFileWrapper::from(t.as_str()))
69+
.collect::<Vec<_>>()
70+
});
6371

6472
let self_pos = t.iter().position(|x| x == self).unwrap();
6573
let other_pos = t.iter().position(|x| x == other).unwrap();
@@ -71,10 +79,12 @@ impl Ord for CompressFileWrapper {
7179
#[cfg(not(feature = "apt"))]
7280
impl Ord for CompressFileWrapper {
7381
fn cmp(&self, other: &Self) -> Ordering {
74-
let t = vec!["zst", "xz", "bz2", "lzma", "gz", "lz4"]
75-
.into_iter()
76-
.map(CompressFileWrapper::from)
77-
.collect::<Vec<_>>();
82+
let t = COMPRESSION_ORDER.get_or_init(|| {
83+
vec!["zst", "xz", "bz2", "lzma", "gz", "lz4", "uncompressed"]
84+
.into_iter()
85+
.map(CompressFileWrapper::from)
86+
.collect::<Vec<_>>()
87+
});
7888

7989
let self_pos = t.iter().position(|x| x == self).unwrap();
8090
let other_pos = t.iter().position(|x| x == other).unwrap();
@@ -385,15 +395,37 @@ fn compress_file(name: &str) -> CompressFileWrapper {
385395
#[cfg(feature = "apt")]
386396
#[test]
387397
fn test_compression_order() {
388-
let mut t = Config::new()
398+
let config = Config::new();
399+
400+
config.set_vector(
401+
"Acquire::CompressionTypes::Order",
402+
&vec!["zst", "xz", "bz2", "lzma", "gz", "lz4"],
403+
);
404+
405+
let mut types = config
389406
.get_compression_types()
390407
.iter()
391408
.map(|t| CompressFileWrapper::from(t.as_str()))
392409
.collect::<Vec<_>>();
393410

394-
t.sort();
411+
types.sort_unstable();
412+
types.reverse();
395413

396-
dbg!(t);
414+
assert_eq!(
415+
types,
416+
vec![
417+
CompressFile::Zstd,
418+
CompressFile::Xz,
419+
CompressFile::Bz2,
420+
CompressFile::Lzma,
421+
CompressFile::Gzip,
422+
CompressFile::Lz4,
423+
CompressFile::Nothing
424+
]
425+
.into_iter()
426+
.map(|x| x.into())
427+
.collect::<Vec<CompressFileWrapper>>()
428+
);
397429
}
398430

399431
#[test]

oma-refresh/src/db.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,18 @@ impl<'a> OmaRefresh<'a> {
236236
}
237237

238238
#[cfg(not(feature = "apt"))]
239-
let list_file = self.source.join("etc/apt/sources.list").to_string_lossy().to_string();
239+
let list_file = self
240+
.source
241+
.join("etc/apt/sources.list")
242+
.to_string_lossy()
243+
.to_string();
240244

241245
#[cfg(not(feature = "apt"))]
242-
let list_dir = self.source.join("etc/apt/sources.list.d").to_string_lossy().to_string();
246+
let list_dir = self
247+
.source
248+
.join("etc/apt/sources.list.d")
249+
.to_string_lossy()
250+
.to_string();
243251

244252
scan_sources_lists_paths_from_sysroot(list_file, list_dir)
245253
.await
@@ -878,6 +886,8 @@ fn collect_download_task(
878886
Some("xz") => CompressFile::Xz,
879887
Some("bz2") => CompressFile::Bz2,
880888
Some("zst") => CompressFile::Zstd,
889+
Some("lzma") => CompressFile::Lzma,
890+
Some("lz4") => CompressFile::Lz4,
881891
_ => CompressFile::Nothing,
882892
}
883893
}

0 commit comments

Comments
 (0)