Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package bottom for openSUSE:Factory checked in at 2025-08-16 20:39:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/bottom (Old) and /work/SRC/openSUSE:Factory/.bottom.new.1085 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "bottom" Sat Aug 16 20:39:19 2025 rev:26 rq:1299863 version:0.11.1~0 Changes: -------- --- /work/SRC/openSUSE:Factory/bottom/bottom.changes 2025-08-10 22:21:06.200476522 +0200 +++ /work/SRC/openSUSE:Factory/.bottom.new.1085/bottom.changes 2025-08-16 20:44:14.180314641 +0200 @@ -1,0 +2,11 @@ +Fri Aug 15 20:37:17 UTC 2025 - Jan-Luca Kiok <opensuse-packa...@jlk.one> + +- Update to version 0.11.1: + * Bug Fixes + * Fix disk.columns being incorrectly interpreted as blank. + * Fix issue with battery widget time and small widths. + * Other + * Speed up time between startup and displaying data. + + +------------------------------------------------------------------- Old: ---- bottom-0.11.0~0.tar.zst New: ---- bottom-0.11.1~0.tar.zst ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ bottom.spec ++++++ --- /var/tmp/diff_new_pack.43I53t/_old 2025-08-16 20:44:19.836549198 +0200 +++ /var/tmp/diff_new_pack.43I53t/_new 2025-08-16 20:44:19.836549198 +0200 @@ -18,7 +18,7 @@ Name: bottom -Version: 0.11.0~0 +Version: 0.11.1~0 Release: 0 Summary: Yet another graphical process/system monitor License: Apache-2.0 AND MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.43I53t/_old 2025-08-16 20:44:19.880551023 +0200 +++ /var/tmp/diff_new_pack.43I53t/_new 2025-08-16 20:44:19.884551190 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/ClementTsang/bottom.git</param> <param name="versionformat">@PARENT_TAG@~@TAG_OFFSET@</param> <param name="scm">git</param> - <param name="revision">0.11.0</param> + <param name="revision">0.11.1</param> <param name="match-tag">*</param> <param name="versionrewrite-pattern">(\d+\.\d+\.\d+)</param> <param name="versionrewrite-replacement">\1</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.43I53t/_old 2025-08-16 20:44:19.908552184 +0200 +++ /var/tmp/diff_new_pack.43I53t/_new 2025-08-16 20:44:19.912552350 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/ClementTsang/bottom.git</param> - <param name="changesrevision">566502347eeb61819a33a2222faf3621583430a9</param></service></servicedata> + <param name="changesrevision">2578f20ce542047e3906ef87334ce15fbb53c15a</param></service></servicedata> (No newline at EOF) ++++++ bottom-0.11.0~0.tar.zst -> bottom-0.11.1~0.tar.zst ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/.github/ISSUE_TEMPLATE/bug_report.yml new/bottom-0.11.1~0/.github/ISSUE_TEMPLATE/bug_report.yml --- old/bottom-0.11.0~0/.github/ISSUE_TEMPLATE/bug_report.yml 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/.github/ISSUE_TEMPLATE/bug_report.yml 2025-08-15 05:56:41.000000000 +0200 @@ -81,7 +81,7 @@ It would also be helpful if you are not running [the latest version](https://github.com/ClementTsang/bottom/releases/latest) to try that as well to see if the issue has already been resolved. - placeholder: 0.11.0 + placeholder: 0.11.1 - type: textarea id: install diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/.github/ISSUE_TEMPLATE/packaging.yml new/bottom-0.11.1~0/.github/ISSUE_TEMPLATE/packaging.yml --- old/bottom-0.11.0~0/.github/ISSUE_TEMPLATE/packaging.yml 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/.github/ISSUE_TEMPLATE/packaging.yml 2025-08-15 05:56:41.000000000 +0200 @@ -21,10 +21,10 @@ For any other distribution channel, please first try to contact the package maintainers where appropriate to get help regarding distribution-specific issues (e.g. the package has issues installing, the package - is outdated, etc.) before reaching out here. This is as while I am happy to help where possible, I do not - personally use many of the various ways people distribute bottom. As such, unless specified, I might lack the - platform-specific context, knowledge, or tools to be able to help you at all regarding the distribution method, - and the best I can do is just point you to the package maintainer. + is outdated, etc.) before reaching out here. While I am happy to help where possible, I do not + personally use many of the various ways people distribute bottom. As such, I might lack the + platform-specific context, knowledge, or tools to be able to help you at all regarding the + distribution method, and the best I can do is just point you to the package maintainer. - type: checkboxes id: acknowledgements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/.github/workflows/build_releases.yml new/bottom-0.11.1~0/.github/workflows/build_releases.yml --- old/bottom-0.11.0~0/.github/workflows/build_releases.yml 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/.github/workflows/build_releases.yml 2025-08-15 05:56:41.000000000 +0200 @@ -469,9 +469,9 @@ env: BTM_GENERATE: true run: | - cargo install cargo-deb --version 2.5.1 --locked + cargo install cargo-deb --version 3.5.0 --locked cargo deb --no-build --target ${{ matrix.info.target }} - cp ./target/${{ matrix.info.target }}/debian/bottom_*.deb . + cp ./target/debian/bottom_*.deb . - name: Build Debian release (ARM) if: startsWith(matrix.info.target, 'x86_64') != true @@ -480,7 +480,7 @@ run: | docker pull ${{ matrix.info.container }} docker run -t --rm --mount type=bind,source="$(pwd)",target=/volume ${{ matrix.info.container }} "--no-build --variant ${{ matrix.info.dpkg }} --target ${{ matrix.info.target }}" "/volume" - cp ./target/${{ matrix.info.target }}/debian/bottom-*.deb . + cp ./target/debian/bottom-*.deb . TMP_NAME=$(find bottom-*.deb) VERSION=${{ matrix.info.dpkg }} mv $TMP_NAME $(echo $TMP_NAME | sed "s/-$VERSION//") @@ -502,8 +502,8 @@ - name: Delete generated Debian folder run: | - sudo chown $USER ./target/${{ matrix.info.target }}/debian/ 2>/dev/null || true - rm -r ./target/${{ matrix.info.target }}/debian/ + sudo chown $USER ./target/debian/ 2>/dev/null || true + rm -r ./target/debian/ - name: Generate artifact attestation for file uses: actions/attest-build-provenance@6149ea5740be74af77f260b9db67e633f6b0a9a1 # v1.4.2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/.github/workflows/post_release.yml new/bottom-0.11.1~0/.github/workflows/post_release.yml --- old/bottom-0.11.0~0/.github/workflows/post_release.yml 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/.github/workflows/post_release.yml 2025-08-15 05:56:41.000000000 +0200 @@ -1,7 +1,6 @@ # Actions to run after releasing a version, like: # - Generating documentation via mkdocs # - Notifying packaging repos -# - Automatically creating winget packages name: post-release @@ -101,25 +100,3 @@ -H 'Accept: application/vnd.github.everest-preview+json' \ -u ${{ secrets.BOTTOM_PACKAGE_DEPLOYMENT }} \ --data '{ "event_type": "update", "client_payload": { "version": "'"$RELEASE_VERSION"'" } }' - - winget: - needs: [initialize] - runs-on: windows-latest - steps: - - name: Set release version - shell: bash - run: | - echo "RELEASE_VERSION=${{ needs.initialize.outputs.version }}" >> $GITHUB_ENV - - - name: Validate release version - run: | - echo "Release version: ${{ env.RELEASE_VERSION }}" - - - name: Automatically create PR for winget repos - uses: vedantmgoyal2009/winget-releaser@4ffc7888bffd451b357355dc214d43bb9f23917e - with: - identifier: Clement.bottom - installers-regex: '^bottom_x86_64_installer\.msi$' - version: ${{ env.RELEASE_VERSION }} - release-tag: ${{ env.RELEASE_VERSION }} - token: ${{ secrets.WINGET_TOKEN }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/CHANGELOG.md new/bottom-0.11.1~0/CHANGELOG.md --- old/bottom-0.11.0~0/CHANGELOG.md 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/CHANGELOG.md 2025-08-15 05:56:41.000000000 +0200 @@ -20,12 +20,23 @@ --- +## [0.11.1] - 2025-08-15 + +### Bug Fixes + +- [#1776](https://github.com/ClementTsang/bottom/pull/1776): Fix `disk.columns` being incorrectly interpreted as blank. +- [#1787](https://github.com/ClementTsang/bottom/pull/1787): Fix issue with battery widget time and small widths. + +### Other + +- [#1779](https://github.com/ClementTsang/bottom/pull/1779), [#1788](https://github.com/ClementTsang/bottom/pull/1788): Speed up time between startup and displaying data. + ## [0.11.0] - 2025-08-05 ### Features - [#1625](https://github.com/ClementTsang/bottom/pull/1625): Add the ability to configure the disk widget's table columns. -- [#1641](https://github.com/ClementTsang/bottom/pull/1641): Support AMD GPU data collection on Linux. +- [#1641](https://github.com/ClementTsang/bottom/pull/1641) + [#1692](https://github.com/ClementTsang/bottom/pull/1692): Support AMD GPU data collection on Linux. - [#1642](https://github.com/ClementTsang/bottom/pull/1642): Support changing the widget borders. - [#1717](https://github.com/ClementTsang/bottom/pull/1717): Support delete key (fn + delete on macOS) to kill processes. - [#1306](https://github.com/ClementTsang/bottom/pull/1306): Support using left/right key to collapse/expand process trees respectively. @@ -36,12 +47,14 @@ - [#1551](https://github.com/ClementTsang/bottom/pull/1551): Fix missing parent section names in default config. - [#1552](https://github.com/ClementTsang/bottom/pull/1552): Fix typo in default config. +- [#1565](https://github.com/ClementTsang/bottom/pull/1565): Fix issue where CPU usage in basic mode looks weird if core count isn't divisible by four. - [#1578](https://github.com/ClementTsang/bottom/pull/1578): Fix missing selected text background colour in `default-light` theme. - [#1593](https://github.com/ClementTsang/bottom/pull/1593): Fix using `"none"` for chart legend position in configs. - [#1594](https://github.com/ClementTsang/bottom/pull/1594): Fix incorrect default config definitions for chart legends. - [#1596](https://github.com/ClementTsang/bottom/pull/1596): Fix support for nilfs2 file system. - [#1660](https://github.com/ClementTsang/bottom/pull/1660): Fix properly cleaning up the terminal if the program is terminated due to an `Err` bubbling to the top. - [#1663](https://github.com/ClementTsang/bottom/pull/1663): Fix network graphs using log scaling having broken lines when a point was 0. +- [#1667](https://github.com/ClementTsang/bottom/pull/1667): Fix for ARC/SWAP not being hidden in basic mode after refactor. - [#1683](https://github.com/ClementTsang/bottom/pull/1683): Fix graph lines potentially showing up behind legends. - [#1701](https://github.com/ClementTsang/bottom/pull/1701): Fix process kill dialog occasionally causing panics. - [#1755](https://github.com/ClementTsang/bottom/pull/1755): Fix missing stats/incorrect mount name for certain entries in the disk widget. @@ -53,11 +66,15 @@ - [#1570](https://github.com/ClementTsang/bottom/pull/1570): Consider `$XDG_CONFIG_HOME` on macOS when looking for a default config path in a backwards-compatible fashion. - [#1686](https://github.com/ClementTsang/bottom/pull/1686): Allow hyphenated arguments to work as well (e.g. `--autohide-time`). - [#1701](https://github.com/ClementTsang/bottom/pull/1701): Redesign process kill dialog. +- [#1706](https://github.com/ClementTsang/bottom/pull/1706): Disable mouse capture when `disable_click` is set. - [#1769](https://github.com/ClementTsang/bottom/pull/1769): Change how we calculate swap usage in Windows. ### Other +- [#1655](https://github.com/ClementTsang/bottom/pull/1655): Better handle NVIDIA GPUs on Linux with only libnvidia-ml.so.1. +- [#1658](https://github.com/ClementTsang/bottom/pull/1658): Make it possible to override completion/manpage generation output directory via env. - [#1663](https://github.com/ClementTsang/bottom/pull/1663): Rework how data is stored internally, reducing memory usage a bit. +- [#1749](https://github.com/ClementTsang/bottom/pull/1749): Fix invalid desktop file values. ## [0.10.2] - 2024-08-05 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/Cargo.lock new/bottom-0.11.1~0/Cargo.lock --- old/bottom-0.11.0~0/Cargo.lock 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/Cargo.lock 2025-08-15 05:56:41.000000000 +0200 @@ -34,9 +34,9 @@ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -64,29 +64,29 @@ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "assert_cmd" @@ -145,7 +145,7 @@ [[package]] name = "bottom" -version = "0.11.0" +version = "0.11.1" dependencies = [ "anyhow", "assert_cmd", @@ -177,12 +177,12 @@ "predicates", "ratatui", "regex", - "rustix 1.0.7", + "rustix 1.0.8", "schemars", "serde", "serde_json", "starship-battery", - "strum 0.27.1", + "strum 0.27.2", "sysctl", "sysinfo", "tempfile", @@ -226,9 +226,9 @@ [[package]] name = "castaway" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ] @@ -253,9 +253,9 @@ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "1fc0e74a703892159f5ae7d3aac52c8e6c392f5ae5f359c70b5881d60aaac318" dependencies = [ "clap_builder", "clap_derive", @@ -263,9 +263,9 @@ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8" dependencies = [ "anstream", "anstyle", @@ -276,9 +276,9 @@ [[package]] name = "clap_complete" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aad5b1b4de04fead402672b48897030eec1f3bfe1550776322f59f6d6e6a5677" +checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" dependencies = [ "clap", ] @@ -295,9 +295,9 @@ [[package]] name = "clap_complete_nushell" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb8335b398d197fb3176efe9400c6c053a41733c26794316c73423d212b2f3d" +checksum = "0a0c951694691e65bf9d421d597d68416c22de9632e884c28412cb8cd8b73dce" dependencies = [ "clap", "clap_complete", @@ -305,9 +305,9 @@ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ "heck", "proc-macro2", @@ -323,9 +323,9 @@ [[package]] name = "clap_mangen" -version = "0.2.27" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc33c849748320656a90832f54a5eeecaa598e92557fb5dedebc3355746d31e4" +checksum = "27b4c3c54b30f0d9adcb47f25f61fcce35c4dd8916638c6b82fbd5f4fb4179e2" dependencies = [ "clap", "roff", @@ -410,7 +410,7 @@ "document-features", "mio", "parking_lot", - "rustix 1.0.7", + "rustix 1.0.8", "signal-hook", "signal-hook-mio", "winapi", @@ -524,7 +524,7 @@ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -550,9 +550,9 @@ [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" @@ -585,7 +585,7 @@ checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -654,9 +654,9 @@ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -699,9 +699,9 @@ [[package]] name = "instability" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ "darling", "indoc", @@ -754,9 +754,9 @@ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" @@ -765,14 +765,14 @@ checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.52.6", ] [[package]] name = "libredox" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags 2.9.1", "libc", @@ -792,9 +792,9 @@ [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" [[package]] name = "lock_api" @@ -1020,9 +1020,9 @@ [[package]] name = "plist" -version = "1.7.3" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "546b279bf0638ee811d9e47de2ca5b66575a543035d79fdf83959dd2f5c3b4c3" +checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" dependencies = [ "base64", "indexmap", @@ -1090,18 +1090,18 @@ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" -version = "0.37.5" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +checksum = "9845d9dccf565065824e69f9f235fafba1587031eda353c1f1561cd6a6be78f4" dependencies = [ "memchr", ] @@ -1138,22 +1138,22 @@ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.9.1", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.14", ] [[package]] @@ -1213,9 +1213,9 @@ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustix" @@ -1232,9 +1232,9 @@ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags 2.9.1", "errno", @@ -1245,9 +1245,9 @@ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -1328,9 +1328,9 @@ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -1349,9 +1349,9 @@ [[package]] name = "serial2" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d1d08630509d69f90eff4afcd02c3bd974d979225cbd815ff5942351b14375" +checksum = "26e1e5956803a69ddd72ce2de337b577898801528749565def03515f82bad5bb" dependencies = [ "cfg-if", "libc", @@ -1397,9 +1397,9 @@ [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -1451,11 +1451,11 @@ [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros 0.27.1", + "strum_macros 0.27.2", ] [[package]] @@ -1473,22 +1473,21 @@ [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn", ] [[package]] name = "syn" -version = "2.0.104" +version = "2.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" dependencies = [ "proc-macro2", "quote", @@ -1511,9 +1510,9 @@ [[package]] name = "sysinfo" -version = "0.36.1" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" +checksum = "07cec4dc2d2e357ca1e610cfb07de2fa7a10fc3e9fe89f72545f3d244ea87753" dependencies = [ "libc", "memchr", @@ -1531,18 +1530,18 @@ dependencies = [ "fastrand", "once_cell", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] [[package]] name = "terminal_size" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.7", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -1562,11 +1561,11 @@ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.14", ] [[package]] @@ -1582,9 +1581,9 @@ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", @@ -1899,7 +1898,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] [[package]] @@ -1920,10 +1919,11 @@ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -2041,9 +2041,9 @@ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/Cargo.toml new/bottom-0.11.1~0/Cargo.toml --- old/bottom-0.11.0~0/Cargo.toml 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/Cargo.toml 2025-08-15 05:56:41.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "bottom" -version = "0.11.0" +version = "0.11.1" repository = "https://github.com/ClementTsang/bottom" license = "MIT" description = "A customizable cross-platform graphical process/system monitor for the terminal. Supports Linux, macOS, and Windows." @@ -72,10 +72,10 @@ generate_schema = ["schemars", "serde_json", "strum"] [dependencies] -anyhow = "1.0.98" +anyhow = "1.0.99" backtrace = "0.3.75" cfg-if = "1.0.1" -clap = { version = "4.5.40", features = [ +clap = { version = "4.5.45", features = [ "default", "cargo", "wrap_help", @@ -85,7 +85,7 @@ crossterm = "0.29.0" ctrlc = { version = "3.4.7", features = ["termination"] } dirs = "6.0.0" -hashbrown = "0.15.4" +hashbrown = "0.15.5" humantime = "2.2.0" indexmap = "2.10.0" indoc = "2.0.6" @@ -96,7 +96,7 @@ regex = "1.11.1" serde = { version = "1.0.219", features = ["derive"] } starship-battery = { version = "0.10.2", optional = true } -sysinfo = "=0.36.1" +sysinfo = "=0.37.0" timeless = "0.0.14-alpha" toml_edit = { version = "0.22.27", features = ["serde"] } tui = { version = "0.29.0", package = "ratatui", features = [ @@ -117,14 +117,14 @@ # These are just used for JSON schema generation. schemars = { version = "0.9.0", optional = true } -serde_json = { version = "1.0.140", optional = true } -strum = { version = "0.27.1", features = ["derive"], optional = true } +serde_json = { version = "1.0.142", optional = true } +strum = { version = "0.27.2", features = ["derive"], optional = true } [target.'cfg(unix)'.dependencies] -libc = "0.2.174" +libc = "0.2.175" [target.'cfg(target_os = "linux")'.dependencies] -rustix = { version = "1.0.7", features = ["fs", "param"] } +rustix = { version = "1.0.8", features = ["fs", "param"] } [target.'cfg(target_os = "macos")'.dependencies] core-foundation = "0.10.1" @@ -142,7 +142,7 @@ ] } [target.'cfg(target_os = "freebsd")'.dependencies] -serde_json = { version = "1.0.140" } +serde_json = { version = "1.0.142" } sysctl = { version = "0.6.0" } filedescriptor = "0.8.3" @@ -158,16 +158,16 @@ portable-pty = "0.9.0" [build-dependencies] -clap = { version = "4.5.40", features = [ +clap = { version = "4.5.45", features = [ "default", "cargo", "wrap_help", "derive", ] } -clap_complete = "4.5.54" -clap_complete_nushell = "4.5.7" +clap_complete = "4.5.57" +clap_complete_nushell = "4.5.8" clap_complete_fig = "4.5.2" -clap_mangen = "0.2.27" +clap_mangen = "0.2.29" indoc = "2.0.6" # Compile dependencies with optimizations enabled, even in debug mode. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/README.md new/bottom-0.11.1~0/README.md --- old/bottom-0.11.0~0/README.md 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/README.md 2025-08-15 05:56:41.000000000 +0200 @@ -162,8 +162,8 @@ rustup update stable # Option 1 - Download an archive from releases and install -curl -LO https://github.com/ClementTsang/bottom/archive/0.11.0.tar.gz -tar -xzvf 0.11.0.tar.gz +curl -LO https://github.com/ClementTsang/bottom/archive/0.11.1.tar.gz +tar -xzvf 0.11.1.tar.gz cargo install --path . --locked # Option 2 - Manually clone the repo and install @@ -215,20 +215,20 @@ ```bash # x86-64 -curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.0/bottom_0.11.0-1_amd64.deb -sudo dpkg -i bottom_0.11.0-1_amd64.deb +curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.1/bottom_0.11.1-1_amd64.deb +sudo dpkg -i bottom_0.11.1-1_amd64.deb # ARM64 -curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.0/bottom_0.11.0-1_arm64.deb -sudo dpkg -i bottom_0.11.0-1_arm64.deb +curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.1/bottom_0.11.1-1_arm64.deb +sudo dpkg -i bottom_0.11.1-1_arm64.deb # ARM -curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.0/bottom_0.11.0-1_armhf.deb -sudo dpkg -i bottom_0.11.0-1_armhf.deb +curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.1/bottom_0.11.1-1_armhf.deb +sudo dpkg -i bottom_0.11.1-1_armhf.deb # musl-based -curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.0/bottom-musl_0.11.0-1_amd64.deb -sudo dpkg -i bottom-musl_0.11.0-1_amd64.deb +curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.1/bottom-musl_0.11.1-1_amd64.deb +sudo dpkg -i bottom-musl_0.11.1-1_amd64.deb ``` ### Exherbo Linux @@ -260,8 +260,8 @@ For example: ```bash -curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.0/bottom-0.11.0-1.x86_64.rpm -sudo rpm -i bottom-0.11.0-1.x86_64.rpm +curl -LO https://github.com/ClementTsang/bottom/releases/download/0.11.1/bottom-0.11.1-1.x86_64.rpm +sudo rpm -i bottom-0.11.1-1.x86_64.rpm ``` ### Gentoo diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/docs/content/index.md new/bottom-0.11.1~0/docs/content/index.md --- old/bottom-0.11.0~0/docs/content/index.md 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/docs/content/index.md 2025-08-15 05:56:41.000000000 +0200 @@ -1,4 +1,7 @@ --- +hide: + - navigation + - toc title: Home --- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/docs/requirements.txt new/bottom-0.11.1~0/docs/requirements.txt --- old/bottom-0.11.0~0/docs/requirements.txt 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/docs/requirements.txt 2025-08-15 05:56:41.000000000 +0200 @@ -1,5 +1,5 @@ mkdocs == 1.6.1 -mkdocs-material == 9.6.9 +mkdocs-material == 9.6.16 mdx_truly_sane_lists == 1.3 mike == 2.1.3 mkdocs-git-revision-date-localized-plugin == 1.4.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/sample_configs/demo_config.toml new/bottom-0.11.1~0/sample_configs/demo_config.toml --- old/bottom-0.11.0~0/sample_configs/demo_config.toml 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/sample_configs/demo_config.toml 2025-08-15 05:56:41.000000000 +0200 @@ -18,4 +18,4 @@ theme = "gruvbox" [processes] -columns = ["PID", "Name", "CPU%", "Mem%", "Rps", "Wps", "TRead", "Twrite", "State", "Time", "Virt"] +columns = ["PID", "Name", "CPU%", "Mem%", "Rps", "Wps", "TRead", "TWrite", "State", "Time", "Virt"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/scripts/schema/requirements.txt new/bottom-0.11.1~0/scripts/schema/requirements.txt --- old/bottom-0.11.0~0/scripts/schema/requirements.txt 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/scripts/schema/requirements.txt 2025-08-15 05:56:41.000000000 +0200 @@ -1 +1 @@ -jsonschema-rs == 0.26.1 +jsonschema-rs == 0.32.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/src/canvas/components/data_table.rs new/bottom-0.11.1~0/src/canvas/components/data_table.rs --- old/bottom-0.11.0~0/src/canvas/components/data_table.rs 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/src/canvas/components/data_table.rs 2025-08-15 05:56:41.000000000 +0200 @@ -128,7 +128,6 @@ } /// Updates the scroll position to a selected index. - #[expect(clippy::comparison_chain)] pub fn set_position(&mut self, new_index: usize) { let new_index = new_index.clamp_upper(self.data.len().saturating_sub(1)); if self.state.current_index < new_index { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/src/canvas/widgets/battery_display.rs new/bottom-0.11.1~0/src/canvas/widgets/battery_display.rs --- old/bottom-0.11.0~0/src/canvas/widgets/battery_display.rs 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/src/canvas/widgets/battery_display.rs 2025-08-15 05:56:41.000000000 +0200 @@ -117,11 +117,11 @@ let is_basic = app_state.app_config_fields.use_basic_mode; - let margined_draw_loc = Layout::default() + let [margined_draw_loc] = Layout::default() .constraints([Constraint::Percentage(100)]) .horizontal_margin(u16::from(is_basic && !is_selected)) .direction(Direction::Horizontal) - .split(draw_loc)[0]; + .areas(draw_loc); if let Some(battery_details) = battery_harvest.get(battery_widget_state.currently_selected_battery_index) @@ -168,13 +168,15 @@ let mut time: String; // Keep string lifetime in scope. { let style = self.styles.text_style; + let time_width = (full_width / 2) as usize; + match &battery_details.state { BatteryState::Charging { time_to_full: Some(secs), } => { time = long_time(*secs); - if full_width as usize > time.len() { + if time_width >= time.len() { battery_rows.push(Row::new(["Time to full", &time]).style(style)); } else { time = short_time(*secs); @@ -186,7 +188,7 @@ } => { time = long_time(*secs); - if full_width as usize > time.len() { + if time_width >= time.len() { battery_rows.push(Row::new(["Time to empty", &time]).style(style)); } else { time = short_time(*secs); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/src/collection.rs new/bottom-0.11.1~0/src/collection.rs --- old/bottom-0.11.0~0/src/collection.rs 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/src/collection.rs 2025-08-15 05:56:41.000000000 +0200 @@ -150,14 +150,21 @@ pub struct DataCollector { pub data: Data, sys: SysinfoSource, - use_current_cpu_total: bool, - unnormalized_cpu: bool, last_collection_time: Instant, + widgets_to_harvest: UsedWidgets, + filters: DataFilters, + total_rx: u64, total_tx: u64, + + unnormalized_cpu: bool, + use_current_cpu_total: bool, show_average_cpu: bool, - widgets_to_harvest: UsedWidgets, - filters: DataFilters, + + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + last_list_collection_time: Instant, + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + should_refresh_list: bool, #[cfg(target_os = "linux")] pid_mapping: HashMap<Pid, processes::PrevProcDetails>, @@ -180,11 +187,13 @@ gpus_total_mem: Option<u64>, } +const LIST_REFRESH_TIME: Duration = Duration::from_secs(60); + impl DataCollector { pub fn new(filters: DataFilters) -> Self { // Initialize it to the past to force it to load on initialization. let now = Instant::now(); - let last_collection_time = now.checked_sub(Duration::from_secs(600)).unwrap_or(now); + let last_collection_time = now.checked_sub(LIST_REFRESH_TIME * 10).unwrap_or(now); DataCollector { data: Data::default(), @@ -213,32 +222,32 @@ gpu_pids: None, #[cfg(feature = "gpu")] gpus_total_mem: None, + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + last_list_collection_time: last_collection_time, + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + should_refresh_list: true, } } - pub fn init(&mut self) { - #[cfg(feature = "battery")] + /// Update the check for updating things like lists of batteries, etc. + /// This is useful for things that we don't want to update all the time. + /// + /// Note this should be set back to false if `self.last_list_collection_time` is updated. + #[inline] + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + fn update_refresh_list_check(&mut self) { + if self + .data + .collection_time + .duration_since(self.last_list_collection_time) + > LIST_REFRESH_TIME { - if self.widgets_to_harvest.use_battery { - if let Ok(battery_manager) = Manager::new() { - if let Ok(batteries) = battery_manager.batteries() { - let battery_list: Vec<Battery> = batteries.filter_map(Result::ok).collect(); - if !battery_list.is_empty() { - self.battery_list = Some(battery_list); - self.battery_manager = Some(battery_manager); - } - } - } - } + self.should_refresh_list = true; } - self.update_data(); - - // Sleep a few seconds to avoid potentially weird data. - const SLEEP: Duration = get_sleep_duration(); - - std::thread::sleep(SLEEP); - self.data.cleanup(); + if self.should_refresh_list { + self.last_list_collection_time = self.data.collection_time; + } } pub fn set_collection(&mut self, used_widgets: UsedWidgets) { @@ -286,9 +295,6 @@ // - Temperatures and temperature components list. #[cfg(not(target_os = "linux"))] { - const LIST_REFRESH_TIME: Duration = Duration::from_secs(60); - let refresh_start = Instant::now(); - if self.widgets_to_harvest.use_proc { self.sys.system.refresh_processes_specifics( sysinfo::ProcessesToUpdate::All, @@ -301,13 +307,13 @@ // For Windows, sysinfo also handles the users list. #[cfg(target_os = "windows")] - if refresh_start.duration_since(self.last_collection_time) > LIST_REFRESH_TIME { + if self.should_refresh_list { self.sys.users.refresh(); } } if self.widgets_to_harvest.use_temp { - if refresh_start.duration_since(self.last_collection_time) > LIST_REFRESH_TIME { + if self.should_refresh_list { self.sys.temps.refresh(true); } @@ -318,7 +324,7 @@ #[cfg(target_os = "windows")] if self.widgets_to_harvest.use_disk { - if refresh_start.duration_since(self.last_collection_time) > LIST_REFRESH_TIME { + if self.should_refresh_list { self.sys.disks.refresh(true); } @@ -329,11 +335,19 @@ } } + /// Update and refresh data. + /// + /// TODO: separate refresh steps and update steps pub fn update_data(&mut self) { - self.refresh_sysinfo_data(); - self.data.collection_time = Instant::now(); + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + { + self.update_refresh_list_check(); + } + + self.refresh_sysinfo_data(); + self.update_cpu_usage(); self.update_memory_usage(); self.update_temps(); @@ -342,16 +356,23 @@ self.update_batteries(); #[cfg(feature = "gpu")] - self.update_gpus(); // update_gpus before procs for gpu_pids but after temps for appending + self.update_gpus(); self.update_processes(); self.update_network_usage(); self.update_disks(); + #[cfg(any(not(target_os = "linux"), feature = "battery"))] + { + self.should_refresh_list = false; + } + // Update times for future reference. self.last_collection_time = self.data.collection_time; } + /// Gets GPU data. Note this will usually append to other previously + /// collected data fields at the moment. #[cfg(feature = "gpu")] #[inline] fn update_gpus(&mut self) { @@ -462,15 +483,13 @@ #[inline] fn update_network_usage(&mut self) { - let current_instant = self.data.collection_time; - if self.widgets_to_harvest.use_net { let net_data = network::get_network_data( &self.sys.network, self.last_collection_time, &mut self.total_rx, &mut self.total_tx, - current_instant, + self.data.collection_time, &self.filters.net_filter, ); @@ -480,15 +499,59 @@ } } + /// Update battery information. + /// + /// If the battery manager is not initialized, it will attempt to initialize it if at least one battery is found. + /// + /// This function also refreshes the list of batteries if `self.should_refresh_list` is true. #[inline] #[cfg(feature = "battery")] fn update_batteries(&mut self) { - if let Some(battery_manager) = &self.battery_manager { - if let Some(battery_list) = &mut self.battery_list { - self.data.list_of_batteries = - Some(batteries::refresh_batteries(battery_manager, battery_list)); + let battery_manager = match &self.battery_manager { + Some(manager) => { + // Also check if we need to refresh the list of batteries. + if self.should_refresh_list { + let battery_list = manager + .batteries() + .map(|batteries| batteries.filter_map(Result::ok).collect::<Vec<_>>()); + + if let Ok(battery_list) = battery_list { + if battery_list.is_empty() { + self.battery_list = None; + } else { + self.battery_list = Some(battery_list); + } + } else { + self.battery_list = None; + } + } + + manager } - } + None => { + if let Ok(manager) = Manager::new() { + let Ok(batteries) = manager.batteries() else { + return; + }; + + let battery_list = batteries.filter_map(Result::ok).collect::<Vec<_>>(); + + if battery_list.is_empty() { + return; + } + + self.battery_list = Some(battery_list); + self.battery_manager.insert(manager) + } else { + return; + } + } + }; + + self.data.list_of_batteries = self + .battery_list + .as_mut() + .map(|battery_list| batteries::refresh_batteries(battery_manager, battery_list)); } #[inline] @@ -510,31 +573,6 @@ } } -/// We set a sleep duration between 10ms and 250ms, ideally sysinfo's -/// [`sysinfo::MINIMUM_CPU_UPDATE_INTERVAL`] + 1. -/// -/// We bound the upper end to avoid waiting too long (e.g. FreeBSD is 1s, which -/// I'm fine with losing accuracy on for the first refresh), and we bound the -/// lower end just to avoid the off-chance that refreshing too quickly causes -/// problems. This second case should only happen on unsupported systems via -/// sysinfo, in which case [`sysinfo::MINIMUM_CPU_UPDATE_INTERVAL`] is defined -/// as 0. -/// -/// We also do `INTERVAL + 1` for some wiggle room, just in case. -const fn get_sleep_duration() -> Duration { - const MIN_SLEEP: u64 = 10; - const MAX_SLEEP: u64 = 250; - const INTERVAL: u64 = sysinfo::MINIMUM_CPU_UPDATE_INTERVAL.as_millis() as u64; - - if INTERVAL < MIN_SLEEP { - Duration::from_millis(MIN_SLEEP) - } else if INTERVAL > MAX_SLEEP { - Duration::from_millis(MAX_SLEEP) - } else { - Duration::from_millis(INTERVAL + 1) - } -} - #[cfg(target_os = "freebsd")] /// Deserialize [libxo](https://www.freebsd.org/cgi/man.cgi?query=libxo&apropos=0&sektion=0&manpath=FreeBSD+13.1-RELEASE+and+Ports&arch=default&format=html) JSON data fn deserialize_xo<T>(key: &str, data: &[u8]) -> Result<T, std::io::Error> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/src/lib.rs new/bottom-0.11.1~0/src/lib.rs --- old/bottom-0.11.0~0/src/lib.rs 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/src/lib.rs 2025-08-15 05:56:41.000000000 +0200 @@ -53,6 +53,8 @@ use utils::logging::*; use utils::{cancellation_token::CancellationToken, conversion::*}; +use crate::collection::Data; + // Used for heap allocation debugging purposes. // #[global_allocator] // static ALLOC: dhat::Alloc = dhat::Alloc; @@ -219,17 +221,21 @@ let use_current_cpu_total = app_config_fields.use_current_cpu_total; let unnormalized_cpu = app_config_fields.unnormalized_cpu; let show_average_cpu = app_config_fields.show_average_cpu; - let update_time = app_config_fields.update_rate; + let update_sleep = app_config_fields.update_rate; thread::spawn(move || { - let mut data_state = collection::DataCollector::new(filters); + let mut data_collector = collection::DataCollector::new(filters); + + data_collector.set_collection(used_widget_set); + data_collector.set_use_current_cpu_total(use_current_cpu_total); + data_collector.set_unnormalized_cpu(unnormalized_cpu); + data_collector.set_show_average_cpu(show_average_cpu); - data_state.set_collection(used_widget_set); - data_state.set_use_current_cpu_total(use_current_cpu_total); - data_state.set_unnormalized_cpu(unnormalized_cpu); - data_state.set_show_average_cpu(show_average_cpu); + data_collector.update_data(); + data_collector.data = Data::default(); - data_state.init(); + // Tiny sleep I guess? To go between the first update above and the first update in the loop. + std::thread::sleep(Duration::from_millis(5)); loop { // Check once at the very top... don't block though. @@ -243,12 +249,12 @@ // trace!("Received message in collection thread: {message:?}"); match message { CollectionThreadEvent::Reset => { - data_state.data.cleanup(); + data_collector.data.cleanup(); } } } - data_state.update_data(); + data_collector.update_data(); // Yet another check to bail if needed... do not block! if let Some(is_terminated) = cancellation_token.try_check() { @@ -257,14 +263,15 @@ } } - let event = BottomEvent::Update(Box::from(data_state.data)); - data_state.data = collection::Data::default(); + let event = BottomEvent::Update(Box::from(data_collector.data)); + data_collector.data = Data::default(); + if sender.send(event).is_err() { break; } // Sleep while allowing for interruptions... - if cancellation_token.sleep_with_cancellation(Duration::from_millis(update_time)) { + if cancellation_token.sleep_with_cancellation(Duration::from_millis(update_sleep)) { break; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/src/options/config/disk.rs new/bottom-0.11.1~0/src/options/config/disk.rs --- old/bottom-0.11.0~0/src/options/config/disk.rs 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/src/options/config/disk.rs 2025-08-15 05:56:41.000000000 +0200 @@ -16,7 +16,7 @@ /// A list of disk widget columns. #[serde(default)] - pub(crate) columns: Vec<DiskColumn>, // TODO: make this more composable(?) in the future, we might need to rethink how it's done for custom widgets + pub(crate) columns: Option<Vec<DiskColumn>>, // TODO: make this more composable(?) in the future, we might need to rethink how it's done for custom widgets } #[cfg(test)] @@ -24,10 +24,17 @@ use super::DiskConfig; #[test] - fn empty_column_setting() { + fn none_column_setting() { let config = ""; let generated: DiskConfig = toml_edit::de::from_str(config).unwrap(); - assert!(generated.columns.is_empty()); + assert!(generated.columns.is_none()); + } + + #[test] + fn empty_column_setting() { + let config = r#"columns = []"#; + let generated: DiskConfig = toml_edit::de::from_str(config).unwrap(); + assert!(generated.columns.unwrap().is_empty()); } #[test] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bottom-0.11.0~0/src/options.rs new/bottom-0.11.1~0/src/options.rs --- old/bottom-0.11.0~0/src/options.rs 2025-08-06 06:09:39.000000000 +0200 +++ new/bottom-0.11.1~0/src/options.rs 2025-08-15 05:56:41.000000000 +0200 @@ -407,7 +407,7 @@ DiskTableWidget::new( &app_config_fields, &styling, - config.disk.as_ref().map(|cfg| cfg.columns.as_slice()), + config.disk.as_ref().and_then(|cfg| cfg.columns.as_deref()), ), ); } @@ -672,7 +672,7 @@ }}; } -/// How fast the screen refreshes +/// How quickly we update data. #[inline] fn get_update_rate(args: &BottomArgs, config: &Config) -> OptionResult<u64> { const DEFAULT_REFRESH_RATE_IN_MILLISECONDS: u64 = 1000; ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/bottom/vendor.tar.zst /work/SRC/openSUSE:Factory/.bottom.new.1085/vendor.tar.zst differ: char 7, line 1