setup update complete
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
#####################################################################
|
||||
|
||||
# current profiles:
|
||||
# --extended (default) -> installs all my favorite tools
|
||||
# --min -> only installs essentials (deemed by ME)
|
||||
|
||||
INSTALLED_BY__all=(--installed-by 'default,min,extended-macos-cask')
|
||||
INSTALLED_BY__extended=(--installed-by 'default,extended-macos-cask')
|
||||
INSTALLED_BY__extended_macos_cask=(--installed-by 'extended-macos-cask')
|
||||
|
||||
#####################################################################
|
||||
|
||||
# base cross-platform tools
|
||||
dependency_args=("${INSTALLED_BY__all[@]}")
|
||||
|
||||
dependency --no-executable binutils
|
||||
dependency --no-executable coreutils
|
||||
dependency --no-executable findutils
|
||||
dependency --no-executable libtool
|
||||
|
||||
dependency autoconf --yay base-devel
|
||||
dependency automake --yay base-devel
|
||||
dependency awk --yay base-devel --dnf gawk --apt-get gawk --brew gawk
|
||||
dependency aws --yay aws-cli-v2 --dnf awscli2 --apt-get awscli --brew awscli
|
||||
dependency bat --no-executable
|
||||
dependency bison --yay base-devel
|
||||
dependency cmake
|
||||
dependency cowsay
|
||||
dependency figlet
|
||||
dependency file
|
||||
dependency flex --yay base-devel
|
||||
dependency fzf
|
||||
dependency gcc --yay base-devel --dnf gcc,gcc-c++ --apt-get build-essential
|
||||
dependency gpg --yay gnupg --dnf gnupg2 --apt-get gnupg --brew gnupg
|
||||
dependency grep
|
||||
dependency htop
|
||||
dependency ip --yay iproute2 --dnf iproute --apt-get iproute2 --brew iproute2mac
|
||||
dependency jo
|
||||
dependency jq
|
||||
dependency lolcat
|
||||
dependency ncurses --apt-get libncurses-dev --no-executable
|
||||
dependency ssh --yay openssh --dnf openssh-clients --apt-get openssh-client --brew openssh
|
||||
dependency patch --brew gpatch
|
||||
dependency pkg-config --yay base-devel
|
||||
dependency pylint --yay python-pylint
|
||||
dependency python3 --yay python --dnf python3-devel --apt-get python3-dev --brew python-setuptools
|
||||
dependency rg --yay ripgrep --dnf ripgrep --apt-get ripgrep --brew ripgrep
|
||||
dependency sed --brew gsed
|
||||
dependency tmux
|
||||
dependency vim --dnf vim-enhanced
|
||||
dependency xauth --yay xorg-xauth --dnf xorg-x11-xauth --apt-get xauth
|
||||
dependency yamllint
|
||||
dependency yq --yay go-yq --not-on apt-get
|
||||
dependency zip
|
||||
dependency zsh
|
||||
|
||||
# not packaged for fedora/debian
|
||||
dependency --only-on yay,brew rage --yay rage-encryption
|
||||
dependency --only-on yay,brew zsh-completions --no-executable
|
||||
|
||||
#####################################################################
|
||||
|
||||
# extended cross-platform tools
|
||||
dependency_args=("${INSTALLED_BY__extended[@]}")
|
||||
|
||||
dependency alacritty --brew cask:alacritty
|
||||
dependency docker --dnf docker-ce,docker-ce-cli,containerd.io --brew colima
|
||||
dependency go --apt-get golang
|
||||
dependency java --yay jdk-openjdk --dnf java-latest-openjdk --apt-get default-jdk --brew openjdk
|
||||
dependency javac --yay jdk-openjdk --dnf java-latest-openjdk --apt-get default-jdk --brew openjdk
|
||||
dependency mono --dnf mono-complete --apt-get mono-devel
|
||||
dependency redis-cli --yay redis --dnf valkey,valkey-compat-redis
|
||||
dependency rustc --yay rustup --dnf rust --apt-get rustc --brew rust
|
||||
dependency virtualenv --yay python-virtualenv --dnf python3-virtualenv --apt-get python3-virtualenv
|
||||
|
||||
# fedora & debian need official repositories added to dnf / apt (not yet supported)
|
||||
dependency --only-on yay,brew 1password --brew cask:1password
|
||||
dependency --only-on yay,brew op --yay 1password-cli --brew cask:1password-cli
|
||||
|
||||
#####################################################################
|
||||
|
||||
# linux
|
||||
dependency_args=("${INSTALLED_BY__all[@]}" --only-on yay,dnf,apt-get)
|
||||
|
||||
dependency noto-fonts-emoji --dnf google-noto-emoji-fonts --apt-get fonts-noto-color-emoji --no-executable
|
||||
|
||||
dependency feh
|
||||
dependency fprintd --no-executable
|
||||
dependency ntp --dnf chrony --apt-get chrony --no-executable
|
||||
dependency pip --yay python-pip --dnf python3-pip --apt-get python3-pip
|
||||
dependency sudo
|
||||
dependency uuidgen --yay util-linux --dnf util-linux --apt-get uuid-runtime
|
||||
dependency which
|
||||
dependency xclip
|
||||
dependency xdotool
|
||||
|
||||
#######################
|
||||
|
||||
# linux extended
|
||||
dependency_args=("${INSTALLED_BY__extended[@]}" --only-on yay,dnf,apt-get)
|
||||
|
||||
dependency brave --yay brave-bin
|
||||
dependency flameshot
|
||||
dependency google-chrome --yay google-chrome-stable
|
||||
dependency i3 --yay i3-wm --apt-get i3-wm
|
||||
dependency lxappearance
|
||||
dependency node --yay nodejs --dnf nodejs --apt-get nodejs
|
||||
dependency npm
|
||||
dependency obs-studio
|
||||
dependency otf-monaspace --no-executable
|
||||
dependency picom
|
||||
dependency playerctl
|
||||
dependency polybar
|
||||
dependency rofi
|
||||
dependency ttf-nerd-fonts-symbols --no-executable
|
||||
|
||||
##########################################
|
||||
|
||||
# arch linux
|
||||
dependency_args=("${INSTALLED_BY__all[@]}" --only-on yay)
|
||||
|
||||
dependency arch-install-scripts --no-executable
|
||||
dependency python-rtmidi --no-executable
|
||||
|
||||
dependency scwrypts
|
||||
dependency unipicker
|
||||
|
||||
##########################################
|
||||
|
||||
# debian linux
|
||||
dependency_args=("${INSTALLED_BY__all[@]}" --only-on apt-get)
|
||||
|
||||
dependency bsdextrautils --no-executable
|
||||
|
||||
#####################################################################
|
||||
|
||||
# macos
|
||||
dependency_args=("${INSTALLED_BY__all[@]}" --only-on brew)
|
||||
|
||||
#######################
|
||||
|
||||
# macos extended cask
|
||||
dependency_args=("${INSTALLED_BY__extended_macos_cask[@]}" --only-on brew)
|
||||
|
||||
dependency brave --brew cask:brave-browser
|
||||
dependency google-chrome --brew cask:google-chrome
|
||||
dependency obs-studio --brew cask:obs
|
||||
dependency xquartz --brew cask:xquartz
|
||||
|
||||
#####################################################################
|
||||
unset \
|
||||
dependency_args \
|
||||
INSTALLED_BY__all INSTALLED_BY__extended INSTALLED_BY__extended_macos_cask \
|
||||
;
|
||||
@@ -0,0 +1,259 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.get-installer() {
|
||||
# keyed on the package manager rather than the distro, so derivatives
|
||||
# (manjaro, endeavouros, mint, ...) work without being enumerated; yay
|
||||
# and brew are detected by their BASE manager since setup bootstraps
|
||||
# them itself when missing
|
||||
command -v pacman &>/dev/null && echo yay && return 0
|
||||
command -v dnf &>/dev/null && echo dnf && return 0
|
||||
command -v apt-get &>/dev/null && echo apt-get && return 0
|
||||
command -v brew &>/dev/null && echo brew && return 0
|
||||
|
||||
[[ "$(uname -s)" == Darwin ]] && echo brew && return 0
|
||||
|
||||
echo generic
|
||||
}
|
||||
|
||||
#####################################################################
|
||||
|
||||
typeset -gA DEPENDENCY
|
||||
DEPENDENCY_NAMES=()
|
||||
|
||||
dependency() { # declare a dependency; flags may appear in any order relative to the name; see dependency.manifest.zsh for usage
|
||||
# dependency_args=(...), when set, is prepended to every call until reassigned
|
||||
# or unset -- lets a block of dependencies share flags without repeating them
|
||||
local -a args
|
||||
(( ${+dependency_args} )) && args=("${dependency_args[@]}" "${@}") || args=("${@}")
|
||||
|
||||
local name installed_by yay dnf apt_get brew not_on only_on
|
||||
local no_executable=false
|
||||
local _s _p
|
||||
while [[ "${#args[@]}" -gt 0 ]]
|
||||
do
|
||||
_s=1
|
||||
case "${args[1]}" in
|
||||
( --installed-by ) installed_by="${args[2]}"; _s=2 ;;
|
||||
( --yay ) yay="${args[2]}"; _s=2 ;;
|
||||
( --dnf ) dnf="${args[2]}"; _s=2 ;;
|
||||
( --apt-get ) apt_get="${args[2]}"; _s=2 ;;
|
||||
( --brew ) brew="${args[2]}"; _s=2 ;;
|
||||
( --not-on ) not_on="${args[2]}"; _s=2 ;;
|
||||
( --only-on ) only_on="${args[2]}"; _s=2 ;;
|
||||
( --no-executable ) no_executable=true ;;
|
||||
( -* )
|
||||
echo.error "dependency: unknown option '${args[1]}'"
|
||||
;;
|
||||
( * )
|
||||
case "$((_p+=1))" in
|
||||
( 1 ) name="${args[1]}" ;;
|
||||
( * ) echo.error "dependency: unexpected argument '${args[1]}'" ;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
[[ "${#args[@]}" -ge "${_s}" ]] \
|
||||
&& args=("${args[@]:${_s}}") \
|
||||
|| echo.error "dependency: missing value for '${args[1]}'" \
|
||||
|| args=()
|
||||
done
|
||||
unset _s _p
|
||||
|
||||
[[ -n "${name}" ]] \
|
||||
|| echo.error 'dependency: missing name' \
|
||||
|| return 1
|
||||
|
||||
DEPENDENCY_NAMES+=("${name}")
|
||||
DEPENDENCY[${name}:installed-by]="${installed_by:-default}"
|
||||
DEPENDENCY[${name}:yay]="${yay:-${name}}"
|
||||
DEPENDENCY[${name}:dnf]="${dnf:-${name}}"
|
||||
DEPENDENCY[${name}:apt-get]="${apt_get:-${name}}"
|
||||
DEPENDENCY[${name}:brew]="${brew:-${name}}"
|
||||
DEPENDENCY[${name}:generic]="${name}" # no override -- the dependency's own name IS the generic fallback
|
||||
DEPENDENCY[${name}:not-on]="${not_on:-}"
|
||||
DEPENDENCY[${name}:only-on]="${only_on:-}"
|
||||
DEPENDENCY[${name}:no-executable]="${no_executable}"
|
||||
}
|
||||
|
||||
source "${0:a:h}/dependency.manifest.zsh"
|
||||
|
||||
#####################################################################
|
||||
|
||||
setup.packages.list-installation-profiles() { # every profile named by an --installed-by in the manifest
|
||||
local name
|
||||
for name in "${DEPENDENCY_NAMES[@]}"
|
||||
do
|
||||
print -l -- "${(s:,:)DEPENDENCY[${name}:installed-by]}"
|
||||
done \
|
||||
| sort -u
|
||||
}
|
||||
|
||||
setup.packages._.describe-package() {
|
||||
# a package name isn't always 1:1 with the dependency which asked for it
|
||||
# (e.g. yay's "base-devel" satisfies autoconf, automake, bison, ...), so
|
||||
# name the dependencies too whenever they differ from the package itself
|
||||
local package="${1}" dependency_names="${2}"
|
||||
local display="${package#cask:}" # macOS casks carry a "cask:" prefix through the pipeline
|
||||
|
||||
[[ "${dependency_names}" == "${display}" ]] \
|
||||
&& echo "'${display}'" \
|
||||
&& return 0
|
||||
|
||||
echo "'${display}' (satisfies: ${dependency_names// /, })"
|
||||
}
|
||||
|
||||
setup.packages.install-dependencies() {
|
||||
local ERRORS=0
|
||||
|
||||
echo.status 'checking package dependencies'
|
||||
local installer="${INSTALLER:-$(setup.packages.get-installer)}"
|
||||
[[ "${installer}" != generic ]] \
|
||||
|| echo.warning 'no supported package manager detected; dependencies can only be verified, not installed'
|
||||
|
||||
local requested_config="${DOTWRYN_SETUP__INSTALLATION_PROFILE:-default}"
|
||||
|
||||
local name field target
|
||||
local -a targets
|
||||
local -A package_names # resolved package -> space-joined logical dependency names
|
||||
local -a executable_names # dependency names that must resolve via `command -v` (no-executable excluded)
|
||||
[[ "${#DOTWRYN_SETUP__EXCLUDE[@]}" -eq 0 ]] \
|
||||
|| echo.status "excluding dependencies: ${(j:, :)DOTWRYN_SETUP__EXCLUDE}"
|
||||
|
||||
for name in "${DEPENDENCY_NAMES[@]}"
|
||||
do
|
||||
(( ${DOTWRYN_SETUP__EXCLUDE[(Ie)${name}]} )) && continue
|
||||
|
||||
[[ ",${DEPENDENCY[${name}:installed-by]}," == *",${requested_config},"* ]] || continue
|
||||
|
||||
field="${DEPENDENCY[${name}:only-on]}"
|
||||
[[ -n "${field}" ]] && [[ ",${field}," != *",${installer},"* ]] && continue
|
||||
|
||||
field="${DEPENDENCY[${name}:not-on]}"
|
||||
[[ -n "${field}" ]] && [[ ",${field}," == *",${installer},"* ]] && continue
|
||||
|
||||
[[ "${DEPENDENCY[${name}:no-executable]}" == false ]] && executable_names+=("${name}")
|
||||
|
||||
field="${DEPENDENCY[${name}:${installer}]}"
|
||||
|
||||
# a dependency can require more than one physical package on a given installer
|
||||
# (e.g. "docker" needing docker-ce, docker-ce-cli, and containerd.io on
|
||||
# dnf) -- each --<installer> flag accepts a comma-separated list of targets
|
||||
targets=("${(s:,:)field}")
|
||||
for target in "${targets[@]}"
|
||||
do
|
||||
package_names[${target}]+=" ${name}"
|
||||
done
|
||||
done
|
||||
unset name field target targets
|
||||
|
||||
if [[ "${installer}" == generic ]]
|
||||
then
|
||||
for name in "${executable_names[@]}"
|
||||
do
|
||||
setup.packages.installer.generic.install-managed "${name}"
|
||||
done
|
||||
unset name
|
||||
echo.success 'all dependencies satisfied'
|
||||
return 0
|
||||
fi
|
||||
|
||||
case "${CI}" in
|
||||
( true ) ;; # no system to update
|
||||
( * )
|
||||
echo.status 'updating system, repositories, and mirrors'
|
||||
"setup.packages.installer.${installer}.update-repositories"
|
||||
;;
|
||||
esac
|
||||
|
||||
local -a installed_packages
|
||||
installed_packages=("${(f)$("setup.packages.installer.${installer}.list-installed")}")
|
||||
|
||||
local package
|
||||
local -a missing_packages
|
||||
for package in "${(k)package_names[@]}"
|
||||
do
|
||||
(( ${installed_packages[(Ie)${package}]} )) && continue
|
||||
missing_packages+=("${package}")
|
||||
done
|
||||
unset package
|
||||
|
||||
if [[ "${#missing_packages[@]}" -eq 0 ]]
|
||||
then
|
||||
echo.success 'all dependencies satisfied'
|
||||
else
|
||||
for package in "${missing_packages[@]}"
|
||||
do
|
||||
echo.status "installing $(setup.packages._.describe-package "${package}" "${package_names[${package}]# }")"
|
||||
done
|
||||
unset package
|
||||
|
||||
"setup.packages.installer.${installer}.install-batch" "${missing_packages[@]}"
|
||||
|
||||
# don't trust the batch call's exit code alone: some package managers (yay in
|
||||
# particular) can exit 0 after silently skipping one unresolvable AUR target
|
||||
# rather than failing the whole transaction, so re-check what's actually installed
|
||||
installed_packages=("${(f)$("setup.packages.installer.${installer}.list-installed")}")
|
||||
|
||||
local -a still_missing
|
||||
for package in "${missing_packages[@]}"
|
||||
do
|
||||
(( ${installed_packages[(Ie)${package}]} )) || still_missing+=("${package}")
|
||||
done
|
||||
|
||||
[[ "${#still_missing[@]}" -gt 0 ]] \
|
||||
&& echo.warning 'batched install left some packages unresolved; retrying them one at a time to isolate the failure(s)'
|
||||
|
||||
for package in "${missing_packages[@]}"
|
||||
do
|
||||
if [[ " ${still_missing[*]} " == *" ${package} "* ]]
|
||||
then
|
||||
"setup.packages.installer.${installer}.install-managed" "${package}"
|
||||
else
|
||||
echo.success "$(setup.packages._.describe-package "${package}" "${package_names[${package}]# }") installed"
|
||||
fi
|
||||
done
|
||||
unset package still_missing
|
||||
fi
|
||||
|
||||
case "${installer}" in
|
||||
( brew )
|
||||
# especially important on macOS where BSD utilities are the default
|
||||
echo.status "making sure homebrew GNU utilities are default"
|
||||
|
||||
local gnubin_path
|
||||
for gnubin_path in "$(brew --prefix)"/opt/*/libexec/gnubin(N); do export PATH="${gnubin_path}:${PATH}"; done
|
||||
unset gnubin_path
|
||||
|
||||
setup.filesystem.write-managed-block "${HOME}/.zprofile" --tag homebrew <<-'EOF'
|
||||
# (homebrew required) : load homebrew shellenv
|
||||
eval "$(/opt/homebrew/bin/brew shellenv 2>/dev/null || /usr/local/bin/brew shellenv 2>/dev/null)"
|
||||
|
||||
# ensure GNU utilities from homebrew load before system/BSD utils
|
||||
for homebrew_gnu_bin_path in "$(brew --prefix)"/opt/*/libexec/gnubin(N)
|
||||
do
|
||||
export PATH="${homebrew_gnu_bin_path}:${PATH}"
|
||||
done
|
||||
unset homebrew_gnu_bin_path
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
|
||||
echo.status 'verifying dependency executables'
|
||||
for name in "${executable_names[@]}"
|
||||
do
|
||||
command -v "${name}" &>/dev/null \
|
||||
|| echo.error "'${name}' is installed but its executable could not be found on PATH"
|
||||
done
|
||||
unset name
|
||||
|
||||
if [[ "${ERRORS}" -ne 0 ]]
|
||||
then
|
||||
echo.warning "detected ${ERRORS} errors; double check warnings before proceeding!"
|
||||
case "${DOTWRYN_SETUP__STRICT}" in
|
||||
( true ) return 1 ;; # never prompt; unresolved dependencies are a failure
|
||||
( * ) utils.yN 'continue with install?' || return 1 ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo.success 'all dependencies satisfied'
|
||||
return 0
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.install-from-source() { # clone + build/install a git-hosted package (AUR PKGBUILD or Makefile)
|
||||
local target_url="${1}"
|
||||
local name="${2:-$(echo "${target_url}" | sed 's/.*\///; s/\.git$//')}"
|
||||
local install_dir="${HOME}/.local/share/source-packages"
|
||||
local package_dir="${install_dir}/${name}"
|
||||
mkdir -p -- "${install_dir}"
|
||||
|
||||
local state=missing
|
||||
[[ -d "${package_dir}" ]] && state=exists
|
||||
|
||||
case "${state}" in
|
||||
( exists )
|
||||
: \
|
||||
&& echo.status "updating '${name}'" \
|
||||
&& git -C "${package_dir}" pull origin "$(git -C "${package_dir}" rev-parse --abbrev-ref HEAD)" \
|
||||
;
|
||||
;;
|
||||
( missing )
|
||||
: \
|
||||
&& echo.status "downloading '${name}'" \
|
||||
&& git clone -- "${target_url}" "${package_dir}" \
|
||||
;
|
||||
;;
|
||||
esac \
|
||||
|| echo.error "failed to fetch '${name}'" \
|
||||
|| return 1
|
||||
|
||||
local build_method=unknown
|
||||
[[ -f "${package_dir}/PKGBUILD" ]] && build_method=makepkg
|
||||
[[ -f "${package_dir}/Makefile" ]] && [[ "${build_method}" == unknown ]] && build_method=make
|
||||
|
||||
case "${build_method}" in
|
||||
( makepkg )
|
||||
: \
|
||||
&& echo.status "installing '${name}'" \
|
||||
&& ( cd -- "${package_dir}" && yes | makepkg -si ) \
|
||||
&& echo.success "successfully installed '${name}'" \
|
||||
|| echo.error "failed to install '${name}'" \
|
||||
;
|
||||
;;
|
||||
( make )
|
||||
: \
|
||||
&& echo.status "building '${name}'" \
|
||||
&& make -C "${package_dir}" \
|
||||
&& : \
|
||||
&& echo.status "installing '${name}'" \
|
||||
&& utils.io.getsudo \
|
||||
&& sudo make -C "${package_dir}" install \
|
||||
&& echo.success "successfully installed '${name}'" \
|
||||
|| echo.error "failed to build/install '${name}'" \
|
||||
;
|
||||
;;
|
||||
( unknown )
|
||||
echo.warning 'could not detect supported installation method'
|
||||
echo.reminder 'complete manual installation in the directory below:'
|
||||
echo.reminder "${package_dir}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.installer.apt-get.update-repositories() { sudo apt-get update && sudo apt-get upgrade; }
|
||||
|
||||
setup.packages.installer.apt-get.list-installed() { dpkg-query -W -f='${Package}\n' 2>/dev/null; }
|
||||
|
||||
setup.packages.installer.apt-get.install-batch() { sudo apt-get install --yes "${@}"; }
|
||||
|
||||
setup.packages.installer.apt-get.install-managed() {
|
||||
local target="${1}"
|
||||
echo.status "checking / installing '${target}'"
|
||||
sudo apt-get install --yes "${target}" \
|
||||
&& echo.success "'${target}' installed" \
|
||||
|| echo.error "failed to install ${target}" \
|
||||
;
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.installer.brew.setup-package-manager() {
|
||||
command -v brew &>/dev/null && return 0
|
||||
|
||||
# an already-installed homebrew still isn't on PATH in a fresh login
|
||||
# shell, so adopt it before concluding it needs installing
|
||||
local brew_path
|
||||
for brew_path in /opt/homebrew/bin/brew /usr/local/bin/brew
|
||||
do
|
||||
[[ -x "${brew_path}" ]] || continue
|
||||
eval "$("${brew_path}" shellenv)"
|
||||
return 0
|
||||
done
|
||||
unset brew_path
|
||||
|
||||
: \
|
||||
&& /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \
|
||||
&& eval "$(/opt/homebrew/bin/brew shellenv 2>/dev/null || /usr/local/bin/brew shellenv 2>/dev/null)" \
|
||||
|| echo.error 'failed to install homebrew' \
|
||||
|| return 1 \
|
||||
;
|
||||
}
|
||||
|
||||
setup.packages.installer.brew.update-repositories() { brew update && brew upgrade; }
|
||||
|
||||
setup.packages.installer.brew.list-installed() { # targets needing "brew install --cask" are carried through this whole pipeline as "cask:name"
|
||||
brew list --formula 2>/dev/null
|
||||
brew list --cask 2>/dev/null | sed 's/^/cask:/'
|
||||
}
|
||||
|
||||
setup.packages.installer.brew.install-batch() {
|
||||
local -a formulae casks
|
||||
local target
|
||||
for target in "${@}"
|
||||
do
|
||||
case "${target}" in
|
||||
( cask:* ) casks+=("${target#cask:}") ;;
|
||||
( * ) formulae+=("${target}") ;;
|
||||
esac
|
||||
done
|
||||
unset target
|
||||
|
||||
if [[ "${#formulae[@]}" -gt 0 ]]
|
||||
then
|
||||
yes | brew install "${formulae[@]}" || return 1
|
||||
fi
|
||||
|
||||
if [[ "${#casks[@]}" -gt 0 ]]
|
||||
then
|
||||
yes | brew install --cask "${casks[@]}" || return 2
|
||||
fi
|
||||
}
|
||||
|
||||
setup.packages.installer.brew.install-managed() {
|
||||
local target="${1}"
|
||||
local -a cask_flag
|
||||
if [[ "${target}" == cask:* ]]
|
||||
then
|
||||
target="${target#cask:}"
|
||||
cask_flag=(--cask)
|
||||
fi
|
||||
|
||||
if brew list "${cask_flag[@]}" --versions "${target}" &>/dev/null
|
||||
then
|
||||
echo.success "found '${target}'"
|
||||
return 0
|
||||
fi
|
||||
|
||||
: \
|
||||
&& echo.status "installing '${target}'" \
|
||||
&& yes | brew install "${cask_flag[@]}" "${target}" \
|
||||
&& echo.success "'${target}' installed" \
|
||||
|| echo.error "failed to install '${target}'" \
|
||||
;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.installer.dnf.update-repositories() {
|
||||
: \
|
||||
&& sudo dnf update \
|
||||
&& sudo dnf upgrade \
|
||||
&& sudo dnf install -y dnf-plugins-core \
|
||||
&& sudo dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/fedora/docker-ce.repo \
|
||||
;
|
||||
}
|
||||
|
||||
setup.packages.installer.dnf.list-installed() { rpm -qa --qf '%{NAME}\n' 2>/dev/null; }
|
||||
|
||||
setup.packages.installer.dnf.install-batch() { sudo dnf install -y "${@}"; }
|
||||
|
||||
setup.packages.installer.dnf.install-managed() {
|
||||
local target="${1}"
|
||||
echo.status "checking / installing '${target}'"
|
||||
sudo dnf install -y "${target}" \
|
||||
&& echo.success "'${target}' installed" \
|
||||
|| echo.error "failed to install ${target}" \
|
||||
;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.installer.generic.install-managed() {
|
||||
local target="${1}"
|
||||
command -v "${target}" &>/dev/null \
|
||||
|| echo.error "could not find '${target}'; it's up to you to install this one!"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
#####################################################################
|
||||
|
||||
setup.packages.installer.yay.setup-package-manager() {
|
||||
command -v yay &>/dev/null && return 0
|
||||
setup.packages.install-from-source 'https://aur.archlinux.org/yay.git' 'yay'
|
||||
}
|
||||
|
||||
setup.packages.installer.yay.update-repositories() { yay -Syu; }
|
||||
setup.packages.installer.yay.list-installed() { yay -Qq 2>/dev/null; }
|
||||
setup.packages.installer.yay.install-batch() { yay -Syu --noconfirm "${@}"; }
|
||||
|
||||
setup.packages.installer.yay.install-managed() {
|
||||
local target="${1}"
|
||||
local installed_target="$(setup.packages.installer.yay.list-installed | grep "^${target}$\|^${target}-git$")"
|
||||
|
||||
[[ "${installed_target}" ]] \
|
||||
&& echo.success "found '${installed_target}'" \
|
||||
&& return 0
|
||||
|
||||
: \
|
||||
&& echo.status "installing '${target}'" \
|
||||
&& yay -Syu --noconfirm "${target}" \
|
||||
&& : \
|
||||
&& echo.success "successfully installed '${target}'" \
|
||||
|| echo.error "failed to install '${target}'" \
|
||||
;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#####################################################################
|
||||
|
||||
for setup_library in "${0:a:h}"/*.zsh
|
||||
do
|
||||
case "${setup_library:t}" in
|
||||
( packages.module.zsh | dependency.manifest.zsh ) ;; # self; manifest
|
||||
( * ) source "${setup_library}" ;;
|
||||
esac
|
||||
done
|
||||
unset setup_library
|
||||
|
||||
#####################################################################
|
||||
|
||||
setup.packages() {
|
||||
local INSTALLER="$(setup.packages.get-installer)"
|
||||
[[ "${INSTALLER}" ]] || return 1
|
||||
|
||||
case "${INSTALLER}" in
|
||||
( brew | generic ) ;; # homebrew refuses to run as root; generic installs nothing
|
||||
( * ) utils.io.getsudo ;;
|
||||
esac
|
||||
|
||||
if (( ${+functions[setup.packages.installer.${INSTALLER}.setup-package-manager]} ))
|
||||
then
|
||||
"setup.packages.installer.${INSTALLER}.setup-package-manager" || return 2
|
||||
fi
|
||||
|
||||
setup.packages.install-dependencies || return 3
|
||||
}
|
||||
Reference in New Issue
Block a user