Merge branch 'hykilpikonna:master' into master

This commit is contained in:
Harvey 2024-05-13 10:41:09 -05:00 committed by GitHub
commit 22c8d76193
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 691 additions and 110 deletions

1
.gitignore vendored
View file

@ -120,3 +120,4 @@ webhook-log
start_moderation.sh
gh_moderator.toml
moderator-data
hyfetch/git

View file

@ -10,7 +10,7 @@ This repo also serves as an updated version of the original `neofetch` since the
* Method 1: `pip install -U hyfetch` then run `neowofetch`
* Method 2: `npx neowofetch`
* Method 3: `P="$HOME/.local/bin/neowofetch" curl -L nf.hydev.org -o $P && chmod +x $P`
* Method 3: `P="$HOME/.local/bin/neowofetch" && curl -L nf.hydev.org -o "$P" && chmod +x "$P"`
* Method 4: Run without install `bash <(curl -sL nf.hydev.org)`
@ -32,6 +32,7 @@ Currently, these distributions have existing packages for HyFetch:
* Universal [Lure.sh](https://lure.sh/): `lure in hyfetch` (Thanks to [@Elara6331](https://github.com/Elara6331))
* Arch Linux: `sudo pacman -S hyfetch` (Thanks to [@Aleksana](https://github.com/Aleksanaa) and [@Antiz96](https://github.com/Antiz96))
* Fedora Linux: `sudo dnf install hyfetch` (packaged by [@topazus](http://github.com/topazus))
* Nix: `nix-env -i hyfetch` (Thanks to [@YisuiDenghua](https://github.com/YisuiDenghua))
* Nix Profile: `nix profile install nixpkgs#hyfetch`
* Guix: `guix install hyfetch` (Thanks to [@WammKD](https://github.com/WammKD))
@ -39,7 +40,7 @@ Currently, these distributions have existing packages for HyFetch:
* Homebrew: `brew install hyfetch` (Thanks to [@BKasin](https://github.com/BKasin) and [@osalbahr](https://github.com/osalbahr))
* openSUSE Tumbleweed: `zypper in python311-hyfetch` (Thanks to [@BKasin](https://github.com/BKasin))
* Gentoo: `emerge --ask app-misc/hyfetch` (Thanks to [@BKasin](https://github.com/BKasin))
* Debian `apt install hyfetch` (for Debian flavor >= [Trixie](https://packages.debian.org/trixie/hyfetch))
* Debian and Ubuntu `apt install hyfetch` (for Debian flavor >= [Trixie](https://packages.debian.org/trixie/hyfetch), Ubuntu flavor >= [Noble](https://packages.ubuntu.com/noble/hyfetch)) (Thanks to [@BKasin](https://github.com/BKasin))
[![Packaging status](https://repology.org/badge/vertical-allrepos/hyfetch.svg?columns=4&exclude_unsupported=1)](https://repology.org/project/hyfetch/versions)

View file

@ -327,7 +327,7 @@ Container Linux by CoreOS, CRUX, Crystal Linux, Cucumber,
CutefishOS, CuteOS, CyberOS, dahlia, DarkOs, Darwin, Debian, Deepin,
DesaOS, Devuan, DietPi, digital UNIX, DracOS, DragonFly, Drauger,
Droidian, Elementary, Elive, EncryptOS, EndeavourOS, Endless, Enso,
EuroLinux, EvolutionOS, Exherbo, Exodia Predator OS, Fedora,
EuroLinux, EvolutionOS, eweOS, Exherbo, Exodia Predator OS, Fedora,
FemboyOS, Feren, Finnix, Floflis, FreeBSD, FreeMiNT, Frugalware,
Funtoo, GalliumOS, Garuda, Gentoo, GhostBSD, glaucus, gNewSense,
GNOME, GNU, GoboLinux, GrapheneOS, Grombyang, Guix, Haiku, HamoniKR,

View file

@ -1 +1 @@
VERSION = '1.4.11'
VERSION = '1.5.0alpha1'

View file

@ -31,6 +31,7 @@ IS_WINDOWS = platform.system() == 'Windows'
CACHE_PATH = Path(os.getenv("LOCALAPPDATA") or os.getenv("XDG_CACHE_HOME") or Path.home() / '.cache') / 'hyfetch'
@dataclass
class GlobalConfig:
# Global color mode default to 8-bit for compatibility
@ -49,6 +50,4 @@ class GlobalConfig:
return 0.65 if term.lower() == 'dark' else 0.4
GLOBAL_CFG = GlobalConfig(color_mode='8bit', override_distro=None, debug=False, is_light=False, use_overlay=False)
GIT_URL = 'https://github.com/git-for-windows/git/releases/download/v2.37.2.windows.2/Git-2.37.2.2-32-bit.tar.bz2'
GLOBAL_CFG = GlobalConfig(color_mode='8bit', override_distro=None, debug=False, is_light=False, use_overlay=True)

View file

@ -7,23 +7,21 @@ import shlex
import shutil
import subprocess
import sys
import tarfile
from dataclasses import dataclass
from pathlib import Path
from subprocess import check_output
from tempfile import TemporaryDirectory
from typing import Iterable
import pkg_resources
from .color_util import color, printc
from .constants import GLOBAL_CFG, GIT_URL, IS_WINDOWS
from .constants import GLOBAL_CFG, IS_WINDOWS
from .distros import distro_detector
from .presets import ColorProfile
from .serializer import from_dict
from .types import BackendLiteral, ColorAlignMode
RE_NEOFETCH_COLOR = re.compile('\\${c[0-9]}')
SRC = Path(__file__).parent
def literal_input(prompt: str, options: Iterable[str], default: str, show_ops: bool = True) -> str:
@ -197,24 +195,13 @@ def get_command_path() -> str:
:return: Command path
"""
cmd_path = pkg_resources.resource_filename(__name__, 'scripts/neowofetch')
cmd_path = (if_file(SRC.parent / 'neofetch') or if_file(SRC / 'scripts/neowofetch'))
# Windows doesn't support symbolic links, but also I can't detect symbolic links... hard-code it here for now.
if IS_WINDOWS:
pkg = Path(__file__).parent
pth = (shutil.which("neowofetch") or
if_file(cmd_path) or
if_file(pkg / 'scripts/neowofetch') or
if_file(pkg.parent / 'neofetch') or
if_file(Path(cmd_path).parent.parent.parent / 'neofetch'))
if not cmd_path:
printc("&cError: Neofetch script cannot be found")
exit(127)
if not pth:
printc("&cError: Neofetch script cannot be found")
exit(127)
return str(pth)
return cmd_path
return str(cmd_path)
def ensure_git_bash() -> Path:
@ -223,48 +210,19 @@ def ensure_git_bash() -> Path:
:returns git bash path
"""
if IS_WINDOWS:
# Find installation in default path
def_path = Path(r'C:\Program Files\Git\bin\bash.exe')
if def_path.is_file():
return def_path
if not IS_WINDOWS:
return Path('/usr/bin/bash')
# Detect third-party git.exe in path
git_exe = shutil.which("bash") or shutil.which("git.exe") or shutil.which("git")
if git_exe is not None:
pth = Path(git_exe).parent
if (pth / r'bash.exe').is_file():
return pth / r'bash.exe'
elif (pth / r'bin\bash.exe').is_file():
return pth / r'bin\bash.exe'
# Bundled git bash
git_path = (if_file(SRC / 'git/bin/bash.exe')
or if_file("C:/Program Files/Git/bin/bash.exe")
or if_file("C:/Program Files (x86)/Git/bin/bash.exe"))
# Find installation in PATH (C:\Program Files\Git\cmd should be in path)
pth = (os.environ.get('PATH') or '').lower().split(';')
pth = [p for p in pth if p.endswith(r'\git\cmd')]
if pth:
return Path(pth[0]).parent / r'bin\bash.exe'
if not git_path.is_file():
printc("&cError: Git Bash installation not found")
sys.exit(127)
# Previously downloaded portable installation
path = Path(__file__).parent / 'min_git'
portable_bash_exe = path / r'bin\bash.exe'
if path.is_dir() and portable_bash_exe.is_file():
return portable_bash_exe
# No installation found, download a portable installation
Path.mkdir(path, parents=True, exist_ok=True)
pkg_path = path / 'package.tbz'
print('Git installation not found. Git Bash is required to use HyFetch/neofetch on Windows')
if literal_input('Would you like to download and install Git into HyFetch package directory? (if no is selected colors almost certainly won\'t work)', ['yes', 'no'], 'yes', False) == 'yes':
print('Downloading a portable version of Git...')
from urllib.request import urlretrieve
urlretrieve(GIT_URL, pkg_path)
print('Download finished! Extracting...')
with tarfile.open(pkg_path, 'r:bz2') as tbz_ref:
tbz_ref.extractall(path)
print('Done!')
return portable_bash_exe
else:
sys.exit()
return git_path
def check_windows_cmd():
@ -272,14 +230,14 @@ def check_windows_cmd():
Check if this script is running under cmd.exe. If so, launch an external window with git bash
since cmd doesn't support RGB colors.
"""
if IS_WINDOWS:
import psutil
# TODO: This line does not correctly identify cmd prompts...
if psutil.Process(os.getppid()).name().lower().strip() == 'cmd.exe':
print("cmd.exe doesn't support RGB colors, restarting in MinTTY...")
cmd = f'"{ensure_git_bash().parent.parent / "usr/bin/mintty.exe"}" -s 110,40 -e python -m hyfetch --ask-exit'
os.system(cmd)
sys.exit(0)
# if IS_WINDOWS:
# import psutil
# # TODO: This line does not correctly identify cmd prompts...
# if psutil.Process(os.getppid()).name().lower().strip() == 'cmd.exe':
# print("cmd.exe doesn't support RGB colors, restarting in MinTTY...")
# cmd = f'"{ensure_git_bash().parent.parent / "usr/bin/mintty.exe"}" -s 110,40 -e python -m hyfetch --ask-exit'
# os.system(cmd)
# sys.exit(0)
def run_neofetch_cmd(args: str, pipe: bool = False) -> str | None:
@ -293,8 +251,7 @@ def run_neofetch_cmd(args: str, pipe: bool = False) -> str | None:
cmd = get_command_path().replace("\\", "/").replace("C:/", "/c/")
args = args.replace('\\', '/').replace('C:/', '/c/')
full_cmd = [ensure_git_bash(), '-c', f"'{cmd}' {args}"]
# print(full_cmd)
full_cmd = [ensure_git_bash(), cmd, *shlex.split(args)]
if pipe:
return check_output(full_cmd).decode().strip()
@ -353,10 +310,10 @@ def run(asc: str, backend: BackendLiteral, args: str = ''):
def run_qwqfetch(asc: str, args: str = ''):
"""
Run neofetch with colors
Run qwqfetch with colors
:param preset: Color palette
:param alignment: Color alignment settings
:param asc: Ascii art
:param args: Additional arguments to pass to qwqfetch
"""
asc = asc.replace('\\', '\\\\')
@ -369,7 +326,8 @@ def run_qwqfetch(asc: str, args: str = ''):
except ImportError as e: # module not found etc
print("qwqfetch is not installed. Install it by executing:") # use print to output hint directly
print("pip install git+https://github.com/nexplorer-3e/qwqfetch") # TODO: public repo
raise e
exit(127)
def run_neofetch(asc: str, args: str = ''):
"""
@ -401,6 +359,16 @@ def run_fastfetch(asc: str, args: str = '', legacy: bool = False):
:param args: Additional arguments to pass to fastfetch
:param legacy: Set true when using fastfetch < 1.8.0
"""
# Find fastfetch binary
ff_path = (shutil.which('fastfetch')
or if_file(SRC / 'fastfetch/usr/bin/fastfetch')
or if_file(SRC / 'fastfetch/fastfetch')
or if_file(SRC / 'fastfetch/fastfetch.exe'))
if not ff_path:
printc("&cError: fastfetch binary is not found. Please install fastfetch first.")
exit(127)
# Write temp file
with TemporaryDirectory() as tmp_dir:
tmp_dir = Path(tmp_dir)
@ -408,7 +376,7 @@ def run_fastfetch(asc: str, args: str = '', legacy: bool = False):
path.write_text(asc)
# Call fastfetch with the temp file
proc = subprocess.run(['fastfetch', '--raw' if legacy else '--file-raw', path.absolute(), *shlex.split(args)])
proc = subprocess.run([ff_path, '--raw' if legacy else '--file-raw', path.absolute(), *shlex.split(args)])
if proc.returncode == 144:
printc("&6Error code 144 detected: Please upgrade fastfetch to >=1.8.0 or use the 'fastfetch-old' backend")

View file

@ -519,6 +519,27 @@ PRESETS: dict[str, ColorProfile] = {
'#5276D4',
]).with_weights([1, 1, 1, 1, 1, 5, 5, 5])),
# sourced from https://commons.wikimedia.org/wiki/File:Girlflux_Pride_Flag.jpg
"girlflux": ColorProfile([
"f9e6d7",
"f2526c",
"bf0311",
"e9c587",
"bf0311",
"f2526c",
"f9e6d7",
]),
# sourced from https://www.deviantart.com/pride-flags/art/Genderflux-1-543925589
"genderflux": ColorProfile([
"f47694",
"f2a2b9",
"cecece",
"7ce0f7",
"3ecdf9",
"fff48d",
]),
"finsexual": ColorProfile([
"#B18EDF",
"#D7B1E2",
@ -649,6 +670,14 @@ PRESETS: dict[str, ColorProfile] = {
"#89C7B0",
"#F3EDBD",
]),
# sampled from https://es.m.wikipedia.org/wiki/Archivo:Fraysexual_flag.jpg
'fraysexual': ColorProfile([
'#226CB5',
'#94E7DD',
'#FFFFFF',
'#636363',
]),
# Meme flags
'beiyang': ColorProfile([

133
neofetch
View file

@ -235,6 +235,15 @@ package_managers="on"
# off: '17 packages (flatpak)'
package_separate="on"
# Reduce output of packages list by not showing programming language package managers or Steam games
#
# Flag: --package_minimal
#
# Example:
# default: 'Packages: 1 (npm), 991 (emerge), 3 (steam), 23 (flatpak-system)'
# minimal: 'Packages: 991 (emerge), 23 (flatpak-system)'
package_minimal=""
# Shell
@ -865,7 +874,7 @@ image_source="auto"
# Chrom, Cleanjaro, Clear Linux OS, ClearOS, Clover, Cobalt, Condres, Container Linux by CoreOS,
# CRUX, Crystal Linux, Cucumber, CutefishOS, CuteOS, CyberOS, dahlia, DarkOs, Darwin, Debian,
# Deepin, DesaOS, Devuan, DietPi, digital UNIX, DracOS, DragonFly, Drauger, Droidian, Elementary,
# Elive, EncryptOS, EndeavourOS, Endless, Enso, EuroLinux, EvolutionOS, Exherbo, Exodia Predator OS,
# Elive, EncryptOS, EndeavourOS, Endless, Enso, EuroLinux, EvolutionOS, eweOS, Exherbo, Exodia Predator OS,
# Fedora, FemboyOS, Feren, Finnix, Floflis, FreeBSD, FreeMiNT, Frugalware, Funtoo, GalliumOS,
# Garuda, Gentoo, GhostBSD, glaucus, gNewSense, GNOME, GNU, GoboLinux, GrapheneOS, Grombyang, Guix,
# Haiku, HamoniKR, HarDClanZ, Hash, Huayra, Hybrid, HydroOS, Hyperbola, iglunix, instantOS, Interix,
@ -1188,7 +1197,7 @@ get_distro() {
elif type -p lsb_release >/dev/null; then
# Debian does not include .x versions in /etc/os-version, but does in debian_version
# So if that file exists, and we are not *buntu, build name from there
if [[ -f /etc/debian_version ]] && [[ $(lsb_release -si) != *"buntu"* ]]; then
if [[ -f /etc/debian_version ]] && [[ $(lsb_release -si) != *"buntu"* ]] && [[ $(lsb_release -si) != *"neon"* ]]; then
. /etc/os-release
case $distro_shorthand in
on) distro="${NAME}" ;;
@ -1589,8 +1598,8 @@ get_model() {
case $model in
Mac14,15): "MacBook Air (15-inch, M2, 2023)" ;;
Mac14,14): "Mac Studio (M2 Max, 2023)" ;;
Mac14,13): "Mac Studio (M2 Ultra, 2023)" ;;
Mac14,14): "Mac Studio (M2 Ultra, 2023)" ;;
Mac14,13): "Mac Studio (M2 Max, 2023)" ;;
Mac14,8): "Mac Pro (2023)" ;;
Mac14,6 | Mac14,10): "MacBook Pro (16-inch, 2023)" ;;
Mac14,5 | Mac14,9): "MacBook Pro (14-inch, 2023)" ;;
@ -2066,11 +2075,38 @@ get_packages() {
}
}
# OS-independent package managers.
has pipx && tot pipx list --short
has cargo && _cargopkgs="$(cargo install --list | grep -v '^ ')" && tot echo "$_cargopkgs"
has npm && pkgs_h=1 tot npm list -g --depth=0
has am && pac "$(am -f | grep 'PROGRAMS MANAGED BY' | cut -d' ' -f4)"a
# Programming language package managers.
if [[ -z "$package_minimal" ]]; then
has pipx && tot pipx list --short
has cargo && _cargopkgs="$(cargo install --list | grep -v '^ ')" && tot echo "$_cargopkgs"
# Special case for npm: If has npm, we should list folders under node_modules instead of using npm list.
# This is because npm list is very slow (2s)
if has npm; then
# Try to apply heuristics to find the global directory.
if [[ -d /usr/lib/node_modules ]]; then
dir /usr/lib/node_modules/*/
elif [[ -d /usr/local/lib/node_modules ]]; then
dir /usr/local/lib/node_modules/*/
else
# If neither exist, use npm root -g to get the global directory.
# (still ~10x faster than npm list)
npm_global=$(npm root -g)
[[ -d $npm_global ]] && dir "$npm_global"/*/
# This may not work in WSL2 (if npm is installed on Windows, not WSL).
# However, if npm is not installed on this WSL subsystem, it doesn't really count
# as a package manager for this subsystem, so let's ignore this case.
fi
fi
fi
if has pkgx && [[ -d "$HOME/.local/bin" ]]; then
# https://github.com/pkgxdev/pkgx/issues/985#issuecomment-2080999008
_pkgxpkgs="$(grep -rIhoP 'exec pkgx \+\K[^ ]+' "$HOME/.local/bin" | sort -u)"
tot echo "$_pkgxpkgs"
unset _pkgxpkgs
fi
# OS-specific package managers.
case $os in
@ -2100,8 +2136,8 @@ get_packages() {
has pm && tot-safe pm list packages
has evox && tot cat /var/evox/packages/DB
has squirrel && tot ls /var/packages
has pkgx && tot find "$HOME/.pkgx" -maxdepth 2 -mindepth 2 -type d
has anise && tot anise s --installed
has am && pac "$(am -f --less)"
# Using the dnf package cache is much faster than rpm.
if has dnf && type -p sqlite3 >/dev/null && [[ -f /var/cache/dnf/packages.db ]]; then
@ -2136,19 +2172,30 @@ get_packages() {
shopt -u nullglob
}
# Steam games
STEAM_P=".local/share/Steam/steamapps/common"
if [[ -d "$HOME/$STEAM_P" ]]; then
manager=steam && dir "$HOME/$STEAM_P/*/"
elif [[ -d "$HOME/.var/app/com.valvesoftware.Steam/$STEAM_P" ]]; then
manager=steam && dir "$HOME/.var/app/com.valvesoftware.Steam/$STEAM_P/*/"
elif [[ -d "$HOME/.steam/steam/steamapps/common" ]]; then
manager=steam && dir "$HOME/.steam/steam/steamapps/common/*/"
if [[ -z "$package_minimal" ]]; then
# Steam games
STEAM_P=".local/share/Steam/steamapps/common"
if [[ -d "$HOME/$STEAM_P" ]]; then
manager=steam && dir "$HOME/$STEAM_P/*/"
elif [[ -d "$HOME/.var/app/com.valvesoftware.Steam/$STEAM_P" ]]; then
manager=steam && dir "$HOME/.var/app/com.valvesoftware.Steam/$STEAM_P/*/"
elif [[ -d "$HOME/.steam/steam/steamapps/common" ]]; then
manager=steam && dir "$HOME/.steam/steam/steamapps/common/*/"
fi
fi
# Other (Needs complex command)
has kpm-pkg && ((packages+=$(kpm --get-selections | grep -cv deinstall$)))
nix-user-pkgs() {
if [ -d ~/.nix-profile ]; then
nix-store -qR ~/.nix-profile
elif [ -d "$XDG_STATE_HOME/nix/profile" ]; then
nix-store -qR "$XDG_STATE_HOME/nix/profile"
fi
nix-store -qR /etc/profiles/per-user/"$USER"
}
# Separate system and user packages
if [[ $package_separate == on ]]; then
has guix && {
@ -2158,10 +2205,6 @@ get_packages() {
}
has nix-store && {
nix-user-pkgs() {
nix-store -qR ~/.nix-profile
nix-store -qR /etc/profiles/per-user/"$USER"
}
manager=nix-system && tot nix-store -qR /run/current-system/sw
manager=nix-user && tot nix-user-pkgs
manager=nix-default && tot nix-store -qR /nix/var/nix/profiles/default
@ -2183,8 +2226,7 @@ get_packages() {
has nix-store && {
nix-all() {
nix-store -qR ~/.nix-profile
nix-store -qR /etc/profiles/per-user/"$USER"
nix-user-pkgs
nix-store -qR /run/current-system/sw
nix-store -qR /nix/var/nix/profiles/default
}
@ -2239,7 +2281,6 @@ get_packages() {
has brew && dir "$(brew --cellar)/* $(brew --caskroom)/*"
has pkgin && tot pkgin list
has dpkg && tot dpkg-query -f '.\n' -W
has tea && tot find "$HOME/.tea" -maxdepth 2 -mindepth 2 -type d
has nix-store && {
nix-user-pkgs() {
@ -2375,7 +2416,7 @@ get_editor() {
[[ -z "$editor_full_path" ]] && return
# Actually obtain the full path
editor_full_path="$(which "${editor_full_path}" 2>/dev/null)"
editor_full_path="$(command -v "${editor_full_path}" 2>/dev/null)"
# Resolve symlink and get the original name
[[ -L "$editor_full_path" ]] && editor_full_path="$(readlink -f "$editor_full_path")"
@ -2390,7 +2431,7 @@ get_editor() {
# Obtain editor version
case ${editor_name:=${editor_full_path##*/}} in
nano|vim|micro|emacs)
nano|vim|nvim|micro|emacs)
editor_v=$("$editor_full_path" --version 2>&1)
;;
kak)
@ -2505,9 +2546,20 @@ get_de() {
esac
((${KDE_SESSION_VERSION:-0} >= 4)) && de=${de/KDE/Plasma}
((${KDE_SESSION_VERSION:-0} >= 6)) && de=${de/Plasma/Plasma6}
if [[ $de_version == on && $de ]]; then
case $de in
Plasma6*)
de_ver=$(plasmashell --version)
kf_ver=$(kinfo)
qt_ver=${kf_ver/Kernel*}
qt_ver=${qt_ver/*:}
qt_ver=$(trim "$qt_ver")
kf_ver=${kf_ver/Qt*}
kf_ver=${kf_ver/*:}
kf_ver=$(trim "$kf_ver")
;;
Plasma*)
de_ver=$(plasmashell --version)
kf_ver=$(kf5-config --version)
@ -2541,7 +2593,7 @@ get_de() {
de+=" $de_ver"
[[ $de == "Plasma"* ]] && de+=" [KF5 $kf_ver] [Qt $qt_ver]"
[[ $de == "Plasma"* ]] && de="Plasma $de_ver [KF $kf_ver] [Qt $qt_ver]"
fi
# TODO:
@ -6345,6 +6397,7 @@ INFO:
--title_fqdn on/off Hide/Show Fully Qualified Domain Name in title.
--package_managers on/off Hide/Show Package Manager names. (on, tiny, off)
--package_separate on/off Whether to separate system/user modes for supported package managers
--package_minimal Reduce output of packages list by not showing programming language package managers or Steam games
--os_arch on/off Hide/Show OS architecture.
--speed_type type Change the type of cpu speed to display.
Possible values: current, min, max, bios,
@ -6502,7 +6555,7 @@ ASCII:
CutefishOS, CuteOS, CyberOS, dahlia, DarkOs, Darwin, Debian, Deepin,
DesaOS, Devuan, DietPi, digital UNIX, DracOS, DragonFly, Drauger,
Droidian, Elementary, Elive, EncryptOS, EndeavourOS, Endless, Enso,
EuroLinux, EvolutionOS, Exherbo, Exodia Predator OS, Fedora,
EuroLinux, EvolutionOS, eweOS, Exherbo, Exodia Predator OS, Fedora,
FemboyOS, Feren, Finnix, Floflis, FreeBSD, FreeMiNT, Frugalware,
Funtoo, GalliumOS, Garuda, Gentoo, GhostBSD, glaucus, gNewSense,
GNOME, GNU, GoboLinux, GrapheneOS, Grombyang, Guix, Haiku, HamoniKR,
@ -6614,6 +6667,7 @@ get_args() {
"--title_fqdn") title_fqdn="$2" ;;
"--package_managers") package_managers="$2" ;;
"--package_separate") package_separate="$2" ;;
"--package_minimal") package_minimal="1" ;;
"--os_arch") os_arch="$2" ;;
"--cpu_cores") cpu_cores="$2" ;;
"--cpu_speed") cpu_speed="$2" ;;
@ -9613,6 +9667,27 @@ ${c1}\e[1;32m dddddddddddddddddddddddd
EOF
;;
"eweOS"*)
set_colors 7 11 9 8 1
read -rd '' ascii_data <<'EOF'
${c2} #####%%%
${c2} ##%%${c3}////${c2}%%%%%${c3}///
${c2} #%%%%${c3}////((((////${c2}%
${c1} *@@@@@@@${c3}/${c5},,,${c3}/////${c5},,,${c2}%${c1}@@@@@@@
${c1} .@@@@@@@@@@@${c3}////////${c2}%%%${c1}@@@@@@@@@@@@
${c1} @@@${c4}...${c1}@@@@@@${c3}////${c2}%%${c3}////${c1}@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@@@@@@@@@@@@@@@@@@
${c1} @@@@@@ @@@@@@
${c1} @@@ @@@
EOF
;;
"Exherbo"*)
set_colors 4 7 1
read -rd '' ascii_data <<'EOF'

View file

@ -31,6 +31,7 @@ setup(
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
],
packages=find_namespace_packages(),
package_data={'hyfetch': ['hyfetch/*']},

366
tools/bash_ignore.txt Normal file
View file

@ -0,0 +1,366 @@
git-bash.exe
git-cmd.exe
cmd
tmp
dev
bin/git.exe
bin/sh.exe
usr/share
usr/ssl
usr/libexec
usr/lib
usr/bin/git*
usr/bin/*vim*
usr/bin/*ssl*
usr/bin/*perl*
usr/bin/*gpg*
usr/bin/*ssh*
usr/bin/*crypto*
usr/bin/*view*
usr/bin/*svn*
usr/bin/ex*.exe
mingw32/share
mingw32/lib
mingw32/etc
mingw32/doc
mingw32/libexec
mingw32/bin/git*
mingw32/bin/Git*
mingw32/bin/Avalonia*
mingw32/bin/xz*
mingw32/bin/*ssl*
mingw32/bin/scalar.exe
mingw32/bin/libSkiaSharp.dll
mingw32/bin/*crypto*
mingw32/bin/*Microsoft.Identity*
mingw32/bin/*bz*
mingw32/bin/tcl*
mingw32/bin/*brotli*
mingw32/bin/av*
mingw32/bin/pdftotext.exe
mingw32/bin/libiconv-2.dll
mingw32/bin/libHarfBuzzSharp.dll
mingw32/bin/SkiaSharp.dll
mingw32/bin/libcurl-4.dll
mingw32/bin/libgmp-10.dll
mingw32/bin/System.Text.Json.dll
mingw32/bin/gcmcore.dll
mingw32/bin/curl.exe
# Automatically determined by access time
usr/bin/rebase.exe
usr/bin/rebaseall
usr/bin/start
usr/bin/column.exe
usr/bin/dash.exe
usr/bin/getopt.exe
usr/bin/znew
usr/bin/zless
usr/bin/zipinfo.exe
usr/bin/zipgrep
usr/bin/zgrep
usr/bin/zforce
usr/bin/zfgrep
usr/bin/zegrep
usr/bin/zdiff
usr/bin/zcmp
usr/bin/zcat
usr/bin/yes.exe
usr/bin/yat2m.exe
usr/bin/xxd.exe
usr/bin/xgettext.exe
usr/bin/xargs.exe
usr/bin/winpty.exe
usr/bin/wordpad
usr/bin/winpty.dll
usr/bin/winpty-debugserver.exe
usr/bin/winpty-agent.exe
usr/bin/whoami.exe
usr/bin/who.exe
usr/bin/which.exe
usr/bin/watchgnupg.exe
usr/bin/vi
usr/bin/vdir.exe
usr/bin/users.exe
usr/bin/updatedb
usr/bin/update-ca-trust
usr/bin/unzipsfx.exe
usr/bin/unzip.exe
usr/bin/unlink.exe
usr/bin/unix2mac.exe
usr/bin/unix2dos.exe
usr/bin/unexpand.exe
usr/bin/uncompress
usr/bin/umount.exe
usr/bin/u2d.exe
usr/bin/tzset.exe
usr/bin/tty.exe
usr/bin/tsort.exe
usr/bin/tset.exe
usr/bin/trust.exe
usr/bin/truncate.exe
usr/bin/true.exe
usr/bin/tr.exe
usr/bin/tput.exe
usr/bin/touch.exe
usr/bin/toe.exe
usr/bin/timeout.exe
usr/bin/tig.exe
usr/bin/tic.exe
usr/bin/test.exe
usr/bin/tee.exe
usr/bin/tar.exe
usr/bin/tail.exe
usr/bin/tac.exe
usr/bin/tabs.exe
usr/bin/sync.exe
usr/bin/sum.exe
usr/bin/stty.exe
usr/bin/strace.exe
usr/bin/stat.exe
usr/bin/ssp.exe
usr/bin/split.exe
usr/bin/sleep.exe
usr/bin/shuf.exe
usr/bin/shred.exe
usr/bin/sha512sum.exe
usr/bin/sha384sum.exe
usr/bin/sha256sum.exe
usr/bin/sha224sum.exe
usr/bin/sha1sum.exe
usr/bin/sftp.exe
usr/bin/sexp-conv.exe
usr/bin/setmetamode.exe
usr/bin/setfacl.exe
usr/bin/seq.exe
usr/bin/sdiff.exe
usr/bin/scp.exe
usr/bin/runcon.exe
usr/bin/rnano.exe
usr/bin/rmdir.exe
usr/bin/rm.exe
usr/bin/restore
usr/bin/reset.exe
usr/bin/regtool.exe
usr/bin/recode-sr-latin.exe
usr/bin/realpath.exe
usr/bin/readlink.exe
usr/bin/pwd.exe
usr/bin/ptx.exe
usr/bin/psl.exe
usr/bin/psl-make-dafsa
usr/bin/ps.exe
usr/bin/profiler.exe
usr/bin/printf.exe
usr/bin/printenv.exe
usr/bin/pr.exe
usr/bin/pldd.exe
usr/bin/pkcs1-conv.exe
usr/bin/pinky.exe
usr/bin/pinentry.exe
usr/bin/pinentry-w32.exe
usr/bin/pathchk.exe
usr/bin/patch.exe
usr/bin/paste.exe
usr/bin/passwd.exe
usr/bin/p11-kit.exe
usr/bin/od.exe
usr/bin/numfmt.exe
usr/bin/nproc.exe
usr/bin/notepad
usr/bin/nohup.exe
usr/bin/nl.exe
usr/bin/nice.exe
usr/bin/ngettext.exe
usr/bin/nettle-pbkdf2.exe
usr/bin/nettle-lfib-stream.exe
usr/bin/nettle-hash.exe
usr/bin/nano.exe
usr/bin/mv.exe
usr/bin/msys-z.dll
usr/bin/msys-wind-0.dll
usr/bin/msys-unistring-2.dll
usr/bin/msys-ticw6.dll
usr/bin/msys-tasn1-6.dll
usr/bin/msys-sqlite3-0.dll
usr/bin/msys-smartcols-1.dll
usr/bin/msys-serf-1-0.dll
usr/bin/msys-sasl2-3.dll
usr/bin/msys-roken-18.dll
usr/bin/msys-psl-5.dll
usr/bin/msys-pcre2-posix-3.dll
usr/bin/msys-pcre2-8-0.dll
usr/bin/msys-p11-kit-0.dll
usr/bin/msys-npth-0.dll
usr/bin/msys-nettle-8.dll
usr/bin/msys-magic-1.dll
usr/bin/msys-lz4-1.dll
usr/bin/msys-ksba-8.dll
usr/bin/msys-krb5-26.dll
usr/bin/msys-kafs-0.dll
usr/bin/msys-idn2-0.dll
usr/bin/msys-hx509-5.dll
usr/bin/msys-hogweed-6.dll
usr/bin/msys-heimntlm-0.dll
usr/bin/msys-heimbase-1.dll
usr/bin/msys-gssapi-3.dll
usr/bin/msys-gobject-2.0-0.dll
usr/bin/msys-gnutls-30.dll
usr/bin/msys-gmodule-2.0-0.dll
usr/bin/msys-glib-2.0-0.dll
usr/bin/msys-gio-2.0-0.dll
usr/bin/msys-gettextsrc-0-19-8-1.dll
usr/bin/msys-gettextlib-0-19-8-1.dll
usr/bin/msys-gcrypt-20.dll
usr/bin/msys-fido2-1.dll
usr/bin/msys-ffi-7.dll
usr/bin/msys-expat-1.dll
usr/bin/msys-edit-0.dll
usr/bin/msys-crypt-0.dll
usr/bin/msys-com_err-1.dll
usr/bin/msys-cbor-0.11.dll
usr/bin/msys-bz2-1.dll
usr/bin/msys-assuan-0.dll
usr/bin/msys-asn1-8.dll
usr/bin/msys-aprutil-1-0.dll
usr/bin/msys-apr-1-0.dll
usr/bin/msguniq.exe
usr/bin/msgunfmt.exe
usr/bin/msgmerge.exe
usr/bin/msginit.exe
usr/bin/msggrep.exe
usr/bin/msgfmt.exe
usr/bin/msgfilter.exe
usr/bin/msgexec.exe
usr/bin/msgen.exe
usr/bin/msgconv.exe
usr/bin/msgcomm.exe
usr/bin/msgcmp.exe
usr/bin/msgcat.exe
usr/bin/msgattrib.exe
usr/bin/mpicalc.exe
usr/bin/mount.exe
usr/bin/mktemp.exe
usr/bin/mkpasswd.exe
usr/bin/mknod.exe
usr/bin/mkgroup.exe
usr/bin/mkfifo.exe
usr/bin/mkdir.exe
usr/bin/mintty.exe
usr/bin/mintheme
usr/bin/minidumper.exe
usr/bin/md5sum.exe
usr/bin/mac2unix.exe
usr/bin/lsattr.exe
usr/bin/ls.exe
usr/bin/logname.exe
usr/bin/locate.exe
usr/bin/locale.exe
usr/bin/ln.exe
usr/bin/link.exe
usr/bin/lesskey.exe
usr/bin/lessecho.exe
usr/bin/less.exe
usr/bin/ldh.exe
usr/bin/ldd.exe
usr/bin/kill.exe
usr/bin/kbxutil.exe
usr/bin/join.exe
usr/bin/install.exe
usr/bin/infotocap.exe
usr/bin/infocmp.exe
usr/bin/iconv.exe
usr/bin/hostname.exe
usr/bin/hostid.exe
usr/bin/hmac256.exe
usr/bin/head.exe
usr/bin/gzip.exe
usr/bin/gzexe
usr/bin/gunzip
usr/bin/gsettings.exe
usr/bin/groups.exe
usr/bin/gobject-query.exe
usr/bin/gmondump.exe
usr/bin/glib-compile-schemas.exe
usr/bin/gkill.exe
usr/bin/gio-querymodules.exe
usr/bin/gettextize
usr/bin/gettext.sh
usr/bin/gettext.exe
usr/bin/getflags
usr/bin/getfacl.exe
usr/bin/getemojis
usr/bin/getconf.exe
usr/bin/gencat.exe
usr/bin/gdbus.exe
usr/bin/gawk.exe
usr/bin/gawk-5.0.0.exe
usr/bin/gapplication.exe
usr/bin/funzip.exe
usr/bin/fold.exe
usr/bin/fmt.exe
usr/bin/find.exe
usr/bin/file.exe
usr/bin/fgrep
usr/bin/false.exe
usr/bin/factor.exe
usr/bin/envsubst.exe
usr/bin/env.exe
usr/bin/egrep
usr/bin/echo.exe
usr/bin/dumpsexp.exe
usr/bin/du.exe
usr/bin/dos2unix.exe
usr/bin/docx2txt.pl
usr/bin/docx2txt
usr/bin/dirmngr.exe
usr/bin/dirmngr-client.exe
usr/bin/dircolors.exe
usr/bin/dir.exe
usr/bin/diff3.exe
usr/bin/diff.exe
usr/bin/df.exe
usr/bin/dd.exe
usr/bin/date.exe
usr/bin/d2u.exe
usr/bin/cygwin-console-helper.exe
usr/bin/cygcheck.exe
usr/bin/cut.exe
usr/bin/csplit.exe
usr/bin/cp.exe
usr/bin/comm.exe
usr/bin/cmp.exe
usr/bin/clear.exe
usr/bin/cksum.exe
usr/bin/chroot.exe
usr/bin/chown.exe
usr/bin/chmod.exe
usr/bin/chgrp.exe
usr/bin/chcon.exe
usr/bin/chattr.exe
usr/bin/cat.exe
usr/bin/captoinfo.exe
usr/bin/c_rehash
usr/bin/bzless
usr/bin/bzip2recover.exe
usr/bin/bzip2.exe
usr/bin/bzgrep
usr/bin/bzfgrep
usr/bin/bzegrep
usr/bin/bzdiff
usr/bin/bzcmp
usr/bin/bzcat.exe
usr/bin/bunzip2.exe
usr/bin/bashbug
usr/bin/basenc.exe
usr/bin/basename.exe
usr/bin/base64.exe
usr/bin/base32.exe
usr/bin/backup
usr/bin/b2sum.exe
usr/bin/autopoint
usr/bin/astextplain
usr/bin/arch.exe
usr/bin/applygnupgdefaults
usr/bin/addgnupghome
usr/bin/[.exe

28
tools/build_bash.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# This script is used to build a customized Git Bash for windows pacakge that only include bash and no other unnecessary files
set -e
# Get script directory
DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
cd "$DIR/../dist"
# Get the git distribution if it doesn't exist
if [ ! -f /tmp/git.tar.bz2 ]; then
# NOTE: Git for Windows v2.44 is the last release to support Windows 7 and 8
URL="https://github.com/git-for-windows/git/releases/download/v2.44.0.windows.1/Git-2.44.0-32-bit.tar.bz2"
echo "> Downloading git distribution"
wget -q $URL -O /tmp/git.tar.bz2
fi
# Unzip the git distribution to git directory
# Ignore the unnecessary files
# rm -rf git
if [ ! -d /tmp/git ]; then
mkdir -p /tmp/git
echo "> Unzipping git distribution"
tar -xf /tmp/git.tar.bz2 --exclude-from="$DIR/bash_ignore.txt" -C /tmp/git
fi
# Copy the git distribution
cp -r /tmp/git ./git

113
tools/build_pkg.sh Executable file
View file

@ -0,0 +1,113 @@
#!/usr/bin/env bash
FASTFETCH_VERSION="2.10.2"
FASTFETCH_DL="https://github.com/fastfetch-cli/fastfetch/releases/download/$FASTFETCH_VERSION/"
# Get script directory
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd "$DIR/.."
set -e
# Remove the old build
rm -rf dist/
rm -rf build/
# Remove git from the source code before building
rm -rf hyfetch/git/
# Build python from setup.py
python3 setup.py sdist bdist_wheel
# Check
twine check dist/*.tar.gz
twine check dist/*.whl
# =================
# Build for windows
cd dist
# Get the file name
# file="$(ls | grep .whl)" use glob instead
file=$(echo *-none-any.whl)
# Build bash pacakge
"$DIR/build_bash.sh"
# Unzip the wheel
echo "> Unzipping $file"
rm -rf wheel
unzip -qq "$file" -d wheel
# TODO: Find a way to exclude the tools folder
rm -rf wheel/tools
# Copy the git distribution to the wheel
cp -r git/ wheel/hyfetch/
# Embed fastfetch binary
echo "> Embedding fastfetch binary"
wget -q "$FASTFETCH_DL/fastfetch-windows-i686.zip" -O fastfetch-windows.zip
mkdir -p wheel/hyfetch/fastfetch
bsdtar -zxf fastfetch-windows.zip -C wheel/hyfetch/fastfetch
rm -rf fastfetch-windows.zip
# Change the file name (replace -none-any with -win_amd64)
new_name=${file/-any/-win32}
# Zip the wheel to win_amd64.whl
cd wheel && zip -qq -y -r "../$new_name" * && cd ..
cp "$new_name" "${new_name/.whl/-win_amd64.whl}"
# Check again
twine check "$new_name"
# =================
# Build for linux
# Now we're done with windows, delete the git folder
rm -rf wheel/git
function build_for_platform() {
ff_platform=$1
wheel_platform=$2
echo "Building for $ff_platform"
# Download the fastfetch binary
wget -q "$FASTFETCH_DL/fastfetch-$ff_platform.zip" -O "fastfetch-$ff_platform.zip"
# Delete the old fastfetch folder
rm -rf wheel/hyfetch/fastfetch
# Unzip the fastfetch binary
# unzip -qq "fastfetch-$ff_platform.zip" -d wheel/hyfetch/fastfetch
mkdir -p wheel/hyfetch/fastfetch
bsdtar -zxf "fastfetch-$ff_platform.zip" -C wheel/hyfetch/fastfetch --strip-components 1
rm -rf "fastfetch-$ff_platform.zip"
# Change the file name
new_name=${file/-any/-"$wheel_platform"}
# Zip the wheel to platform.whl
cd wheel && zip -qq -y -r "../$new_name" * && cd ..
# Check again
twine check "$new_name"
}
# See https://packaging.python.org/en/latest/specifications/platform-compatibility-tags/
# The official fastfetch build uses Ubuntu 20.04 with glibc 2.31
build_for_platform "linux-amd64" "manylinux_2_31_x86_64"
build_for_platform "linux-aarch64" "manylinux_2_31_aarch64"
# There doesn't seem to be tags for freebsd?
# build_for_platform "freebsd-amd64" "freebsd_x86_64"
# build_for_platform "freebsd-aarch64" "freebsd_aarch64"
build_for_platform "musl-amd64" "musllinux_1_1_x86_64"
build_for_platform "musl-aarch64" "musllinux_1_1_aarch64"
# The official fastfetch build uses macOS 12.0
build_for_platform "macos-universal" "macosx_11_0_x86_64"
build_for_platform "macos-universal" "macosx_11_0_arm64"
# TODO: linux_riscv64
# Finally, remove temporary files
rm -rf wheel git