diff --git a/ly.sh b/ly.sh new file mode 100644 index 0000000..07930e9 --- /dev/null +++ b/ly.sh @@ -0,0 +1,262 @@ +{ + #!/usr/bin/env bash + + # ─< Check if the given command exists silently >───────────────────────────────────────── + command_exists() { + command -v "$@" >/dev/null 2>&1 + } + + getImports() { + local url="$1" + local import="$(mktemp)" + if command_exists curl; then + curl -fsSL $url -o $import + elif command_exists wget; then + wget -O $import $url + else + echo "curl/wget is required, but missing.." + exit 69 + fi + + source "$import" + + echo "${BLUE}Sourcing external script:${NC} $url" + + sleep 0.1 + rm -f "$import" + } + + setup-env() { + # WHY: + # This import will give you the following variables: + # _sudo="sudo -E" <- only if non root user + # distro = + # arch = bool + # fedora = bool + # opensuse = bool.... + # You can then use it for, `if $arch; then` + # Also this gives you the _install command, which installs a package pased on the packagemanager/distro used. + # + # CAUTION: + # This only wokrs for generic package names, like neovim, or vim, or tmux etc.. + # not every package packagemanager has the same packagenames for their packages.. + # + # local beddu=https://git.k4li.de/scripts/beddu/raw/branch/main/dist/beddu.sh + # local pika=https://git.k4li.de/scripts/imports/raw/branch/main/distros.sh + # dream ~= combined beddu and pika + local dream=https://git.k4li.de/scripts/imports/raw/branch/main/dream.sh + + if ! command_exists pkg-install && ! command_exists check-and-install && ! command_exists pen; then + getImports $dream + fi + } + + getDependencies() { + # INFO: + # ╭─────────────────────────────────────────────────────────────────────────╮ + # │ You can define dependencies for various linux distros here. It will │ + # │ automagically be pulled via the $pkgArray[$distro] variable │ + # ╰─────────────────────────────────────────────────────────────────────────╯ + generalDeps=( + git + ) + + depsDebian=( + build-essential + libpam0g-dev + libxcb-xkb-dev + ) + # depsUbuntu=() + depsFedora=( + kernel-devel + pam-devel + libxcb-devel + zig + ) + # depsOpensuse=() + # depsArch=() + # depsAlpine=() + + declare -A deps=( + [debian]="depsDebian" + [ubuntu]="depsDebian" + [fedora]="depsFedora" + # [arch]="depsArch" + # [alpine]="depsAlpine" + # [opensuse]="depsOpensuse" + ) + + # INFO: + # ╭────────────────────────────────────────────────────────────────╮ + # │ This variable stores the packages you provided for each distro │ + # ╰────────────────────────────────────────────────────────────────╯ + declare -n pkgArray="${deps[$distro]}:${generalDeps[@]}" + + case "$distro" in + debian | ubuntu | arch | fedora | alpine | opensuse) + check-and-install ${pkgArray[@]} + ;; + *) + pen bold yellow "There are no dependencies to install for $distro" + return 0 + ;; + esac + } + + check-path() { + if ! command_exists zig; then + export PATH="$ZIG_PATH:$PATH" + else + check-zig + fi + } + + check-zig() { + local version_needed version_current + + version_needed=0.14.0 + version_current=$(zig version) + + if [ "$version_current" != "$version_needed" ]; then + throw "Version missmatch, you have $version_current, needed is $version_needed" + fi + } + + get-zig() { + local err out zigInstallPath arch url zigtemp zigBinPath tarfile + + arch=$(uname -m) + url="https://ziglang.org/download/0.14.0/zig-linux-${arch}-0.14.0.tar.xz" + zigtemp=$(mktemp -d) + zigBinPath="zig-0.14.0" + tarfile="*.tar.xz" + + spin bold blue "Getting zig 0.14.0 from $url.." + + if [ -d "$HOME/.bin" ]; then + zigInstallPath="$HOME/.bin" + else + zigInstallPath="$HOME/.local/bin" + fi + + cd "$zigtemp" || mkdir -p "$zigtemp" && cd "$zigtemp" || exit 0 + + if run --err err --out out wget "$url"; then + upclear + check bold green "zig download complete!" + else + upclear + throw-err + fi + + spin grey "Extracting archive.." + + # representing the whole zig path + local zig="${zigInstallPath}/${zigBinPath}" + + [[ ! -d "$zig" ]] && mkdir -p "$zig" + + if run --err err --out out tar -xJf "$tarfile" -C "$zig"; then + upclear + check bold green "Archive extracted!" + else + upclear + throw-err + fi + + [[ -d "$zig" ]] && ZIG_PATH="$zig" || throw bold red "Something went terribly wrong!" + } + + get-ly() { + local url tempdir err out + + url="https://codeberg.org/AnErrupTion/ly" + tempdir=$(mktemp -d) + + spin bold yellow "Cloning ly from $url.." + cd $tempdir || mkdir -p $tempdir && cd $tempdir + + if run --err err --out ou git clone --depth=1 $url; then + upclear + check "Cloned ly" + else + upclear + throw-err "Cloning ly failed hard!" + return 69 + fi + } + + build-ly() { + spin bold blue "Building ly with zig.." + if run --err err --out out zig build; then + if run --err err --out out zig build installexe; then + upclear + check "Build ly with zig successfully!" + else + upclear + throw-err "Could not build ly" + fi + else + upclear + throw-err "Could not build ly" + return 69 + fi + } + + main() { + if $silent; then + pen yellow "ARG: Executing script silently!" + fi + + case "$distro" in + arch | ubuntu | debian | fedora) + if ! getDependencies; then + throw "Error when installing dependencies.." + fi + + if get-zig; then + if check-zig; then + if get-ly; then + if build-ly; then + line + check "Installed ly successfully!" + fi + fi + fi + fi + ;; + *) + echo "$distro is not supported by this script!" + exit 1 + ;; + esac + } + + if getImports; then + # ─< package variable >─────────────────────────────────────────────────────────────────── + unset PACKAGE + + # ─< argument list variables >──────────────────────────────────────────────────────────── + silent=false + + sleep 0.1 + + PACKAGE=ly + if command_exists "$PACKAGE"; then + pen bold yellow "$PACKAGE is already installed!" + pen bold yellow "Exiting now!" + exit 69 + fi + + # ─< parse arguments and get variable contents >────────────────────────────────────────── + for arg in "$@"; do + case "$arg" in + --silent | -s) + export silent=true + ;; + esac + done + + main + fi +}