Windows & Cygwin support

This commit is contained in:
q3aql 2022-07-05 16:52:12 +02:00
parent a906ff8968
commit 52d742e768

168
pfetch
View File

@ -2,6 +2,8 @@
# #
# pfetch - Simple POSIX sh fetch script. # pfetch - Simple POSIX sh fetch script.
#PF_ASCII="arch"
# Wrapper around all escape sequences used by pfetch to allow for # Wrapper around all escape sequences used by pfetch to allow for
# greater control over which sequences are used (if any at all). # greater control over which sequences are used (if any at all).
esc() { esc() {
@ -292,7 +294,23 @@ get_os() {
distro="$distro on Windows 10 [WSL1]" distro="$distro on Windows 10 [WSL1]"
fi fi
;; ;;
(MSYS*|MINGW*)
# Grab everything after the first instance of
# white-space in the command output of 'wmic'.
#
# The format of 'wmic' is as follows:
# Caption=Microsoft Windows 7 Enterprise
#
# This extracts: ^^^^^^^^^^^^^^^^^^^^
read -r _ distro <<-EOF
$(wmic os get Caption | head -n 2 | tail -n +2)
EOF
;;
(CYGWIN*)
# Save Cygwin ouput for OS using uname.
#
distro="$(uname -o)"
;;
(Darwin*) (Darwin*)
# Parse the SystemVersion.plist file to grab the macOS # Parse the SystemVersion.plist file to grab the macOS
# version. The file is in the following format: # version. The file is in the following format:
@ -388,7 +406,13 @@ get_os() {
(*) (*)
# Catch all to ensure '$distro' is never blank. # Catch all to ensure '$distro' is never blank.
# This also handles the BSDs. # This also handles the BSDs.
distro="$os $kernel" #distro="$os $kernel"
distro="$os"
distro_cygwin=$(echo $os | grep CYGWIN_)
if [ ! -z "${distro_cygwin}" ] ; then
distro=$(uname -o)
fi
;; ;;
esac esac
} }
@ -400,6 +424,13 @@ get_kernel() {
(*BSD*|Haiku|Minix) (*BSD*|Haiku|Minix)
return return
;; ;;
# Use wmic to get the OS version
(MSYS*|MINGW*)
kernel=$(wmic os get Version)
kernel=$(echo $kernel | awk '{print $3}')
;;
(CYGWIN*)
kernel=$(uname -r)
esac esac
# '$kernel' is the cached output of 'uname -r'. # '$kernel' is the cached output of 'uname -r'.
@ -435,6 +466,15 @@ get_host() {
(*BSD* | Minix) (*BSD* | Minix)
host=$(sysctl -n hw.vendor hw.product) host=$(sysctl -n hw.vendor hw.product)
;; ;;
(MSYS*|MINGW*)
host=$(wmic computersystem get model \
| tail -n +2 \
| sed 's/.*=//g'
)
;;
(CYGWIN*)
host=$(uname -n)
;;
esac esac
# Turn the host string into an argument list so we can iterate # Turn the host string into an argument list so we can iterate
@ -485,7 +525,7 @@ get_uptime() {
# converting that data into days, hours and minutes using simple # converting that data into days, hours and minutes using simple
# math. # math.
case $os in case $os in
(Linux* | Minix* | SerenityOS*) (Linux* | Minix* | SerenityOS*| CYGWIN* | MSYS* | MINGW*)
IFS=. read -r s _ < /proc/uptime IFS=. read -r s _ < /proc/uptime
;; ;;
@ -564,7 +604,7 @@ get_pkgs() {
# managers are installed. # managers are installed.
packages=$( packages=$(
case $os in case $os in
(Linux*) (Linux*|MINGW*)
# Commands which print packages one per line. # Commands which print packages one per line.
has bonsai && bonsai list has bonsai && bonsai list
has crux && pkginfo -i has crux && pkginfo -i
@ -575,6 +615,7 @@ get_pkgs() {
has apk && apk info has apk && apk info
has guix && guix package --list-installed has guix && guix package --list-installed
has opkg && opkg list-installed has opkg && opkg list-installed
has scoop && scoop list
# Directories containing packages. # Directories containing packages.
has kiss && printf '%s\n' /var/db/kiss/installed/*/ has kiss && printf '%s\n' /var/db/kiss/installed/*/
@ -591,6 +632,16 @@ get_pkgs() {
} }
;; ;;
(CYGWIN*)
cygcheck -cd
;;
(MSYS*)
pacman -Qq
;;
(Darwin*) (Darwin*)
# Commands which print packages one per line. # Commands which print packages one per line.
has pkgin && pkgin list has pkgin && pkgin list
@ -633,6 +684,7 @@ get_pkgs() {
(NetBSD*) (NetBSD*)
pkg_info pkg_info
;; ;;
(Haiku) (Haiku)
printf '%s\n' /boot/system/package-links/* printf '%s\n' /boot/system/package-links/*
@ -678,7 +730,7 @@ get_pkgs() {
# which needs to be stripped. # which needs to be stripped.
(OpenBSD) (OpenBSD)
packages=$((packages)) packages=$((packages))
;; ;;
esac esac
case $packages in case $packages in
@ -693,7 +745,7 @@ get_memory() {
# Used memory is calculated using the following "formula": # Used memory is calculated using the following "formula":
# MemUsed = MemTotal + Shmem - MemFree - Buffers - Cached - SReclaimable # MemUsed = MemTotal + Shmem - MemFree - Buffers - Cached - SReclaimable
# Source: https://github.com/KittyKatt/screenFetch/issues/386 # Source: https://github.com/KittyKatt/screenFetch/issues/386
(Linux*) (Linux*|CYGWIN*|MSYS*|MINGW*)
# Parse the '/proc/meminfo' file splitting on ':' and 'k'. # Parse the '/proc/meminfo' file splitting on ':' and 'k'.
# The format of the file is 'key: 000kB' and an additional # The format of the file is 'key: 000kB' and an additional
# split is used on 'k' to filter out 'kB'. # split is used on 'k' to filter out 'kB'.
@ -939,10 +991,81 @@ get_memory() {
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6 log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
} }
get_disk() {
# Store the version of the 'df' command as the available
# flags, options and implementation differs between operating
# systems and we need to handle these edge-cases.
df_version=$(df --version 2>&1)
case $df_version in
# The 'df' command is from AIX.
*IMitv*)
set -- -P -g
;;
# The 'df' command is from IRIX.
*befhikm*)
set -- -P -k
;;
# The 'df' command is from OpenBSD.
*hiklnP*)
set -- -h
;;
# The 'df' command is from Haiku and is wildly
# different and provides no workable output,
# end here.
*Tracker*) # Haiku
return
;;
# From testing it is saffe to assume that
# any other 'df' version provides these flags.
*)
set -- -P -h
;;
esac
# Read the output of 'df' line by line. The first line
# contains header information for the "table" so it is
# skipped.
#
# The next lines are then split to grab the relevant
# information and thankfully the output remains the
# same between all but one 'df' implementation.
#
# TODO: Configure disks to send to 'df'. Do we need to
# do this? I'd love to _not_ do it.
df "$@" / | while read -r name full used _ perc _; do
[ "$header" ] || { header=1; continue; }
case $df_version in
# The 'df' command is from IRIX.
*befhikm*)
used=$((used/1024/1024))G
full=$((full/1024/1024))G
;;
esac
#
# probably a better way to do this, but a simple fixs
case $os in
CYGWIN*|MSYS*|MINGW*)
windisk=$(df -h | tail -n +2 | awk 'NR==1{print $4" / "$3,"("$6")"}')
log disk "$windisk" >&6
;;
*)
log disk "$used / $full ($perc)" >&6
;;
esac
done
}
get_wm() { get_wm() {
case $os in case $os in
(Darwin*) (Darwin*|CYGWIN*|MSYS*|MINGW*)
# Don't display window manager on macOS. # Don't display window manager on macOS and Windows.
;; ;;
(*) (*)
@ -1257,6 +1380,32 @@ get_ascii() {
${c5} .//. ${c5} .//.
EOF EOF
;; ;;
(MSYS*|MINGW*)
read_ascii 4 <<-EOF
${c4}
${c4} ###### ######
${c4} ###### ######
${c4} ###### ######
${c4}
${c4} ###### ######
${c4} ###### ######
${c4} ###### ######
EOF
;;
(CYGWIN*)
read_ascii 4 <<-EOF
${c4} __________
${c4} / \\
${c4} | ________/
${c4} | |${c2} ________
${c4} | |${c2} \______/
${c4} | |________
${c4} \\ \\
${c4} \\_________/
EOF
;;
([Dd]ahlia*) ([Dd]ahlia*)
read_ascii 1 <<-EOF read_ascii 1 <<-EOF
@ -1824,7 +1973,7 @@ get_ascii() {
# This ensures that any variables defined in the while loop # This ensures that any variables defined in the while loop
# are still accessible in the script. # are still accessible in the script.
done <<-EOF done <<-EOF
$(printf %s "$ascii" | sed 's/\[3.m//g') $(printf %s "$ascii" | awk '{gsub("\\[3.m","");print}')
EOF EOF
# Add a gap between the ascii art and the information. # Add a gap between the ascii art and the information.
@ -1915,7 +2064,6 @@ EOF
# contents of 'PF_INFO'. # contents of 'PF_INFO'.
set -f set -f
set +f -- ${PF_INFO-ascii title os host kernel uptime pkgs memory} set +f -- ${PF_INFO-ascii title os host kernel uptime pkgs memory}
# Iterate over the info functions to determine the lengths of the # Iterate over the info functions to determine the lengths of the
# "info names" for output alignment. The option names and subtitles # "info names" for output alignment. The option names and subtitles
# match 1:1 so this is thankfully simple. # match 1:1 so this is thankfully simple.