Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package dysk for openSUSE:Factory checked in at 2026-10-20 12:38:20 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dysk (Old) and /work/SRC/openSUSE:Factory/.dysk.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dysk" Tue Oct 20 12:38:20 2026 rev:18 rq:1386149 version:3.8.1 Changes: -------- --- /work/SRC/openSUSE:Factory/dysk/dysk.changes 2026-10-17 21:27:35.051343051 +0200 +++ /work/SRC/openSUSE:Factory/.dysk.new.3698736/dysk.changes 2026-10-20 12:39:13.616761091 +0200 @@ -1,0 +2,9 @@ +Mon Oct 19 05:05:47 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 3.8.1: + * fix free_percent filter, eg -f 'free_percent>20%' + * -s use_percent and -s free_percent sort by default in the same + direction as -s use and -s free, and the inodes use columns + sort fullest first, like -s use + +------------------------------------------------------------------- Old: ---- dysk-3.8.0.obscpio New: ---- dysk-3.8.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dysk.spec ++++++ --- /var/tmp/diff_new_pack.vf60kM/_old 2026-10-20 12:39:15.583843418 +0200 +++ /var/tmp/diff_new_pack.vf60kM/_new 2026-10-20 12:39:15.586843544 +0200 @@ -17,7 +17,7 @@ Name: dysk -Version: 3.8.0 +Version: 3.8.1 Release: 0 Summary: Get information on filesystems, like df but better License: MIT ++++++ _service ++++++ --- /var/tmp/diff_new_pack.vf60kM/_old 2026-10-20 12:39:15.699848273 +0200 +++ /var/tmp/diff_new_pack.vf60kM/_new 2026-10-20 12:39:15.708848650 +0200 @@ -4,7 +4,7 @@ <param name="scm">git</param> <param name="exclude">.git</param> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">refs/tags/v3.8.0</param> + <param name="revision">refs/tags/v3.8.1</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.vf60kM/_old 2026-10-20 12:39:15.761850868 +0200 +++ /var/tmp/diff_new_pack.vf60kM/_new 2026-10-20 12:39:15.767851119 +0200 @@ -3,6 +3,6 @@ <param name="url">https://github.com/Canop/dysk</param> <param name="changesrevision">b8c61ea5f565759b12785658a1c6a80f3b13722c</param></service><service name="tar_scm"> <param name="url">https://github.com/Canop/dysk.git</param> - <param name="changesrevision">ce437e13cfc3f02ce2fdb6d2a4aeb552c0a940eb</param></service></servicedata> + <param name="changesrevision">c002b844cfc33d56aaa7a4c46b80b033b07e0dee</param></service></servicedata> (No newline at EOF) ++++++ dysk-3.8.0.obscpio -> dysk-3.8.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/CHANGELOG.md new/dysk-3.8.1/CHANGELOG.md --- old/dysk-3.8.0/CHANGELOG.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/CHANGELOG.md 2026-10-17 18:04:08.000000000 +0200 @@ -1,4 +1,11 @@ -### next +<a name="v3.8.1"></a> +### v3.8.1 - 2026/10/17 +- fix `free_percent` filter, eg `-f 'free_percent>20%'` +- `-s use_percent` and `-s free_percent` sort by default in the same direction as `-s use` and `-s free`, and the inodes use columns sort fullest first, like `-s use` +- 3.8.0's source archive reported version 3.7.1 - Fix #124 + +<a name="v3.8.0"></a> +### v3.8.0 - 2026/10/17 - read inodes on Mac/iokit (not very interesting for APFS) - Fix #107 - no panic on `--help` when stdout is closed - Fix #123 - new `use_bar` and `inodes_bar` columns: bars without percentage - Fix #116 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/Cargo.lock new/dysk-3.8.1/Cargo.lock --- old/dysk-3.8.0/Cargo.lock 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/Cargo.lock 2026-10-17 18:04:08.000000000 +0200 @@ -75,9 +75,9 @@ [[package]] name = "cfg-if" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" [[package]] name = "cfg_aliases" @@ -87,9 +87,9 @@ [[package]] name = "clap" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +checksum = "aa8876b300ab35ba921adea3dfd70157a46249b33f95c9084ae5709785478946" dependencies = [ "clap_builder", "clap_derive", @@ -108,9 +108,9 @@ [[package]] name = "clap_builder" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +checksum = "ec0797fb7aeb1406c84efac526901f7ec3ead2124f946b494e72879d4b54704d" dependencies = [ "anstream", "anstyle", @@ -120,30 +120,30 @@ [[package]] name = "clap_complete" -version = "4.6.9" +version = "4.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be2ad0423bdbbb0e25bc89add796f3559706d4a95e1bc98e4d9662a957b6a19" +checksum = "037e2a1a92236d0aff7e845093f64661d6df4c02c9fcc61a60e9e1d736fa392f" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.6.4" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +checksum = "f9c751b79415d4e559e3d1fcf128e09e720eb673a06d26cf6f392d37d75b66e0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "clap_lex" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +checksum = "1c133bc6a41be0d194c306b5506d15e6feeea7b1d6604bd3f8310dfb2ca96486" [[package]] name = "clap_mangen" @@ -197,9 +197,9 @@ [[package]] name = "crokey" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074bc31bff1084f74e5a145ad5f6ac74469fa312159faa5144f0b1c4506b8d80" +checksum = "c41f5f8d5dba70b6f48daa17fee79ac7c3a13cc1b164f41d0de50c803e0266f2" dependencies = [ "crokey-proc_macros", "crossterm", @@ -210,15 +210,15 @@ [[package]] name = "crokey-proc_macros" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88c4ff2d5717616c3bb4a31d06b0b241ed811c7c0c41d077d77631bee7caad0" +checksum = "2ca5122126412913548025b1d5574181121bcf7a06f8b530f4be713ebd81d418" dependencies = [ "crossterm", "proc-macro2", "quote", "strict", - "syn 2.0.119", + "syn 3.0.9", ] [[package]] @@ -337,7 +337,7 @@ [[package]] name = "dysk" -version = "3.7.1" +version = "3.8.1" dependencies = [ "clap", "clap_complete", @@ -349,7 +349,7 @@ [[package]] name = "dysk-cli" -version = "3.7.1" +version = "3.8.1" dependencies = [ "bet", "clap", @@ -363,9 +363,9 @@ [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" [[package]] name = "errno" @@ -429,9 +429,9 @@ [[package]] name = "lazy-regex" -version = "3.6.1" +version = "3.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4994ba703f78b083e2f7946dac9251abd83fd43a0365f030e99b69be5b4b9ef9" +checksum = "f0a2cce8a22920a29fdcc8c9170aa5d29edd9fbcf8bea856e24c2cb1c2419f67" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -440,14 +440,14 @@ [[package]] name = "lazy-regex-proc_macros" -version = "3.6.1" +version = "3.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97232314824e6dbef1918a871bb93f51070455e3715bf26e19a6d01aa977a0" +checksum = "6f1e4b1f1d8c71edb4ff2b2150ec4606445fd2ddf67ddc097655daf59286baa6" dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.119", + "syn 3.0.9", ] [[package]] @@ -467,9 +467,9 @@ [[package]] name = "libc" -version = "0.2.189" +version = "0.2.191" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" [[package]] name = "linux-raw-sys" @@ -479,9 +479,9 @@ [[package]] name = "litrs" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +checksum = "4744e383959f0db86ede514b809b1c53251889093803c05267acc7d4e7030d70" [[package]] name = "lock_api" @@ -524,9 +524,9 @@ [[package]] name = "mio" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" dependencies = [ "libc", "log", @@ -654,9 +654,9 @@ [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ "bitflags", "errno", @@ -704,14 +704,14 @@ dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "serde_json" -version = "1.0.151" +version = "1.0.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" dependencies = [ "itoa", "memchr", @@ -722,9 +722,9 @@ [[package]] name = "serde_spanned" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" dependencies = [ "serde_core", ] @@ -762,9 +762,9 @@ [[package]] name = "smallvec" -version = "1.16.1" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" +checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b" [[package]] name = "snafu" @@ -812,9 +812,9 @@ [[package]] name = "syn" -version = "3.0.5" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" dependencies = [ "proc-macro2", "quote", @@ -823,9 +823,9 @@ [[package]] name = "termimad" -version = "0.35.4" +version = "0.35.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2374179aac8b77011a1aefe2f44d0c34eb680c9b4bd1c369a88991262c60c85a" +checksum = "092b11fb38404fa873f019f8e5f300fa5787f381b7a58b923546d94b5a9065fd" dependencies = [ "coolor", "crokey", @@ -851,29 +851,29 @@ [[package]] name = "thiserror" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.20" +version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn 3.0.5", + "syn 3.0.9", ] [[package]] name = "toml" -version = "1.1.6+spec-1.1.0" +version = "1.1.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" dependencies = [ "indexmap", "serde_core", @@ -886,33 +886,33 @@ [[package]] name = "toml_datetime" -version = "1.1.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" dependencies = [ "serde_core", ] [[package]] name = "toml_parser" -version = "1.1.3+spec-1.1.0" +version = "1.1.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" [[package]] name = "unicode-ident" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" [[package]] name = "unicode-segmentation" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/Cargo.toml new/dysk-3.8.1/Cargo.toml --- old/dysk-3.8.0/Cargo.toml 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/Cargo.toml 2026-10-17 18:04:08.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "dysk" -version = "3.7.1" +version = "3.8.1" authors = ["dystroy <[email protected]>"] edition = "2024" keywords = ["linux", "mac", "filesystem", "disk"] @@ -22,13 +22,13 @@ ] [dependencies] -dysk-cli = { version = "3.7.1", path = "cli" } # beware: version is also in build dependencies +dysk-cli = { version = "3.8.1", path = "cli" } # beware: version is also in build dependencies [build-dependencies] clap = { version = "4.6", features = ["derive", "cargo"] } clap_complete = "4.6" clap_mangen = "0.3" -dysk-cli = { version = "3.7.1", path = "cli" } +dysk-cli = { version = "3.8.1", path = "cli" } serde = { version = "1.0", features = ["derive"] } toml = "1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/README.md new/dysk-3.8.1/README.md --- old/dysk-3.8.0/README.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/README.md 2026-10-17 18:04:08.000000000 +0200 @@ -20,7 +20,7 @@ [srep]: https://repology.org/badge/tiny-repos/dysk.svg [lrep]: https://repology.org/project/dysk/versions -A utility listing your filesystems, on Linux, Mac, and Windows (experimental). +A utility listing your filesystems, on Linux, Mac, and Windows. Complete documentation lives at **[https://dystroy.org/dysk](https://dystroy.org/dysk)** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/build-scripts/README.md new/dysk-3.8.1/build-scripts/README.md --- old/dysk-3.8.0/build-scripts/README.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/build-scripts/README.md 2026-10-17 18:04:08.000000000 +0200 @@ -14,8 +14,8 @@ missing, and the release has to be assembled from two machines through a staging server (`DYSK_STAGE_HOST`, see below). -1. Commit, then on **each** machine that builds (just the Mac, unless you've set - up staging): +1. Commit and push, then on **each** machine that builds (just the Mac, unless + you've set up staging): ./build-scripts/build-all-targets.sh @@ -23,13 +23,15 @@ the staging server, keyed by `<version>-<commit>`; targets already staged under that key are skipped, so a re-run after a failure only builds what's missing, and `--force` rebuilds them all. Any new commit changes the key, so everything - is rebuilt. + is rebuilt. It warns when HEAD isn't `origin/main`. 2. On one machine, assemble and package: ./build-scripts/release.sh - Fetches the staged artifacts, checks every target is present, verifies each + Refuses to go on unless HEAD is exactly `origin/main` (not unpushed, not + behind) and no `v<version>` tag exists on origin at another commit. Then + fetches the staged artifacts, checks every target is present, verifies each binary, and produces `dysk_<version>.zip` (also the artifact to attach to the GitHub release), with a copy in `releases/`. @@ -41,10 +43,20 @@ server. Nothing goes through `~/dev/www/dystroy`: that tree mirrors the whole site on each machine, so pushing it from one machine republishes its stale copy of everything the other machines deployed. Previous zips are left in - place, so old versions stay downloadable. + place, so old versions stay downloadable. It also publishes `x86_64-linux`, + a link to `x86_64-unknown-linux-gnu`, for third-party install scripts using + that old path. - It then runs `website/deploy.sh`, last, so the site never describes a version - whose binaries aren't online yet. + It then creates and pushes the `v<version>` tag on HEAD, and runs + `website/deploy.sh`, last, so the site never describes a version whose + binaries aren't online yet. + +4. Create the GitHub release from that tag, not from a branch: + + gh release create v<version> dysk_<version>.zip --verify-tag + + With "target: main" in the GitHub form, the tag lands on whatever `main` is + on GitHub at that moment. Staging and deploy settings come from `build-scripts/_local.sh` (see below). Without it, `release.sh` builds locally on a single host and `deploy.sh` won't run. @@ -112,6 +124,7 @@ |----------|---------|----------|---------| | `DYSK_STAGE_HOST` | build-all-targets.sh, release.sh | for staged releases | ssh host every machine can reach; enables push/fetch of a multi-host release. Unset ⇒ single-host local builds. | | `DYSK_STAGE_DIR` | build-all-targets.sh, release.sh | no — default `dysk-staging` | staging dir on the server, relative to your ssh login home (or absolute, with a leading `/`). | +| `DYSK_RELEASE_BRANCH` | build-all-targets.sh, release.sh | no — default `main` | branch of origin the released commit must be. | | `DYSK_DEPLOY_TARGET` | deploy.sh | yes, to deploy | rsync destination of the download dir, e.g. `[email protected]:prod/www.dystroy.org/dysk/download`. Must end in `/dysk/download`. | A full example: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/build-scripts/_common.sh new/dysk-3.8.1/build-scripts/_common.sh --- old/dysk-3.8.0/build-scripts/_common.sh 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/build-scripts/_common.sh 2026-10-17 18:04:08.000000000 +0200 @@ -75,6 +75,72 @@ tree_is_clean() { git diff --quiet HEAD 2>/dev/null; } +release_tag() { printf 'v%s\n' "$(dysk_version)"; } + +# The commit the tag points at on origin, peeled; empty when there's no such tag. +remote_tag_commit() { # remote_tag_commit <tag> + local refs peeled + refs=$(git ls-remote --tags origin "refs/tags/$1" "refs/tags/$1^{}") \ + || die "couldn't query the tags of origin" + peeled=$(sed -n 's/[[:space:]].*\^{}$//p' <<< "$refs") + if [[ -n $peeled ]]; then + printf '%s\n' "$peeled" + else + sed -n 's/[[:space:]].*//p' <<< "$refs" + fi +} + +fetch_release_branch() { git fetch --quiet origin "$DYSK_RELEASE_BRANCH"; } + +# Whether HEAD is exactly origin/<release branch> as last fetched: neither +# unpushed nor behind. +head_is_published() { + [[ $(git rev-parse HEAD) == $(git rev-parse "origin/$DYSK_RELEASE_BRANCH") ]] +} + +# Die unless the release can be tied to what's on origin: HEAD pushed and up to +# date, and no release tag already pointing elsewhere. +check_release_source() { + local head origin tag tagged + head=$(git rev-parse HEAD) + fetch_release_branch || die "couldn't fetch origin/$DYSK_RELEASE_BRANCH" + if ! head_is_published; then + origin=$(git rev-parse "origin/$DYSK_RELEASE_BRANCH") + if git merge-base --is-ancestor "$origin" HEAD; then + die "HEAD ${head:0:10} isn't pushed to origin/$DYSK_RELEASE_BRANCH — push it first" + elif git merge-base --is-ancestor HEAD "$origin"; then + die "HEAD ${head:0:10} is behind origin/$DYSK_RELEASE_BRANCH (${origin:0:10}) — pull first" + else + die "HEAD ${head:0:10} and origin/$DYSK_RELEASE_BRANCH (${origin:0:10}) have diverged" + fi + fi + tag=$(release_tag) + tagged=$(remote_tag_commit "$tag") + if [[ -n $tagged && $tagged != "$head" ]]; then + die "tag $tag already exists on origin at ${tagged:0:10}, not at HEAD ${head:0:10}" + fi + ok "HEAD ${head:0:10} is origin/$DYSK_RELEASE_BRANCH${tagged:+, already tagged $tag}" +} + +# Create the release tag on HEAD and push it, unless origin already has it there. +push_release_tag() { + local tag head local_tagged + tag=$(release_tag) + head=$(git rev-parse HEAD) + if [[ $(remote_tag_commit "$tag") == "$head" ]]; then + ok "tag $tag already on origin" + return 0 + fi + local_tagged=$(git rev-parse -q --verify "refs/tags/$tag^{commit}" || true) + if [[ -z $local_tagged ]]; then + git tag "$tag" HEAD + elif [[ $local_tagged != "$head" ]]; then + die "local tag $tag points at ${local_tagged:0:10}, not at HEAD ${head:0:10}" + fi + git push --quiet origin "refs/tags/$tag" + ok "tag $tag created and pushed" +} + # Ask a yes/no question on the terminal, defaulting to no. With no terminal to # ask on (cron, CI) the answer is no, unless DYSK_YES is set. confirm() { # confirm <question> @@ -133,3 +199,4 @@ [[ -f "$_dysk_common_dir/_local.sh" ]] && source "$_dysk_common_dir/_local.sh" : "${DYSK_STAGE_HOST:=}" : "${DYSK_STAGE_DIR:=dysk-staging}" +: "${DYSK_RELEASE_BRANCH:=main}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/build-scripts/build-all-targets.sh new/dysk-3.8.1/build-scripts/build-all-targets.sh --- old/dysk-3.8.0/build-scripts/build-all-targets.sh 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/build-scripts/build-all-targets.sh 2026-10-17 18:04:08.000000000 +0200 @@ -27,6 +27,11 @@ version=$(dysk_version) h1 "Building all targets for $NAME $version (host $(host_os), darwin=$DARWIN_METHOD)" [[ $DARWIN_METHOD == skip ]] && warn "the macOS binaries will not be built (DARWIN_METHOD=skip)" +if ! fetch_release_branch; then + warn "couldn't fetch origin/$DYSK_RELEASE_BRANCH to check this build matches it" +elif ! head_is_published; then + warn "HEAD isn't origin/$DYSK_RELEASE_BRANCH: release.sh will refuse to package this build" +fi # Decide up front whether this build will be staged, so a dirty tree is settled # now rather than after a long build. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/build-scripts/deploy.sh new/dysk-3.8.1/build-scripts/deploy.sh --- old/dysk-3.8.0/build-scripts/deploy.sh 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/build-scripts/deploy.sh 2026-10-17 18:04:08.000000000 +0200 @@ -23,6 +23,9 @@ version=$(dysk_version) +# Legacy download path, still used by third-party install scripts. +ln -s x86_64-unknown-linux-gnu build/x86_64-linux + h1 "Deploying $version to $DYSK_DEPLOY_TARGET" # Everything must be world-readable to be served; -a then carries the modes over. # rsync's --chmod=D...,F... syntax isn't an option: macOS ships openrsync, which @@ -33,6 +36,9 @@ rsync -av "dysk_$version.zip" "$DYSK_DEPLOY_TARGET/" ok "deployed $version" +h2 "Tagging the release" +push_release_tag + # Last: the site must never describe a version whose binaries aren't up yet. h2 "Deploying the website" "$here/../website/deploy.sh" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/build-scripts/release.sh new/dysk-3.8.1/build-scripts/release.sh --- old/dysk-3.8.0/build-scripts/release.sh 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/build-scripts/release.sh 2026-10-17 18:04:08.000000000 +0200 @@ -16,6 +16,11 @@ version=$(dysk_version) +# The GitHub release and the source archives come from origin, so the binaries +# must be built from the commit that's there. +h2 "Checking the release source" +check_release_source + # Publishing a binary built from uncommitted work is worth a question, whether # or not the artifacts travelled through a staging server. if ! tree_is_clean; then @@ -85,3 +90,5 @@ ok "archived in releases/" h1 "Release $version ready: dysk_$version.zip" +info "deploy.sh publishes it and tags $(release_tag); then create the GitHub release with" +info " gh release create $(release_tag) dysk_$version.zip --verify-tag" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/cli/Cargo.toml new/dysk-3.8.1/cli/Cargo.toml --- old/dysk-3.8.0/cli/Cargo.toml 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/cli/Cargo.toml 2026-10-17 18:04:08.000000000 +0200 @@ -1,6 +1,6 @@ [package] name = "dysk-cli" -version = "3.7.1" +version = "3.8.1" authors = ["dystroy <[email protected]>"] edition = "2024" license = "MIT" @@ -18,6 +18,6 @@ lfs-core = "0.20.2" serde = "1.0" serde_json = "1.0" -termimad = "0.35.4" +termimad = "0.35.5" #termimad = { path = "../../termimad" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/cli/src/col.rs new/dysk-3.8.1/cli/src/col.rs --- old/dysk-3.8.0/cli/src/col.rs 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/cli/src/col.rs 2026-10-17 18:04:08.000000000 +0200 @@ -336,15 +336,15 @@ Self::Disk => Order::Asc, Self::Used => Order::Asc, Self::Use => Order::Desc, - Self::UsePercent => Order::Asc, + Self::UsePercent => Order::Desc, Self::UseBar => Order::Desc, Self::Free => Order::Asc, - Self::FreePercent => Order::Desc, + Self::FreePercent => Order::Asc, Self::Size => Order::Desc, Self::InodesUsed => Order::Asc, - Self::InodesUse => Order::Asc, - Self::InodesUsePercent => Order::Asc, - Self::InodesBar => Order::Asc, + Self::InodesUse => Order::Desc, + Self::InodesUsePercent => Order::Desc, + Self::InodesBar => Order::Desc, Self::InodesFree => Order::Asc, Self::InodesCount => Order::Asc, Self::MountPoint => Order::Asc, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/cli/src/col_expr.rs new/dysk-3.8.1/cli/src/col_expr.rs --- old/dysk-3.8.0/cli/src/col_expr.rs 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/cli/src/col_expr.rs 2026-10-17 18:04:08.000000000 +0200 @@ -123,10 +123,14 @@ mount.stats().as_ref().map(|s| s.use_share()), parse_float(&self.value)?, ), - Col::Free | Col::FreePercent => self.operator.eval_option( + Col::Free => self.operator.eval_option( mount.stats().as_ref().map(|s| s.available()), parse_integer(&self.value)?, ), + Col::FreePercent => self.operator.eval_option( + mount.stats().as_ref().map(|s| 1.0 - s.use_share()), + parse_float(&self.value)?, + ), Col::Size => self.operator.eval_option( mount.stats().as_ref().map(|s| s.size()), parse_integer(&self.value)?, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/website/src/filters.md new/dysk-3.8.1/website/src/filters.md --- old/dysk-3.8.0/website/src/filters.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/website/src/filters.md 2026-10-17 18:04:08.000000000 +0200 @@ -7,20 +7,20 @@ # Normality -The default selection of filesystems showcases your storage, avoiding any filesystem which both have no "disk" and aren't remote ones, bound to another filesystem, etc. +The default selection of filesystems showcases your storage: it leaves out virtual filesystems, bound mounts, and other filesystems with no underlying disk, except remote ones.  -Here are the rules of the current heuristics, in order: a filesystem +More precisely, a filesystem is listed by default when all these conditions hold: -1. is excluded when its usage statistics can't be read unless it's an unreachable remote one -1. is excluded when it's bound to a previous one -1. is excluded when it's of type `squashfs` -1. is included when it's of type `zfs` -1. is included when it's remote -1. is excluded when its disk is a disk image -1. is excluded when no underlying disk was found -1. (on mac) is excluded when it's the read-only system volum, is mounted in `/System` (except `/System/Volumes/Data`) or in `/Library/Developper` +* its usage statistics could be read, or it's unreachable (eg a remote one whose server is down) +* it has an underlying disk, or it's remote, or it's of type `zfs` +* its disk isn't a disk image +* it isn't bound to another filesystem +* it isn't of type `squashfs` +* (on mac) it isn't the read-only system volume mounted on `/`, and isn't mounted in `/System` (except `/System/Volumes/Data`) or in `/Library/Developer` + +Usage statistics may also be missing because they were [skipped or took too long](../table#remote-filesystems). To see *all* filesystems of your system, do `dysk --all`: @@ -36,6 +36,8 @@  +This filesystem is shown even when it isn't a "normal" one. Bound mounts of the same device are only shown with `-a`. + # Filter argument The `--filter` argument, shortened in `-f`, lets you specify a constraint, or combine several ones. @@ -55,9 +57,15 @@ |>| greater |>=| greater or equal |<>| different -|=| somehow equal - for example `fs=sda` matches `/dev/sda1` +|=| on text columns, contains, ignoring case - for example `fs=sda` matches `/dev/sda1`; on other columns, equal |==|really equal +The value is read according to the column: + +* sizes (`size`, `used`, `free`) and counts (`inodes_free`, etc.) take a number, optionally with a unit: `100G`, `4kB`, `1.5T`. Add `i` for 1024-based units, eg `54GiB` +* shares (`use`, `use_percent`, `free_percent`, `inodes`, `inodes_use_percent`, etc.) take a percentage like `65%`, or a fraction like `0.65` +* booleans (`remote`) take `true` or `false`, `yes` or `no`, `1` or `0` + You can combine several column conditions with boolean operators `|` (or), `&` (and) and `!` (not) and if needed you can use parenthesis. For example you may want to select the volumes with not enough space with diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/website/src/index.md new/dysk-3.8.1/website/src/index.md --- old/dysk-3.8.0/website/src/index.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/website/src/index.md 2026-10-17 18:04:08.000000000 +0200 @@ -18,10 +18,11 @@ * `RAM` : an in-memory device (such as zram) * `LVM` : a device mapped to one or several disks using LVM * `crypt` : a crypted disk +* `imag` : a disk image (only listed with `-a`) By default, only the "normal" devices, the ones you're usually interested about, are shown, but you can see the other ones with the `-a` option. -All sizes are normally based on the current SI recommendations (1M is one million bytes) but can be changed with `--units binary` (then 1M is 1,048,576 bytes). +All sizes are normally based on the current SI recommendations (1M is one million bytes) but can be changed with `--units binary` (then 1Mi is 1,048,576 bytes), or `--units bytes` for exact byte counts. # Tables diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/website/src/install.md new/dysk-3.8.1/website/src/install.md --- old/dysk-3.8.0/website/src/install.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/website/src/install.md 2026-10-17 18:04:08.000000000 +0200 @@ -1,13 +1,11 @@ -**dysk** works on Linux, Mac, and Windows (experimental). +**dysk** works on Linux, Mac, and Windows. Current version: **<a id=current-version href=../download>download</a>** <script> -console.log("in script"); fetch("../download/version",{cache: "reload"}) .then(response => response.text()) .then(version => { - console.log(`version: #${version}#`); version = version.trim(); if (!/^\d+(\.\d+)*(-\w+)?$/.test(version)) { console.warn("invalid version in download/version"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/website/src/json.md new/dysk-3.8.1/website/src/json.md --- old/dysk-3.8.0/website/src/json.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/website/src/json.md 2026-10-17 18:04:08.000000000 +0200 @@ -32,6 +32,7 @@ "fs-type": "ext4", "id": 26, "mount-point": "/", + "options": "rw,relatime", "remote": false, "stats": { "available": "81G", @@ -39,6 +40,7 @@ "bfree": 22790364, "blocks": 59233748, "bsize": 4096, + "bused": 36443384, "inodes": { "avail": 13880393, "files": 15114240, @@ -57,6 +59,11 @@ Note that fields may be *added* in any version. +The JSON output doesn't depend on `--cols`: all fields are always there. + +`size`, `used`, and `available` are formatted according to `--units`. +For raw numbers, use `blocks`, `bavail`, `bfree`, and `bused`, which count blocks of `bsize` bytes. + # All filesystems As for the table view, the JSON is by default limited to "normal" storage devices. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/dysk-3.8.0/website/src/table.md new/dysk-3.8.1/website/src/table.md --- old/dysk-3.8.0/website/src/table.md 2026-10-17 07:43:53.000000000 +0200 +++ new/dysk-3.8.1/website/src/table.md 2026-10-17 18:04:08.000000000 +0200 @@ -4,7 +4,7 @@ # Columns -You can run `dysk --list-cols` for the list of all columns. +You can run `dysk --list-cols` for the list of all columns, with their aliases (eg `ifree` for `inodes_free`). ## All columns @@ -24,12 +24,12 @@ free | ✓ | cumulated size of the available blocks free_percent | | percentage of available blocks size | ✓ | size of the volume -inodesfree | | available inodes -inodesused | | inodes used +inodes_free | | available inodes +inodes_used | | inodes used inodes | | inodes use share, graphical inodes_use_percent | | inodes use share, in percents inodes_bar | | inodes use share, graphical, without percentage -inodescount | | total number of inodes in the filesystem +inodes_total | | total number of inodes in the filesystem mount | ✓ | mounting path uuid | | filesystem's UUID partuuid | | partition's UUID @@ -67,12 +67,12 @@  -To preprend the `label` column before the default ones, use `dysk -c label+`: +To prepend the `label` column before the default ones, use `dysk -c label+`:  The `-` sign removes columns. -And adding an already present column moves it to the end (there's never duplicates). +And adding an already present column moves it to the end (there are never duplicates). Here's removing the `fs` column and moving the `type` column to the end, with `dysk -c -fs+type`: @@ -87,6 +87,8 @@ The `desc` and `asc` directions can be abbreviated into `d` and `a`. +Without a direction, the usual one for the column is used: for example `dysk -s size` lists the biggest filesystems first. + For example, sorting on the device id:  @@ -102,6 +104,19 @@  +`--color` takes `yes`, `no`, or `auto` (the default: colors only when the output is a terminal). + +`--bar-width` sets the width of the bars of the `use`, `use_bar`, `inodes`, and `inodes_bar` columns (5 by default). + +# Remote filesystems + +dysk reads the usage of remote filesystems (NFS, SMB, etc.) too. +If that's slow, `--remote-stats no` skips it (on Linux and Windows): those filesystems are then only listed with `-a`. + +On Linux, reading the usage of a filesystem gives up after 50ms, and the `use` column then says `timeout`. +Such a filesystem is only listed with `-a`. +You may change the delay with `--timeout`, eg `--timeout 2s` or `--timeout 500ms`, or wait as long as needed with `--timeout none`. + # CSV With the `--csv` argument, you can ask dysk to output the table in CSV: @@ -112,7 +127,7 @@ You may choose the separator with the `--csv-separator` argument. -Filters, sorting, and column selection work the same than for standard tables so you may do this: +Filters, sorting, and column selection work the same as for standard tables so you may do this: ```bash dysk --csv -f 'size>100G' -c remote+default+inodes > mounts.csv ++++++ dysk.obsinfo ++++++ --- /var/tmp/diff_new_pack.vf60kM/_old 2026-10-20 12:39:16.235870707 +0200 +++ /var/tmp/diff_new_pack.vf60kM/_new 2026-10-20 12:39:16.249871293 +0200 @@ -1,5 +1,5 @@ name: dysk -version: 3.8.0 -mtime: 1792215833 -commit: ce437e13cfc3f02ce2fdb6d2a4aeb552c0a940eb +version: 3.8.1 +mtime: 1792253048 +commit: c002b844cfc33d56aaa7a4c46b80b033b07e0dee ++++++ vendor.tar.zst ++++++ /work/SRC/openSUSE:Factory/dysk/vendor.tar.zst /work/SRC/openSUSE:Factory/.dysk.new.3698736/vendor.tar.zst differ: char 7, line 1
