Add new partitions detection method through duf
eshell-info-banner will now default to duf if it is installed and avaliable on the system, otherwise it will default to platform-specific implementation.
This commit is contained in:
		
							parent
							
								
									6a043f6c19
								
							
						
					
					
						commit
						1635241762
					
				
							
								
								
									
										19
									
								
								README.org
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								README.org
									
									
									
									
									
								
							@ -87,7 +87,7 @@ A couple of variables can be edited by the user in order to configure
 | 
			
		||||
- ~eshell-info-banner-critical-percentage~ :: Percentage from which the
 | 
			
		||||
  level should be displayed as critical.
 | 
			
		||||
 | 
			
		||||
  Default value ~90~
 | 
			
		||||
  Default value: ~90~
 | 
			
		||||
- ~eshell-info-banner-tramp-aware~ :: When using Eshell through TRAMP,
 | 
			
		||||
  you can decide whether ~eshell-info-banner~ will display information
 | 
			
		||||
  about the remote system you are connected to or only display
 | 
			
		||||
@ -95,7 +95,22 @@ A couple of variables can be edited by the user in order to configure
 | 
			
		||||
  ~eshell-info-banner-tramp-aware~ to ~t~ to display information on the
 | 
			
		||||
  remote system or to ~nil~ to keep local information only.
 | 
			
		||||
 | 
			
		||||
  Default value ~t~
 | 
			
		||||
  Default value: ~t~
 | 
			
		||||
- ~eshell-info-banner-use-duf~ :: Whether or not to use [[https://github.com/muesli/duf][duf]]. ~duf~ is a
 | 
			
		||||
  better replacement for ~df~ and should be more platform-agnostic than
 | 
			
		||||
  the latter. I also suspect this implementation will be faster than
 | 
			
		||||
  the one with ~df~, since there is very few string manipulation with
 | 
			
		||||
  ~duf~ compared to the implementations with ~df~. However, due to
 | 
			
		||||
  ~shell-command-to-string~, Windows users might want to turn it off by
 | 
			
		||||
  default.
 | 
			
		||||
 | 
			
		||||
  Default value: ~t~ if ~duf~ is found on the system, ~nil~ otherwise
 | 
			
		||||
- ~eshell-info-banner-duf-executable~ :: Path to your ~duf~ executable. If
 | 
			
		||||
  ~duf~ is not found by default by Emacs, you can override
 | 
			
		||||
  ~eshell-info-banner-use-duf~ with ~t~ and specify the path to ~duf~ with
 | 
			
		||||
  this custom variable.
 | 
			
		||||
 | 
			
		||||
  Default value: ~duf~
 | 
			
		||||
 | 
			
		||||
Don’t like the colors used by the package? They should follow by
 | 
			
		||||
default your theme, but you can customize the following faces:
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
;; Author: Lucien Cartier-Tilet <lucien@phundrak.com>
 | 
			
		||||
;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com>
 | 
			
		||||
;; Version: 0.4.4
 | 
			
		||||
;; Version: 0.5.0
 | 
			
		||||
;; Package-Requires: ((emacs "25") (dash "2") (f "0.20") (s "1"))
 | 
			
		||||
;; Homepage: https://labs.phundrak.com/phundrak/eshell-info-banner.el
 | 
			
		||||
 | 
			
		||||
@ -130,6 +130,22 @@
 | 
			
		||||
  :type 'list
 | 
			
		||||
  :version "0.3.0")
 | 
			
		||||
 | 
			
		||||
(defcustom eshell-info-banner-duf-executable "duf"
 | 
			
		||||
  "Path to the `duf' executable."
 | 
			
		||||
  :group 'eshell-info-banner
 | 
			
		||||
  :type 'string
 | 
			
		||||
  :safe #'stringp
 | 
			
		||||
  :version "0.5.0")
 | 
			
		||||
 | 
			
		||||
(defcustom eshell-info-banner-use-duf (if (executable-find eshell-info-banner-duf-executable)
 | 
			
		||||
                                          t
 | 
			
		||||
                                        nil)
 | 
			
		||||
  "If non-nil, use `duf' instead of `df'."
 | 
			
		||||
  :group 'eshell-info-banner
 | 
			
		||||
  :type 'boolean
 | 
			
		||||
  :safe #'booleanp
 | 
			
		||||
  :version "0.5.0")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
			
		||||
                                        ;                Faces                ;
 | 
			
		||||
@ -235,6 +251,36 @@ neither of these, an error will be thrown by the function."
 | 
			
		||||
            (eshell-info-banner--abbr-path (cdr path))))
 | 
			
		||||
   (t (error "Invalid argument %s, neither stringp or listp" path))))
 | 
			
		||||
 | 
			
		||||
(defun eshell-info-banner--get-mounted-partitions/duf ()
 | 
			
		||||
    "Detect mounted partitions on systems supporting `duf'.
 | 
			
		||||
 | 
			
		||||
Return detected partitions as a list of structs. See
 | 
			
		||||
`eshell-info-banner-partition-prefixes' to see how partitions are
 | 
			
		||||
chosen. Relies on the `duf' command.
 | 
			
		||||
 | 
			
		||||
FIXME: filter first partitions, then get other information."
 | 
			
		||||
    (let* ((partitions (json-read-from-string (shell-command-to-string (concat eshell-info-banner-duf-executable
 | 
			
		||||
                                                                               " -json"))))
 | 
			
		||||
           (partitions (cl-remove-if-not (lambda (partition)
 | 
			
		||||
                                           (let ((device (format "%s" (cdr (assoc 'device partition)))))
 | 
			
		||||
                                             (seq-some (lambda (prefix)
 | 
			
		||||
                                                         (string-prefix-p prefix device t))
 | 
			
		||||
                                                       eshell-info-banner-partition-prefixes)))
 | 
			
		||||
                                         (seq-into-sequence partitions))))
 | 
			
		||||
      (mapcar (lambda (partition)
 | 
			
		||||
                (let* ((mount-point (format "%s" (cdr (assoc 'mount_point partition))))
 | 
			
		||||
                       (total       (cdr (assoc 'total partition)))
 | 
			
		||||
                       (used        (cdr (assoc 'used  partition)))
 | 
			
		||||
                       (percent     (/ (* 100 used) total)))
 | 
			
		||||
                  (make-eshell-info-banner--mounted-partitions
 | 
			
		||||
                   :path    (if (> (length mount-point) eshell-info-banner-shorten-path-from)
 | 
			
		||||
                                (eshell-info-banner--abbr-path mount-point t)
 | 
			
		||||
                              mount-point)
 | 
			
		||||
                   :size    (file-size-human-readable total)
 | 
			
		||||
                   :used    (file-size-human-readable used)
 | 
			
		||||
                   :percent percent)))
 | 
			
		||||
              partitions)))
 | 
			
		||||
 | 
			
		||||
(defun eshell-info-banner--get-mounted-partitions/gnu ()
 | 
			
		||||
  "Detect mounted partitions on a Linux system.
 | 
			
		||||
 | 
			
		||||
@ -303,17 +349,19 @@ chosen.  Relies on the `df' command."
 | 
			
		||||
  "Detect mounted partitions on the system.
 | 
			
		||||
 | 
			
		||||
Return detected partitions as a list of structs."
 | 
			
		||||
  (pcase system-type
 | 
			
		||||
    ((or 'gnu 'gnu/linux 'gnu/kfreebsd)
 | 
			
		||||
     (eshell-info-banner--get-mounted-partitions/gnu))
 | 
			
		||||
    ((or 'ms-dos 'windows-nt 'cygwin)
 | 
			
		||||
     (eshell-info-banner--get-mounted-partitions/windows))
 | 
			
		||||
    ('darwin
 | 
			
		||||
     (eshell-info-banner--get-mounted-partitions/darwin))
 | 
			
		||||
    (other
 | 
			
		||||
     (progn
 | 
			
		||||
       (message "Partition detection for %s not yet supported." other)
 | 
			
		||||
       nil))))
 | 
			
		||||
  (if eshell-info-banner-use-duf
 | 
			
		||||
      (eshell-info-banner--get-mounted-partitions/duf)
 | 
			
		||||
    (pcase system-type
 | 
			
		||||
       ((or 'gnu 'gnu/linux 'gnu/kfreebsd)
 | 
			
		||||
        (eshell-info-banner--get-mounted-partitions/gnu))
 | 
			
		||||
       ((or 'ms-dos 'windows-nt 'cygwin)
 | 
			
		||||
        (eshell-info-banner--get-mounted-partitions/windows))
 | 
			
		||||
       ('darwin
 | 
			
		||||
        (eshell-info-banner--get-mounted-partitions/darwin))
 | 
			
		||||
       (other
 | 
			
		||||
        (progn
 | 
			
		||||
         (message "Partition detection for %s not yet supported." other)
 | 
			
		||||
         nil)))))
 | 
			
		||||
 | 
			
		||||
(defun eshell-info-banner--partition-to-string (partition text-padding bar-length)
 | 
			
		||||
  "Display a progress bar showing how full a `PARTITION' is.
 | 
			
		||||
@ -328,7 +376,7 @@ For TEXT-PADDING and BAR-LENGTH, see the documentation of
 | 
			
		||||
                          :weight 'bold))
 | 
			
		||||
            ": "
 | 
			
		||||
            (eshell-info-banner--progress-bar bar-length percentage)
 | 
			
		||||
            (format " %6s / %-5s (%3s%%)"
 | 
			
		||||
            (format " %6s / %-6s (%3s%%)"
 | 
			
		||||
                    (eshell-info-banner--mounted-partitions-used partition)
 | 
			
		||||
                    (eshell-info-banner--mounted-partitions-size partition)
 | 
			
		||||
                    (eshell-info-banner--with-face
 | 
			
		||||
@ -436,7 +484,7 @@ displayed."
 | 
			
		||||
    (concat (s-pad-right text-padding "." type)
 | 
			
		||||
            ": "
 | 
			
		||||
            (eshell-info-banner--progress-bar bar-length percentage)
 | 
			
		||||
            (format " %6s / %-5s (%3s%%)"
 | 
			
		||||
            (format " %6s / %-6s (%3s%%)"
 | 
			
		||||
                    (file-size-human-readable used)
 | 
			
		||||
                    (file-size-human-readable total)
 | 
			
		||||
                    (eshell-info-banner--with-face
 | 
			
		||||
@ -532,7 +580,7 @@ the warning face with a battery level of 25% or less."
 | 
			
		||||
                (eshell-info-banner--progress-bar bar-length
 | 
			
		||||
                                                  percentage
 | 
			
		||||
                                                  t)
 | 
			
		||||
                (s-repeat 16 " ")
 | 
			
		||||
                (s-repeat 17 " ")
 | 
			
		||||
                (format "(%3s%%)\n"
 | 
			
		||||
                        (eshell-info-banner--with-face
 | 
			
		||||
                         (number-to-string percentage)
 | 
			
		||||
@ -593,23 +641,23 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
 | 
			
		||||
  "See `eshell-info-banner--get-os-information'."
 | 
			
		||||
  (let ((prefix (if eshell-info-banner-tramp-aware (file-remote-p default-directory) "")))
 | 
			
		||||
    `(,(cond
 | 
			
		||||
      ((executable-find "hostnamectl" eshell-info-banner-tramp-aware)
 | 
			
		||||
       (eshell-info-banner--get-os-information-from-hostnamectl))
 | 
			
		||||
      ((executable-find "lsb_release" eshell-info-banner-tramp-aware)
 | 
			
		||||
       (eshell-info-banner--get-os-information-from-lsb-release))
 | 
			
		||||
      ((file-exists-p (concat prefix "/etc/os-release"))
 | 
			
		||||
       (eshell-info-banner--get-os-information-from-release-file))
 | 
			
		||||
      ((executable-find "shepherd")
 | 
			
		||||
       (let ((distro (car (s-lines (shell-command-to-string "guix -V")))))
 | 
			
		||||
         (save-match-data
 | 
			
		||||
           (string-match "\\([0-9\\.]+\\)" distro)
 | 
			
		||||
           (concat "Guix System "
 | 
			
		||||
                   (substring-no-properties distro
 | 
			
		||||
                                            (match-beginning 1)
 | 
			
		||||
                                            (match-end 1))))))
 | 
			
		||||
      (t "Unknown"))
 | 
			
		||||
    .
 | 
			
		||||
    ,(s-trim (shell-command-to-string "uname -rs")))))
 | 
			
		||||
        ((executable-find "hostnamectl" eshell-info-banner-tramp-aware)
 | 
			
		||||
         (eshell-info-banner--get-os-information-from-hostnamectl))
 | 
			
		||||
        ((executable-find "lsb_release" eshell-info-banner-tramp-aware)
 | 
			
		||||
         (eshell-info-banner--get-os-information-from-lsb-release))
 | 
			
		||||
        ((file-exists-p (concat prefix "/etc/os-release"))
 | 
			
		||||
         (eshell-info-banner--get-os-information-from-release-file))
 | 
			
		||||
        ((executable-find "shepherd")
 | 
			
		||||
         (let ((distro (car (s-lines (shell-command-to-string "guix -V")))))
 | 
			
		||||
           (save-match-data
 | 
			
		||||
             (string-match "\\([0-9\\.]+\\)" distro)
 | 
			
		||||
             (concat "Guix System "
 | 
			
		||||
                     (substring-no-properties distro
 | 
			
		||||
                                              (match-beginning 1)
 | 
			
		||||
                                              (match-end 1))))))
 | 
			
		||||
        (t "Unknown"))
 | 
			
		||||
      .
 | 
			
		||||
      ,(s-trim (shell-command-to-string "uname -rs")))))
 | 
			
		||||
 | 
			
		||||
(defmacro eshell-info-banner--get-macos-name (version)
 | 
			
		||||
  "Get the name of the current macOS or OSX system based on its VERSION."
 | 
			
		||||
@ -667,7 +715,7 @@ build number)."
 | 
			
		||||
                             eshell-info-banner-width))
 | 
			
		||||
         (middle-padding (- tot-width right-text left-padding 4))
 | 
			
		||||
 | 
			
		||||
         (bar-length    (- tot-width left-padding 4 22)))
 | 
			
		||||
         (bar-length    (- tot-width left-padding 4 23)))
 | 
			
		||||
    (concat (format "%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char))
 | 
			
		||||
            (format "%s: %s Kernel.: %s\n"
 | 
			
		||||
                    (s-pad-right left-padding
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user