Skip to content

Commit 89e5209

Browse files
committed
issue-2209: Add Flatpak package manager backend.
1 parent aff5116 commit 89e5209

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

src/blocks/packages.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//! - `aur` for Arch-based systems
77
//! - `brew` for the Homebrew Package Manager
88
//! - `dnf` for Fedora-based systems
9+
//! - `flatpak` for Flatpak packages
910
//! - `pacman` for Arch-based systems
1011
//! - `snap` for Snap packages
1112
//! - `xbps` for Void Linux
@@ -33,6 +34,7 @@
3334
//! `aur` | Number of updates available in Arch-based systems | Number | -
3435
//! `brew` | Number of updates available in the Homebrew Package Manager | Number | -
3536
//! `dnf` | Number of updates available in Fedora-based systems | Number | -
37+
//! `flatpak` | Number of updates available in Flatpak packages | Number | -
3638
//! `pacman` | Number of updates available in Arch-based systems | Number | -
3739
//! `snap` | Number of updates available in Snap packages | Number | -
3840
//! `xbps` | Number of updates available in Void Linux | Number | -
@@ -158,6 +160,24 @@
158160
//! cmd = "dnf list -q --upgrades | tail -n +2 | rofi -dmenu"
159161
//! ```
160162
//!
163+
//! Flatpak-only config:
164+
//!
165+
//! ```toml
166+
//! [[block]]
167+
//! block = "packages"
168+
//! package_manager = ["flatpak"]
169+
//! interval = 1800
170+
//! error_interval = 300
171+
//! max_retries = 5
172+
//! format = " $icon $flatpak.eng(w:1) updates available "
173+
//! format_singular = " $icon One update available "
174+
//! format_up_to_date = " $icon system up to date "
175+
//! [[block.click]]
176+
//! # shows dmenu with cached available updates. Any dmenu alternative should also work.
177+
//! button = "left"
178+
//! cmd = "flatpak remote-ls --updates --no-header --columns=ref | tail -n +2 | rofi -dmenu"
179+
//! ```
180+
//!
161181
//! Pacman-only config:
162182
//!
163183
//! ```toml
@@ -239,11 +259,11 @@
239259
//! ```toml
240260
//! [[block]]
241261
//! block = "packages"
242-
//! package_manager = ["apk", "apt", "aur", "brew", "dnf", "pacman", "snap", "xbps"]
262+
//! package_manager = ["apk", "apt", "aur", "brew", "dnf", "flatpak", "pacman", "snap", "xbps"]
243263
//! interval = 1800
244264
//! error_interval = 300
245265
//! max_retries = 5
246-
//! format = " $icon $apk + $apt + $aur + $brew + $dnf + $pacman + $snap + $xbps = $total updates available "
266+
//! format = " $icon $apk + $apt + $aur + $brew + $dnf + $flatpak + $pacman + $snap + $xbps = $total updates available "
247267
//! format_singular = " $icon One update available "
248268
//! format_up_to_date = " $icon system up to date "
249269
//! # If a linux update is available, but no ZFS package, it won't be possible to
@@ -270,6 +290,9 @@ use brew::Brew;
270290
pub mod dnf;
271291
use dnf::Dnf;
272292

293+
pub mod flatpak;
294+
use flatpak::Flatpak;
295+
273296
pub mod pacman;
274297
use pacman::{Aur, Pacman};
275298

@@ -307,6 +330,7 @@ pub enum PackageManager {
307330
Aur,
308331
Brew,
309332
Dnf,
333+
Flatpak,
310334
Pacman,
311335
Snap,
312336
Xbps,
@@ -321,6 +345,7 @@ impl PackageManager {
321345
PackageManager::Aur => "aur",
322346
PackageManager::Brew => "brew",
323347
PackageManager::Dnf => "dnf",
348+
PackageManager::Flatpak => "flatpak",
324349
PackageManager::Pacman => "pacman",
325350
PackageManager::Snap => "snap",
326351
PackageManager::Xbps => "xbps",
@@ -337,6 +362,7 @@ impl PackageManager {
337362
)),
338363
PackageManager::Brew => Box::new(Brew::new()),
339364
PackageManager::Dnf => Box::new(Dnf::new()),
365+
PackageManager::Flatpak => Box::new(Flatpak::new()),
340366
PackageManager::Pacman => Box::new(Pacman::new().await?),
341367
PackageManager::Snap => Box::new(Snap::new()),
342368
PackageManager::Xbps => Box::new(Xbps::new()),
@@ -375,6 +401,7 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
375401
check_manager!(PackageManager::Aur);
376402
check_manager!(PackageManager::Brew);
377403
check_manager!(PackageManager::Dnf);
404+
check_manager!(PackageManager::Flatpak);
378405
check_manager!(PackageManager::Pacman);
379406
check_manager!(PackageManager::Snap);
380407
check_manager!(PackageManager::Xbps);

src/blocks/packages/flatpak.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use tokio::process::Command;
2+
3+
use super::*;
4+
5+
#[derive(Default)]
6+
pub struct Flatpak;
7+
8+
impl Flatpak {
9+
pub fn new() -> Self {
10+
Default::default()
11+
}
12+
}
13+
14+
#[async_trait]
15+
impl Backend for Flatpak {
16+
fn name(&self) -> Cow<'static, str> {
17+
"flatpak".into()
18+
}
19+
20+
async fn get_updates_list(&self) -> Result<Vec<String>> {
21+
Command::new("flatpak")
22+
.env("LC_ALL", "C")
23+
.args(["update", "--appstream", "-y"])
24+
.output()
25+
.await
26+
.error("Failed to run `flatpak update`")?;
27+
28+
let stdout = Command::new("flatpak")
29+
.env("LC_ALL", "C")
30+
.args(["remote-ls", "--updates", "--no-header", "--columns=ref"])
31+
.output()
32+
.await
33+
.error("Failed to run `flatpak remote-ls`")?
34+
.stdout;
35+
36+
let updates = String::from_utf8(stdout)
37+
.error("flatpak produced non-UTF8 output")?
38+
.lines()
39+
.filter_map(|line| (line.len() > 1).then_some(line.to_string()))
40+
.collect();
41+
42+
Ok(updates)
43+
}
44+
}

0 commit comments

Comments
 (0)