Skip to content

Commit b307047

Browse files
remkobim9262
authored andcommitted
Add support for apk package manager to packages block
Resolves: #2212
1 parent 425daa3 commit b307047

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed

cspell.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ words:
2222
- amixer
2323
- apcupsd
2424
- aplay
25+
- apk
2526
- armv
2627
- arphrd
2728
- backon

src/blocks/packages.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//! - `aur` for Arch based system
77
//! - `dnf` for Fedora based system
88
//! - `xbps` for Void Linux
9+
//! - `apk` for Alpine Linux
910
//!
1011
//! # Configuration
1112
//!
@@ -30,6 +31,7 @@
3031
//! `aur` | Number of updates available in Arch based system | Number | -
3132
//! `dnf` | Number of updates available in Fedora based system | Number | -
3233
//! `xbps` | Number of updates available in Void Linux | Number | -
34+
//! `apk` | Number of updates available in Alpine Linux | Number | -
3335
//! `total` | Number of updates available in all package manager listed | Number | -
3436
//!
3537
//! # Apt
@@ -174,18 +176,37 @@
174176
//! cmd = "xbps-install -Mun | dmenu -l 10"
175177
//! ```
176178
//!
179+
//!
180+
//! Apk only config:
181+
//!
182+
//! ```toml
183+
//! [[block]]
184+
//! block = "packages"
185+
//! package_manager = ["apk"]
186+
//! interval = 1800
187+
//! error_interval = 300
188+
//! max_retries = 5
189+
//! format = " $icon $apk.eng(w:1) updates available "
190+
//! format_singular = " $icon One update available "
191+
//! format_up_to_date = " $icon system up to date "
192+
//! [[block.click]]
193+
//! # shows dmenu with available updates. Any dmenu alternative should also work.
194+
//! button = "left"
195+
//! cmd = "apk --no-cache --upgradable list | dmenu -l 10"
196+
//! ```
197+
//!
177198
//! Multiple package managers config:
178199
//!
179200
//! Update the list of pending updates every thirty minutes (1800 seconds):
180201
//!
181202
//! ```toml
182203
//! [[block]]
183204
//! block = "packages"
184-
//! package_manager = ["apt", "pacman", "aur", "dnf", "xbps"]
205+
//! package_manager = ["apt", "pacman", "aur", "dnf", "xbps", "apk"]
185206
//! interval = 1800
186207
//! error_interval = 300
187208
//! max_retries = 5
188-
//! format = " $icon $apt + $pacman + $aur + $dnf + $xbps = $total updates available "
209+
//! format = " $icon $apt + $pacman + $aur + $dnf + $xbps + $apk = $total updates available "
189210
//! format_singular = " $icon One update available "
190211
//! format_up_to_date = " $icon system up to date "
191212
//! # If a linux update is available, but no ZFS package, it won't be possible to
@@ -212,6 +233,9 @@ use dnf::Dnf;
212233
pub mod xbps;
213234
use xbps::Xbps;
214235

236+
pub mod apk;
237+
use apk::Apk;
238+
215239
use regex::Regex;
216240

217241
use super::prelude::*;
@@ -240,6 +264,7 @@ pub enum PackageManager {
240264
Aur,
241265
Dnf,
242266
Xbps,
267+
Apk,
243268
}
244269

245270
pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
@@ -267,6 +292,7 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
267292
let pacman = any_format_contains!("pacman");
268293
let dnf = any_format_contains!("dnf");
269294
let xbps = any_format_contains!("xbps");
295+
let apk = any_format_contains!("apk");
270296

271297
if !config.package_manager.contains(&PackageManager::Apt) && apt {
272298
config.package_manager.push(PackageManager::Apt);
@@ -283,6 +309,9 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
283309
if !config.package_manager.contains(&PackageManager::Xbps) && xbps {
284310
config.package_manager.push(PackageManager::Xbps);
285311
}
312+
if !config.package_manager.contains(&PackageManager::Apk) && apk {
313+
config.package_manager.push(PackageManager::Apk);
314+
}
286315

287316
let warning_updates_regex = config
288317
.warning_updates_regex
@@ -314,6 +343,7 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
314343
)),
315344
PackageManager::Dnf => Box::new(Dnf::new()),
316345
PackageManager::Xbps => Box::new(Xbps::new()),
346+
PackageManager::Apk => Box::new(Apk::new()),
317347
});
318348
}
319349

src/blocks/packages/apk.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use tokio::process::Command;
2+
3+
use super::*;
4+
5+
#[derive(Default)]
6+
pub struct Apk;
7+
8+
impl Apk {
9+
pub fn new() -> Self {
10+
Default::default()
11+
}
12+
}
13+
14+
#[async_trait]
15+
impl Backend for Apk {
16+
fn name(&self) -> Cow<'static, str> {
17+
"apk".into()
18+
}
19+
20+
async fn get_updates_list(&self) -> Result<Vec<String>> {
21+
let stdout = Command::new("apk")
22+
.env("LC_LANG", "C")
23+
.args(["--no-cache", "-q", "list", "--upgradable"])
24+
.output()
25+
.await
26+
.error("Problem running apk command")?
27+
.stdout;
28+
29+
let updates = String::from_utf8(stdout).expect("apk produced non-UTF8 output");
30+
let updates_list: Vec<String> = updates
31+
.lines()
32+
.filter(|line| line.len() > 1)
33+
.map(|line| line.to_string())
34+
.collect();
35+
36+
Ok(updates_list)
37+
}
38+
}

0 commit comments

Comments
 (0)