aboutsummaryrefslogtreecommitdiffstats
path: root/pkgs
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-04-14 17:06:03 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2026-04-14 17:06:03 +0200
commit6b5e7b7f67e0d09f37ae4e8cb0d57ab416f1e873 (patch)
tree2fd8ca601aca89f99019999d6a3743e3785e0b56 /pkgs
parentpkgs/tskm/inputs: Auto-add a tag for the current date on file import (diff)
downloadnixos-config-6b5e7b7f67e0d09f37ae4e8cb0d57ab416f1e873.zip
modules/i3status-rust: Use upstream package
My patches have been merged upstream.
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/by-name/i3/i3status-rust-patched/package.nix22
-rw-r--r--pkgs/by-name/i3/i3status-rust-patched/patches/0001-disk_space-Support-btrfs-backend.patch190
2 files changed, 0 insertions, 212 deletions
diff --git a/pkgs/by-name/i3/i3status-rust-patched/package.nix b/pkgs/by-name/i3/i3status-rust-patched/package.nix
deleted file mode 100644
index a103e275..00000000
--- a/pkgs/by-name/i3/i3status-rust-patched/package.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
- i3status-rust,
-}:
-i3status-rust.overrideAttrs (final: prev: {
- pname = "${prev.pname}-patched";
-
- patches =
- (prev.patches or [])
- ++ [
- # Btrfs support for disk_space block.
- ./patches/0001-disk_space-Support-btrfs-backend.patch
- ];
-})
diff --git a/pkgs/by-name/i3/i3status-rust-patched/patches/0001-disk_space-Support-btrfs-backend.patch b/pkgs/by-name/i3/i3status-rust-patched/patches/0001-disk_space-Support-btrfs-backend.patch
deleted file mode 100644
index 8ef0af2e..00000000
--- a/pkgs/by-name/i3/i3status-rust-patched/patches/0001-disk_space-Support-btrfs-backend.patch
+++ /dev/null
@@ -1,190 +0,0 @@
-From 78d2936b67064e3b5e700a2859d00ea3dd6eda4c Mon Sep 17 00:00:00 2001
-From: Benedikt Peetz <benedikt.peetz@b-peetz.de>
-Date: Sun, 18 May 2025 20:22:04 +0200
-Subject: [PATCH 1/3] disk_space: Support btrfs backend
-
-Btrfs is too smart for the statvfs based backend (i.e., only counting
-blocks leads to wrong numbers).
-
-For example, a btrfs disk with a lot of de-duplicated blocks (via the copy
-on write mechanism) might have a drastically over-reported disk usage.
-
-The btrfs backend is currently implemented by parsing the output of the
-`btrfs filesystem usage --raw` command. This is suboptimal, as this now
-relies on the command output not changing.
-
-Vendoring the algorithm used internally by the `btrfs` command does not
-seem to be a reasonable alternative, considering that the code[1] is
-rather complex, low level and would require semi-constant maintenance.
-Additionally, the c code would need bindings to be usable from rust.
-
-I assume, that the `btrfs` command output will stay rather similar in
-the future, as a lot of tools rely on directly parsing it (see the
-various scripts in the issue, this commit fixes).
-
-[1]: https://github.com/kdave/btrfs-progs/blob/eeab081e9d9fbdf4583122ed1caedf541383cf2d/cmds/filesystem-usage.c#L442
-
-Fixes: #1654
----
- src/blocks/disk_space.rs | 112 +++++++++++++++++++++++++++++++++++----
- 1 file changed, 101 insertions(+), 11 deletions(-)
-
-diff --git a/src/blocks/disk_space.rs b/src/blocks/disk_space.rs
-index 79bfebd27..da0d3f518 100644
---- a/src/blocks/disk_space.rs
-+++ b/src/blocks/disk_space.rs
-@@ -12,6 +12,7 @@
- //! `alert` | A value which will trigger critical block state | `10.0`
- //! `info_type` | Determines which information will affect the block state. Possible values are `"available"`, `"free"` and `"used"` | `"available"`
- //! `alert_unit` | The unit of `alert` and `warning` options. If not set, percents are used. Possible values are `"B"`, `"KB"`, `"KiB"`, `"MB"`, `"MiB"`, `"GB"`, `"Gib"`, `"TB"` and `"TiB"` | `None`
-+//! `backend` | The backend to use when querying disk usage. Possible values are `"vfs"` (like `du(1)`) and `"btrfs"` | `"vfs"`
- //!
- //! Placeholder | Value | Type | Unit
- //! -------------|--------------------------------------------------------------------|--------|-------
-@@ -63,9 +64,12 @@
-
- // make_log_macro!(debug, "disk_space");
-
-+use std::cell::OnceCell;
-+
- use super::prelude::*;
- use crate::formatting::prefix::Prefix;
- use nix::sys::statvfs::statvfs;
-+use tokio::process::Command;
-
- #[derive(Copy, Clone, Debug, Deserialize, SmartDefault)]
- #[serde(rename_all = "lowercase")]
-@@ -76,11 +80,20 @@ pub enum InfoType {
- Used,
- }
-
-+#[derive(Copy, Clone, Debug, Deserialize, SmartDefault)]
-+#[serde(rename_all = "lowercase")]
-+pub enum Backend {
-+ #[default]
-+ Vfs,
-+ Btrfs,
-+}
-+
- #[derive(Deserialize, Debug, SmartDefault)]
- #[serde(deny_unknown_fields, default)]
- pub struct Config {
- #[default("/".into())]
- pub path: ShellString,
-+ pub backend: Backend,
- pub info_type: InfoType,
- pub format: FormatConfig,
- pub format_alt: Option<FormatConfig>,
-@@ -128,17 +141,9 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
- loop {
- let mut widget = Widget::new().with_format(format.clone());
-
-- let statvfs = statvfs(&*path).error("failed to retrieve statvfs")?;
--
-- // Casting to be compatible with 32-bit systems
-- #[allow(clippy::unnecessary_cast)]
-- let (total, used, available, free) = {
-- let total = (statvfs.blocks() as u64) * (statvfs.fragment_size() as u64);
-- let used = ((statvfs.blocks() as u64) - (statvfs.blocks_free() as u64))
-- * (statvfs.fragment_size() as u64);
-- let available = (statvfs.blocks_available() as u64) * (statvfs.block_size() as u64);
-- let free = (statvfs.blocks_free() as u64) * (statvfs.block_size() as u64);
-- (total, used, available, free)
-+ let (total, used, available, free) = match config.backend {
-+ Backend::Vfs => get_vfs(&*path)?,
-+ Backend::Btrfs => get_btrfs(&path).await?,
- };
-
- let result = match config.info_type {
-@@ -205,3 +210,88 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
- }
- }
- }
-+
-+fn get_vfs<P>(path: &P) -> Result<(u64, u64, u64, u64)>
-+where
-+ P: ?Sized + nix::NixPath,
-+{
-+ let statvfs = statvfs(path).error("failed to retrieve statvfs")?;
-+
-+ // Casting to be compatible with 32-bit systems
-+ #[allow(clippy::unnecessary_cast)]
-+ {
-+ let total = (statvfs.blocks() as u64) * (statvfs.fragment_size() as u64);
-+ let used = ((statvfs.blocks() as u64) - (statvfs.blocks_free() as u64))
-+ * (statvfs.fragment_size() as u64);
-+ let available = (statvfs.blocks_available() as u64) * (statvfs.block_size() as u64);
-+ let free = (statvfs.blocks_free() as u64) * (statvfs.block_size() as u64);
-+
-+ Ok((total, used, available, free))
-+ }
-+}
-+
-+async fn get_btrfs(path: &str) -> Result<(u64, u64, u64, u64)> {
-+ const OUTPUT_CHANGED: &str = "Btrfs filesystem usage output format changed";
-+
-+ fn remove_estimate_min(estimate_str: &str) -> Result<&str> {
-+ estimate_str.trim_matches('\t')
-+ .split_once("\t")
-+ .ok_or(Error::new(OUTPUT_CHANGED))
-+ .map(|v| v.0)
-+ }
-+
-+ macro_rules! get {
-+ ($source:expr, $name:expr, $variable:ident) => {
-+ get!(@pre_op (|a| {Ok::<_, Error>(a)}), $source, $name, $variable)
-+ };
-+ (@pre_op $function:expr, $source:expr, $name:expr, $variable:ident) => {
-+ if $source.starts_with(concat!($name, ":")) {
-+ let (found_name, variable_str) =
-+ $source.split_once(":").ok_or(Error::new(OUTPUT_CHANGED))?;
-+
-+ let variable_str = $function(variable_str)?;
-+
-+ debug_assert_eq!(found_name, $name);
-+ $variable
-+ .set(variable_str.trim().parse().error(OUTPUT_CHANGED)?)
-+ .map_err(|_| Error::new(OUTPUT_CHANGED))?;
-+ }
-+ };
-+ }
-+
-+ let filesystem_usage = Command::new("btrfs")
-+ .args(["filesystem", "usage", "--raw", path])
-+ .output()
-+ .await
-+ .error("Failed to collect btrfs filesystem usage info")?
-+ .stdout;
-+
-+ {
-+ let final_total = OnceCell::new();
-+ let final_used = OnceCell::new();
-+ let final_free = OnceCell::new();
-+
-+ let mut lines = filesystem_usage.lines();
-+ while let Some(line) = lines
-+ .next_line()
-+ .await
-+ .error("Failed to read output of btrfs filesystem usage")?
-+ {
-+ let line = line.trim();
-+
-+ // See btrfs-filesystem(8) for an explanation for the rows.
-+ get!(line, "Device size", final_total);
-+ get!(line, "Used", final_used);
-+ get!(@pre_op remove_estimate_min, line, "Free (estimated)", final_free);
-+ }
-+
-+ Ok((
-+ *final_total.get().ok_or(Error::new(OUTPUT_CHANGED))?,
-+ *final_used.get().ok_or(Error::new(OUTPUT_CHANGED))?,
-+ // HACK(@bpeetz): We also return the free disk space as the available one, because btrfs
-+ // does not tell us which disk space is reserved for the fs. <2025-05-18>
-+ *final_free.get().ok_or(Error::new(OUTPUT_CHANGED))?,
-+ *final_free.get().ok_or(Error::new(OUTPUT_CHANGED))?,
-+ ))
-+ }
-+}
---
-2.49.0
-