Compare commits

...

17 Commits
0.8.4 ... main

Author SHA1 Message Date
SqrtMinusOne 2f4e59ea7a Add new variables to the README 2022-07-28 12:06:06 +02:00
SqrtMinusOne 987e69a662 Add an option to exclude some partitions 2022-07-28 12:06:06 +02:00
SqrtMinusOne 6b464b1b73 Add an option to filter duplicate partitions 2022-07-28 12:06:06 +02:00
Lucien Cartier-Tilet b7f2bfc013
v0.8.8 2022-05-31 11:40:22 +02:00
Lucien Cartier-Tilet fcc88df86a
Add CI with Github Actions
Check for compatibility with all version of Emacs since Emacs 25.1

Add Cask file for managing dependencies in CI

Add badge in README for CI
2022-05-31 11:40:22 +02:00
Lucien Cartier-Tilet 4ffaf329db
Fix erroneous require 2022-05-31 11:40:12 +02:00
Juergen Hoetzel 8e57add6c7 Use tramp-aware shell function
Fixes wrong report of disk usage when using
‘eshell-info-banner-tramp-aware’.
2022-05-16 19:14:29 +02:00
Juergen Hoetzel 8c6e37cc61 GNU and Darwin df shows space in 1K blocks by default
Als use the "-k" parameter to enforce this block size, so that the
command does not depend on environment variables (POSIXLY_CORRECT and
BLOCKSIZE).

Fixes #21
2022-05-14 22:01:14 +02:00
Lucien Cartier-Tilet 53fc69b871
Clarify partition detection paragraph for Windows users 2022-04-02 19:31:30 +02:00
Lucien Cartier-Tilet ce7b5f69cd
Reimplement and replace s-repeat
Progressively phasing out s.el as a dependency
2022-04-02 19:21:37 +02:00
Lucien Cartier-Tilet dedcb8cee5
Replace s-trim with string-trim
Progressively phasing out s.el as a dependency
2022-04-02 19:21:34 +02:00
Lucien Cartier-Tilet f9490f07a1
Turns out I misunderstood what `:version` is for in defcustom 2022-03-29 00:06:14 +02:00
Lucien Cartier-Tilet 9c17e92f02
Fix macOS version detection
Now use regexes to detect the macOS version returned by
`sw_vers -productVersion`

Also add new macOS version

Fixes #18
2022-03-26 10:33:59 +01:00
Lucien Cartier-Tilet 247d8bf4dd
Remove eval-when-compile on const variable
Fixes #20
2022-01-14 11:21:29 +01:00
Lucien Cartier-Tilet d4033120c1
Evaluate eshell-info-banner-path-separator on compile 2022-01-07 12:09:44 +01:00
Lucien Cartier-Tilet 89d2b7226b
Remove dependency on f.el 2022-01-07 12:06:39 +01:00
Lucien Cartier-Tilet 2c53218cc7
Better documentation formatting 2022-01-07 02:56:38 +01:00
6 changed files with 256 additions and 126 deletions

46
.github/workflows/workflow.yml vendored Normal file
View File

@ -0,0 +1,46 @@
name: CI
on:
push:
pull_request:
workflow_dispatch:
jobs:
check-compatibility:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
emacs_version:
- 25.1
- 25.2
- 25.3
- 26.1
- 26.2
- 26.3
- 27.1
- 27.2
- 28.1
- snapshot
steps:
- uses: actions/checkout@v3
- uses: purcell/setup-emacs@master
with:
version: ${{ matrix.emacs_version }}
- uses: actions/cache@v2
id: cache-cask-packages
with:
path: .cask
key: cache-cask-packages-000
- uses: actions/cache@v2
id: cache-cask-executable
with:
path: ~/.cask
key: cache-cask-executable-000
- name: "Cask setup"
uses: cask/setup-cask@master
if: steps.cask-cache-executable.outputs.cache-hit != 'true'
- name: "Install Cask dependencies"
run: cask install
if: steps.cask-cache-executable.outputs.cache-hit != 'true'
- name: "Check version compatibility"
run: make all

7
Cask Normal file
View File

@ -0,0 +1,7 @@
(source melpa)
(source gnu)
(package-file "eshell-info-banner.el")
(development
(depends-on "s"))

11
Makefile Normal file
View File

@ -0,0 +1,11 @@
# -*- indent-tabs-mode: t -*-
export EMACS ?= $(shell which emacs)
CASK ?= $(shell which cask)
all: compile
compile:
${CASK} exec ${EMACS} -Q --script bin/compile-package.el 2>&1 | grep -A 2 -E "([Ee]rror|[Ww]arning):" && exit 1 || exit 0
.PHONY: all compile

View File

@ -3,6 +3,7 @@
#+email: lucien@phundrak.com #+email: lucien@phundrak.com
[[https://melpa.org/#/eshell-info-banner][file:https://melpa.org/packages/eshell-info-banner-badge.svg]] [[https://melpa.org/#/eshell-info-banner][file:https://melpa.org/packages/eshell-info-banner-badge.svg]]
[[https://stable.melpa.org/#/eshell-info-banner][file:https://stable.melpa.org/packages/eshell-info-banner-badge.svg]] [[https://stable.melpa.org/#/eshell-info-banner][file:https://stable.melpa.org/packages/eshell-info-banner-badge.svg]]
[[https://github.com/Phundrak/eshell-info-banner.el/actions/workflows/workflow.yml][file:https://github.com/Phundrak/eshell-info-banner.el/actions/workflows/workflow.yml/badge.svg]]
* Introduction * Introduction
~eshell-info-banner.el~ is a utility for creating an informative banner, ~eshell-info-banner.el~ is a utility for creating an informative banner,
@ -108,6 +109,15 @@ A couple of variables can be edited by the user in order to configure
set its value to ~("/dev" "zroot")~. set its value to ~("/dev" "zroot")~.
Default value: ~("/dev")~ Default value: ~("/dev")~
- ~eshell-info-banner-filter-duplicate-partitions~ :: Try to filter
out duplicate partitions. Two partitions are considered duplicate if
they have the same size and amount of space used.
Default value: ~nil~
- ~eshell-info-banner-exclude-partitions~ :: List of pattens to exclude
from the partition list.
Default value: ~nil~
- ~eshell-info-banner-shorten-path-from~ :: Maximum length of the mount - ~eshell-info-banner-shorten-path-from~ :: Maximum length of the mount
path of a partition before it gets abbreviated. Set it to ridiculous path of a partition before it gets abbreviated. Set it to ridiculous
numbers in order to disable it (something like ~1000~ should be more numbers in order to disable it (something like ~1000~ should be more
@ -189,10 +199,9 @@ line if you have one. If you dont have a battery, the only difference
is you will have one less line than laptop users. is you will have one less line than laptop users.
* Advice for Windows users * Advice for Windows users
Currently, the partitions detection is done only with the ~duf~ Currently, ~eshell-info-banner~ can only look for your partitions with
command-line utility. If you want a list of your partitions, I ~duf~. If you want a list of your partitions, I strongly encourage you
strongly encourage you to install it on your system. See to install it on your system. See [[https://github.com/muesli/duf#windows][muesli/duf]].
[[https://github.com/muesli/duf#windows]].
* Contributing * Contributing
See [[file:CONTRIBUTING.org]]. See [[file:CONTRIBUTING.org]].

1
bin/compile-package.el Normal file
View File

@ -0,0 +1 @@
(byte-recompile-directory "." 0 'force)

View File

@ -2,8 +2,8 @@
;; Author: Lucien Cartier-Tilet <lucien@phundrak.com> ;; Author: Lucien Cartier-Tilet <lucien@phundrak.com>
;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com> ;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com>
;; Version: 0.8.4 ;; Version: 0.8.8
;; Package-Requires: ((emacs "25.1") (f "0.20") (s "1")) ;; Package-Requires: ((emacs "25.1") (s "1"))
;; Homepage: https://github.com/Phundrak/eshell-info-banner.el ;; Homepage: https://github.com/Phundrak/eshell-info-banner.el
;; This file is not part of GNU Emacs ;; This file is not part of GNU Emacs
@ -38,7 +38,7 @@
;;; Code: ;;; Code:
(require 'cl-lib) (require 'cl-lib)
(require 'f) (require 's)
(require 'em-banner) (require 'em-banner)
(require 'json) (require 'json)
(require 'seq) (require 'seq)
@ -60,38 +60,34 @@
; Constants ; ; Constants ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst eshell-info-banner-path-separator
(substring-no-properties (file-relative-name (expand-file-name "x" "y")) 1 2)
"File separator used by the current operating system.")
(defconst eshell-info-banner--min-length-left 8 (defconst eshell-info-banner--min-length-left 8
"Minimum length of text on the left hand side of the banner.") "Minimum length of text on the left hand side of the banner.")
(eval-when-compile (eval-when-compile
(defconst eshell-info-banner--macos-versions (defconst eshell-info-banner--macos-versions
'(("10.0" . "Mac OS X Cheetah") '(("^10\\.0\\." . "Mac OS X Cheetah")
("10.1" . "Mac OS X Puma") ("^10\\.1\\." . "Mac OS X Puma")
("10.2" . "Mac OS X Jaguar") ("^10\\.2\\." . "Mac OS X Jaguar")
("10.3" . "Mac OS X Panther") ("^10\\.3\\." . "Mac OS X Panther")
("10.4" . "Mac OS X Tiger") ("^10\\.4\\." . "Mac OS X Tiger")
("10.5" . "Mac OS X Leopard") ("^10\\.5\\." . "Mac OS X Leopard")
("10.6" . "Mac OS X Snow Leopard") ("^10\\.6\\." . "Mac OS X Snow Leopard")
("10.7" . "Mac OS X Lion") ("^10\\.7\\." . "Mac OS X Lion")
("10.8" . "OS X Mountain Lion") ("^10\\.8\\." . "OS X Mountain Lion")
("10.9" . "OS X Mavericks") ("^10\\.9\\." . "OS X Mavericks")
("10.10" . "OS X Yosemite") ("^10\\.10\\." . "OS X Yosemite")
("10.11" . "OS X El Capitan") ("^10\\.11\\." . "OS X El Capitan")
("10.12" . "macOS Sierra") ("^10\\.12\\." . "macOS Sierra")
("10.13" . "macOS High Sierra") ("^10\\.13\\." . "macOS High Sierra")
("10.14" . "macOS Mojave") ("^10\\.14\\." . "macOS Mojave")
("10.15" . "macOS Catalina") ("^10\\.15\\." . "macOS Catalina")
("10.16" . "macOS Big Sur") ("^10\\.16\\." . "macOS Big Sur")
("11.0" . "macOS Big Sur") ("^11\\." . "macOS Big Sur")
("11.1" . "macOS Big Sur") ("^12\\." . "macOS Monterey"))
("11.2" . "macOS Big Sur")
("11.3" . "macOS Big Sur")
("11.4" . "macOS Big Sur")
("11.5" . "macOS Big Sur")
("11.6" . "macOS Big Sur")
("12.0" . "macOS Monterey")
("12.1" . "macOS Monterey")
("12.2" . "macOS Monterey"))
"Versions of OSX and macOS and their name.")) "Versions of OSX and macOS and their name."))
(defconst eshell-info-banner--posix-shells '("bash" "zsh" "sh") (defconst eshell-info-banner--posix-shells '("bash" "zsh" "sh")
@ -106,69 +102,77 @@
"Make `eshell-info-banner' TRAMP aware." "Make `eshell-info-banner' TRAMP aware."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'boolean :type 'boolean
:safe #'booleanp :safe #'booleanp)
:version "0.3.0")
(defcustom eshell-info-banner-shorten-path-from 7 (defcustom eshell-info-banner-shorten-path-from 7
"From which length should a path be shortened?" "From which length should a path be shortened?"
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'integer :type 'integer
:safe #'integer-or-marker-p :safe #'integer-or-marker-p)
:version "0.1.0")
(defcustom eshell-info-banner-width 80 (defcustom eshell-info-banner-width 80
"Width of the info banner to be shown in Eshell." "Width of the info banner to be shown in Eshell."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'integer :type 'integer
:safe #'integer-or-marker-p :safe #'integer-or-marker-p)
:version "0.1.0")
(defcustom eshell-info-banner-progress-bar-char "=" (defcustom eshell-info-banner-progress-bar-char "="
"Character to fill the progress bars with." "Character to fill the progress bars with."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'string :type 'string
:safe #'stringp :safe #'stringp)
:version "0.1.0")
(defcustom eshell-info-banner-warning-percentage 75 (defcustom eshell-info-banner-warning-percentage 75
"When to warn about a percentage." "When to warn about a percentage."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'float :type 'float
:safe #'floatp :safe #'floatp)
:version "0.1.0")
(defcustom eshell-info-banner-critical-percentage 90 (defcustom eshell-info-banner-critical-percentage 90
"When a percentage becomes critical." "When a percentage becomes critical."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'float :type 'float
:safe #'floatp :safe #'floatp)
:version "0.1.0")
(defcustom eshell-info-banner-partition-prefixes '("/dev") (defcustom eshell-info-banner-partition-prefixes '("/dev")
"List of prefixes for detecting which partitions to display." "List of prefixes for detecting which partitions to display."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'list :type 'list)
:version "0.3.0")
(defun eshell-info-banner--executable-find (program) (defcustom eshell-info-banner-filter-duplicate-partitions nil
"Whether to filter duplicate partitions.
Two partitions are considered duplicate if they have the same
size and amount of space used."
:group 'eshell-info-banner
:type 'boolean)
(defcustom eshell-info-banner-exclude-partitions nil
"List of patterns to exclude from the partition list.
Patterns are matched against the partition name with
`string-match-p'."
:group 'eshell-info-banner
:type '(repeat string))
(defmacro eshell-info-banner--executable-find (program)
"Find PROGRAM executable, possibly on a remote machine. "Find PROGRAM executable, possibly on a remote machine.
This is a wrapper around `executable-find' in order to avoid This is a wrapper around `executable-find' in order to avoid
issues with older versions of the functions only accepting one issues with older versions of the functions only accepting one
argument. `executable-find's remote argument has the value of argument. `executable-find's remote argument has the value of
`eshell-info-banner-tramp-aware'." `eshell-info-banner-tramp-aware'."
(if (version< emacs-version "27.1") (if (version< emacs-version "27.1")
(let ((default-directory (if eshell-info-banner-tramp-aware `(let ((default-directory (if eshell-info-banner-tramp-aware
default-directory default-directory
"~"))) "~")))
(executable-find program)) (executable-find ,program))
(executable-find program eshell-info-banner-tramp-aware))) `(executable-find ,program eshell-info-banner-tramp-aware)))
(defcustom eshell-info-banner-duf-executable "duf" (defcustom eshell-info-banner-duf-executable "duf"
"Path to the `duf' executable." "Path to the `duf' executable."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'string :type 'string
:safe #'stringp :safe #'stringp)
:version "0.5.0")
(defcustom eshell-info-banner-use-duf (defcustom eshell-info-banner-use-duf
(if (eshell-info-banner--executable-find eshell-info-banner-duf-executable) (if (eshell-info-banner--executable-find eshell-info-banner-duf-executable)
@ -177,16 +181,14 @@ argument. `executable-find's remote argument has the value of
"If non-nil, use `duf' instead of `df'." "If non-nil, use `duf' instead of `df'."
:group 'eshell-info-banner :group 'eshell-info-banner
:type 'boolean :type 'boolean
:safe #'booleanp :safe #'booleanp)
:version "0.5.0")
(defcustom eshell-info-banner-file-size-flavor nil (defcustom eshell-info-banner-file-size-flavor nil
"Display sizes with IEC prefixes." "Display sizes with IEC prefixes."
:group 'eshell-info-banner :group 'eshell-info-banner
:type '(radio (const :tag "Default" nil) :type '(radio (const :tag "Default" nil)
(const :tag "SI" si) (const :tag "SI" si)
(const :tag "IEC" iec)) (const :tag "IEC" iec)))
:version "0.8.0")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -219,7 +221,7 @@ argument. `executable-find's remote argument has the value of
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro eshell-info-banner--with-face (str &rest properties) (defmacro eshell-info-banner--with-face (str &rest properties)
"Helper macro for applying face `PROPERTIES' to `STR'." "Helper macro for applying face PROPERTIES to STR."
`(propertize ,str 'face (list ,@properties))) `(propertize ,str 'face (list ,@properties)))
(defun eshell-info-banner--shell-command-to-string (command) (defun eshell-info-banner--shell-command-to-string (command)
@ -230,8 +232,9 @@ Ensures the command is ran with LANG=C."
eshell-info-banner--posix-shells) eshell-info-banner--posix-shells)
"sh"))) "sh")))
(with-temp-buffer (with-temp-buffer
(call-process shell nil t nil "-c" (concat "LANG=C " command)) (let ((default-directory (if eshell-info-banner-tramp-aware default-directory "~")))
(buffer-string)))) (process-file shell nil t nil "-c" (concat "LANG=C " command))
(buffer-string)))))
(defun eshell-info-banner--progress-bar-without-prefix (bar-length used total &optional newline) (defun eshell-info-banner--progress-bar-without-prefix (bar-length used total &optional newline)
"Display a progress bar without its prefix. "Display a progress bar without its prefix.
@ -254,6 +257,14 @@ of the progress bar."
:inherit (eshell-info-banner--get-color-percentage percentage)) :inherit (eshell-info-banner--get-color-percentage percentage))
(if newline "\n" ""))))) (if newline "\n" "")))))
(defun eshell-info-banner--string-repeat (str times)
"Repeat STR for TIMES times."
(declare (pure t) (side-effect-free t))
(let (result)
(cl-dotimes (_ times)
(setq result (cons str result)))
(apply #'concat result)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Internal functions ; ; Internal functions ;
@ -285,7 +296,7 @@ If the executable `uptime' is not found, return nil."
path size used percent) path size used percent)
(defun eshell-info-banner--get-longest-path (partitions) (defun eshell-info-banner--get-longest-path (partitions)
"Return the length of the longest partition path in `PARTITIONS'. "Return the length of the longest partition path in PARTITIONS.
The returned value is in any case greater than The returned value is in any case greater than
`eshell-info-banner--min-length-left'." `eshell-info-banner--min-length-left'."
@ -295,34 +306,43 @@ The returned value is in any case greater than
(length (eshell-info-banner--mounted-partitions-path partition))))))) (length (eshell-info-banner--mounted-partitions-path partition)))))))
(defun eshell-info-banner--abbr-path (path &optional abbr) (defun eshell-info-banner--abbr-path (path &optional abbr)
"Remove `$HOME' from `PATH', abbreviate parent dirs if `ABBR' non nil. "Remove `$HOME' from PATH, abbreviate parent dirs if ABBR non nil.
Abbreviate `PATH' by removing the value of `HOME' if it is Abbreviate PATH by removing the value of HOME if it is present in
present in the former, and if `ABBR' is t then all parent the former, and if ABBR is t then all parent directories of the
directories of the current `PATH' are abbreviated to only one current PATH are abbreviated to only one character. If an
character. If an abbreviated directory starts with a dot, then abbreviated directory starts with a dot, then include it before
include it before the abbreviated name of the directory, the abbreviated name of the directory, e.g. \".config\" ->
e.g. \".config\" -> \".c\". \".c\".
For public use, `PATH' should be a string representing a UNIX For public use, PATH should be a string representing a UNIX path.
path. For internal use, `PATH' can also be a list. If `PATH' is For internal use, PATH can also be a list. If PATH is neither of
neither of these, an error will be thrown by the function." these, an error will be thrown by the function."
(cond (cond
((stringp path) (abbreviate-file-name ((stringp path)
(if abbr (let ((abbr-path (abbreviate-file-name path)))
(eshell-info-banner--abbr-path (if abbr
(f-split (eshell-info-banner--abbr-path path))) (abbreviate-file-name
path))) (eshell-info-banner--abbr-path
(split-string abbr-path eshell-info-banner-path-separator t)))
abbr-path)))
((null path) "") ((null path) "")
((listp path) ((listp path)
(f-join (if (= (length path) 1) (let ((file (eshell-info-banner--abbr-path (cdr path)))
(car path) (directory (if (= (length path) 1)
(let* ((dir (car path)) (car path)
(first-char (substring dir 0 1))) (let* ((dir (car path))
(if (string= "." first-char) (first-char (substring dir 0 1)))
(substring dir 0 2) (if (string= "." first-char)
first-char))) (substring dir 0 2)
(eshell-info-banner--abbr-path (cdr path)))) first-char)))))
(if (string= "" file)
directory
(let ((relative-p (not (file-name-absolute-p directory)))
(new-dir (expand-file-name file directory)))
(if relative-p
(file-relative-name new-dir)
new-dir)))))
(t (error "Invalid argument %s, neither stringp or listp" path)))) (t (error "Invalid argument %s, neither stringp or listp" path))))
(defun eshell-info-banner--get-mounted-partitions-duf () (defun eshell-info-banner--get-mounted-partitions-duf ()
@ -362,15 +382,15 @@ Common function between
otherwise differ solely on the position of the mount point in the otherwise differ solely on the position of the mount point in the
partition list. Its position is given by the argument partition list. Its position is given by the argument
MOUNT-POSITION." MOUNT-POSITION."
(let ((partitions (cdr (split-string (eshell-info-banner--shell-command-to-string "df -l") (let ((partitions (cdr (split-string (eshell-info-banner--shell-command-to-string "df -l -k")
(regexp-quote "\n") (regexp-quote "\n")
t)))) t))))
(cl-remove-if #'null (cl-remove-if #'null
(mapcar (lambda (partition) (mapcar (lambda (partition)
(let* ((partition (split-string partition " " t)) (let* ((partition (split-string partition " " t))
(filesystem (nth 0 partition)) (filesystem (nth 0 partition))
(size (string-to-number (nth 1 partition))) (size (* (string-to-number (nth 1 partition)) 1024))
(used (string-to-number (nth 2 partition))) (used (* (string-to-number (nth 2 partition)) 1024))
(percent (nth 4 partition)) (percent (nth 4 partition))
(mount (nth mount-position partition))) (mount (nth mount-position partition)))
(when (seq-some (lambda (prefix) (when (seq-some (lambda (prefix)
@ -383,7 +403,7 @@ MOUNT-POSITION."
:size size :size size
:used used :used used
:percent (string-to-number :percent (string-to-number
(string-trim-left percent (regexp-quote "%"))))))) (s-chop-suffix "%" percent))))))
partitions)))) partitions))))
(defun eshell-info-banner--get-mounted-partitions-gnu () (defun eshell-info-banner--get-mounted-partitions-gnu ()
@ -412,26 +432,54 @@ Return detected partitions as a list of structs. See
chosen. Relies on the `df' command." chosen. Relies on the `df' command."
(eshell-info-banner--get-mounted-partitions-df 8)) (eshell-info-banner--get-mounted-partitions-df 8))
(defun eshell-info-banner--get-mounted-partitions () (defun eshell-info-banner--get-mounted-partitions-1 ()
"Detect mounted partitions on the system. "Detect mounted partitions on the system.
Return detected partitions as a list of structs." Return detected partitions as a list of structs."
(if eshell-info-banner-use-duf (if eshell-info-banner-use-duf
(eshell-info-banner--get-mounted-partitions-duf) (eshell-info-banner--get-mounted-partitions-duf)
(pcase system-type (pcase system-type
((or 'gnu 'gnu/linux 'gnu/kfreebsd 'berkeley-unix) ((or 'gnu 'gnu/linux 'gnu/kfreebsd 'berkeley-unix)
(eshell-info-banner--get-mounted-partitions-gnu)) (eshell-info-banner--get-mounted-partitions-gnu))
((or 'ms-dos 'windows-nt 'cygwin) ((or 'ms-dos 'windows-nt 'cygwin)
(eshell-info-banner--get-mounted-partitions-windows)) (eshell-info-banner--get-mounted-partitions-windows))
('darwin ('darwin
(eshell-info-banner--get-mounted-partitions-darwin)) (eshell-info-banner--get-mounted-partitions-darwin))
(other (other
(progn (progn
(warn "Partition detection for %s not yet supported." other) (warn "Partition detection for %s not yet supported." other)
nil))))) nil)))))
(defun eshell-info-banner--get-mounted-partitions ()
"Detect mounted partitions on the system.
Take `eshell-info-banner-filter-duplicate-partitions' and
`eshell-info-banner-exclude-partitions' into account."
(let ((partitions (eshell-info-banner--get-mounted-partitions-1)))
(when eshell-info-banner-filter-duplicate-partitions
(setq partitions
(cl-loop for partition in partitions
with used = nil
for signature =
(format "%d-%d"
(eshell-info-banner--mounted-partitions-size partition)
(eshell-info-banner--mounted-partitions-used partition))
unless (member signature used)
collect partition and do (push signature used))))
(when eshell-info-banner-exclude-partitions
(setq partitions
(seq-filter (lambda (partition)
(let ((path (eshell-info-banner--mounted-partitions-path
partition)))
(not (seq-some
(lambda (pattern)
(string-match-p pattern path))
eshell-info-banner-exclude-partitions))))
partitions)))
partitions))
(defun eshell-info-banner--partition-to-string (partition text-padding bar-length) (defun eshell-info-banner--partition-to-string (partition text-padding bar-length)
"Display a progress bar showing how full a `PARTITION' is. "Display a progress bar showing how full a PARTITION is.
For TEXT-PADDING and BAR-LENGTH, see the documentation of For TEXT-PADDING and BAR-LENGTH, see the documentation of
`eshell-info-banner--display-memory'." `eshell-info-banner--display-memory'."
@ -570,16 +618,16 @@ in bytes."
(defun eshell-info-banner--memory-to-string (type total used text-padding bar-length) (defun eshell-info-banner--memory-to-string (type total used text-padding bar-length)
"Display a memorys usage with a progress bar. "Display a memorys usage with a progress bar.
The `TYPE' of memory will be the text on the far left, while The TYPE of memory will be the text on the far left, while USED
`USED' and `TOTAL' will be displayed on the right of the progress and TOTAL will be displayed on the right of the progress bar.
bar. From them, a percentage will be computed which will be used From them, a percentage will be computed which will be used to
to display a colored percentage of the progress bar and it will display a colored percentage of the progress bar and it will be
be displayed on the far right. displayed on the far right.
`TEXT-PADDING' will determine how many dots are necessary between TEXT-PADDING will determine how many dots are necessary between
`TYPE' and the colon. TYPE and the colon.
`BAR-LENGTH' determines the length of the progress bar to be BAR-LENGTH determines the length of the progress bar to be
displayed." displayed."
(concat (s-pad-right text-padding "." type) (concat (s-pad-right text-padding "." type)
": " ": "
@ -595,10 +643,10 @@ bars will have this appearance:
TYPE......: [=========] XXG / XXG (XX%) TYPE......: [=========] XXG / XXG (XX%)
`TEXT-PADDING': the space allocated to the text at the left of the TEXT-PADDING: the space allocated to the text at the left of the
progress bar. progress bar.
`BAR-LENGTH': the length of the progress bar." BAR-LENGTH: the length of the progress bar."
(mapconcat (lambda (mem) (mapconcat (lambda (mem)
(eshell-info-banner--memory-to-string (nth 0 mem) (nth 1 mem) (eshell-info-banner--memory-to-string (nth 0 mem) (nth 1 mem)
(nth 2 mem) text-padding (nth 2 mem) text-padding
@ -610,7 +658,7 @@ progress bar.
; Display information ;;;;;;;;;;;;;;;;; ; Display information ;;;;;;;;;;;;;;;;;
(defun eshell-info-banner--get-color-percentage (percentage) (defun eshell-info-banner--get-color-percentage (percentage)
"Display a `PERCENTAGE' with its according face." "Display a PERCENTAGE with its according face."
(let ((percentage (if (stringp percentage) (let ((percentage (if (stringp percentage)
(string-to-number percentage) (string-to-number percentage)
percentage))) percentage)))
@ -622,12 +670,12 @@ progress bar.
(t 'eshell-info-banner-normal-face)))) (t 'eshell-info-banner-normal-face))))
(defun eshell-info-banner--progress-bar (length percentage &optional invert) (defun eshell-info-banner--progress-bar (length percentage &optional invert)
"Display a progress bar `LENGTH' long and `PERCENTAGE' full. "Display a progress bar LENGTH long and PERCENTAGE full.
The full path will be displayed filled with the character The full path will be displayed filled with the character
specified by `eshell-info-banner-progress-bar-char' up to specified by `eshell-info-banner-progress-bar-char' up to
`PERCENTAGE' percents. The rest will be empty. PERCENTAGE percents. The rest will be empty.
If `INVERT' is t, then consider the percentage to approach If INVERT is t, then consider the percentage to approach
critical levels close to 0 rather than 100." critical levels close to 0 rather than 100."
(let* ((length-filled (if (= 0 percentage) (let* ((length-filled (if (= 0 percentage)
0 0
@ -638,10 +686,12 @@ critical levels close to 0 rather than 100."
percentage))) percentage)))
(concat (concat
(eshell-info-banner--with-face "[" :weight 'bold) (eshell-info-banner--with-face "[" :weight 'bold)
(eshell-info-banner--with-face (s-repeat length-filled eshell-info-banner-progress-bar-char) (eshell-info-banner--with-face (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
length-filled)
:weight 'bold :weight 'bold
:inherit (eshell-info-banner--get-color-percentage percentage-level)) :inherit (eshell-info-banner--get-color-percentage percentage-level))
(eshell-info-banner--with-face (s-repeat length-empty eshell-info-banner-progress-bar-char) (eshell-info-banner--with-face (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
length-empty)
:weight 'bold :weight 'bold
:inherit 'eshell-info-banner-background-face) :inherit 'eshell-info-banner-background-face)
(eshell-info-banner--with-face "]" :weight 'bold)))) (eshell-info-banner--with-face "]" :weight 'bold))))
@ -649,9 +699,9 @@ critical levels close to 0 rather than 100."
(defun eshell-info-banner--display-battery (text-padding bar-length) (defun eshell-info-banner--display-battery (text-padding bar-length)
"If the computer has a battery, display its level. "If the computer has a battery, display its level.
Pad the left text with dots by `TEXT-PADDING' characters. Pad the left text with dots by TEXT-PADDING characters.
`BAR-LENGTH' indicates the length in characters of the progress BAR-LENGTH indicates the length in characters of the progress
bar. bar.
The usage of `eshell-info-banner-warning-percentage' and The usage of `eshell-info-banner-warning-percentage' and
@ -676,7 +726,9 @@ the warning face with a battery level of 25% or less."
(eshell-info-banner--progress-bar bar-length (eshell-info-banner--progress-bar bar-length
percentage percentage
t) t)
(s-repeat (if (equal eshell-info-banner-file-size-flavor 'iec) 21 17) " ") (eshell-info-banner--string-repeat
" "
(if (equal eshell-info-banner-file-size-flavor 'iec) 21 17))
(format "(%3s%%)\n" (format "(%3s%%)\n"
(eshell-info-banner--with-face (eshell-info-banner--with-face
(number-to-string percentage) (number-to-string percentage)
@ -782,15 +834,17 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
"Get the name of the current macOS or OSX system based on its VERSION." "Get the name of the current macOS or OSX system based on its VERSION."
`(cond `(cond
,@(mapcar (lambda (major) ,@(mapcar (lambda (major)
`((string-match-p (regexp-quote ,(car major)) `((string-match-p ,(car major)
,version) ,version)
,(cdr major))) ,(cdr major)))
eshell-info-banner--macos-versions) eshell-info-banner--macos-versions)
(t "unknown version"))) (t "unknown version")))
(defun eshell-info-banner--get-os-information-darwin () (defun eshell-info-banner--get-os-information-darwin ()
"See `eshell-info-banner--get-os-information'." "See `eshell-info-banner--get-os-information'."
`(,(eshell-info-banner--get-macos-name (s-trim (eshell-info-banner--shell-command-to-string "sw_vers -productVersion"))) `(,(eshell-info-banner--get-macos-name
(s-trim
(eshell-info-banner--shell-command-to-string "sw_vers -productVersion")))
. .
,(s-trim (eshell-info-banner--shell-command-to-string "uname -rs")))) ,(s-trim (eshell-info-banner--shell-command-to-string "uname -rs"))))
@ -841,7 +895,8 @@ build number)."
(bar-length (if (equal eshell-info-banner-file-size-flavor 'iec) (bar-length (if (equal eshell-info-banner-file-size-flavor 'iec)
(- bar-length 4) (- bar-length 4)
bar-length))) bar-length)))
(concat (format "%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char)) (concat (format "%s\n" (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
tot-width))
(format "%s: %s Kernel.: %s\n" (format "%s: %s Kernel.: %s\n"
(s-pad-right left-padding (s-pad-right left-padding
"." "."
@ -855,7 +910,8 @@ build number)."
(eshell-info-banner--display-battery left-padding bar-length) (eshell-info-banner--display-battery left-padding bar-length)
(eshell-info-banner--display-memory left-padding bar-length) (eshell-info-banner--display-memory left-padding bar-length)
(eshell-info-banner--display-partitions left-padding bar-length) (eshell-info-banner--display-partitions left-padding bar-length)
(format "\n%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char))))) (format "\n%s\n" (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
tot-width)))))
;;;###autoload ;;;###autoload
(defun eshell-info-banner-update-banner () (defun eshell-info-banner-update-banner ()