Skip to content

Commit 00052ee

Browse files
committed
feat(oma-fetch,oma-refresh): support lzma and lz4 file download and decompress
1 parent 10647ec commit 00052ee

File tree

5 files changed

+62
-20
lines changed

5 files changed

+62
-20
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::{
@@ -476,10 +478,10 @@ impl<'a> SingleDownloader<'a> {
476478
CompressFile::Xz => &mut XzDecoder::new(BufReader::new(bytes_stream)),
477479
CompressFile::Gzip => &mut GzipDecoder::new(BufReader::new(bytes_stream)),
478480
CompressFile::Bz2 => &mut BzDecoder::new(BufReader::new(bytes_stream)),
479-
CompressFile::Nothing => &mut BufReader::new(bytes_stream),
480481
CompressFile::Zstd => &mut ZstdDecoder::new(BufReader::new(bytes_stream)),
481-
CompressFile::Lzma => unimplemented!(),
482-
CompressFile::Lz4 => unimplemented!(),
482+
CompressFile::Lzma => &mut LzmaDecoder::new(BufReader::new(bytes_stream)),
483+
CompressFile::Lz4 => &mut Lz4Decoder::new(BufReader::new(bytes_stream)),
484+
CompressFile::Nothing => &mut BufReader::new(bytes_stream),
483485
};
484486

485487
let mut reader = reader.compat();
@@ -634,10 +636,10 @@ impl<'a> SingleDownloader<'a> {
634636
CompressFile::Xz => &mut XzDecoder::new(BufReader::new(from)),
635637
CompressFile::Gzip => &mut GzipDecoder::new(BufReader::new(from)),
636638
CompressFile::Bz2 => &mut BzDecoder::new(BufReader::new(from)),
637-
CompressFile::Nothing => &mut BufReader::new(from),
638639
CompressFile::Zstd => &mut ZstdDecoder::new(BufReader::new(from)),
639-
CompressFile::Lzma => unimplemented!(),
640-
CompressFile::Lz4 => unimplemented!(),
640+
CompressFile::Lzma => &mut LzmaDecoder::new(BufReader::new(from)),
641+
CompressFile::Lz4 => &mut Lz4Decoder::new(BufReader::new(from)),
642+
CompressFile::Nothing => &mut BufReader::new(from),
641643
};
642644

643645
let mut reader = reader.compat();

oma-refresh/src/config.rs

Lines changed: 20 additions & 10 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();

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)