fix(install): make setup failures explicit and atomic
Installer pipelines masked dependency and download failures, causing false success messages and unsafe config replacement. Atomic updates and current upstream installers keep failures visible.
This commit is contained in:
@@ -157,7 +157,7 @@ SAVEHIST=50000 #save upto 50,000 lines in history. oh-my-zsh default is 10,
|
||||
#setopt hist_ignore_all_dups # dont record duplicated entries in history during a single session
|
||||
|
||||
alias myip="wget -qO- https://wtfismyip.com/text" # quickly show external ip address
|
||||
alias l="ls --hyperlink=auto -lAhrtF" # show all except . .. , sort by recent, / at the end of folders, clickable
|
||||
alias l="eza --hyperlink -lA --sort=modified --reverse --classify" # show all except . .. , sort by recent, / at the end of folders, clickable
|
||||
alias e="exit"
|
||||
alias ip="ip --color=auto"
|
||||
## EZA - the better ls command
|
||||
@@ -184,7 +184,8 @@ cheat() {
|
||||
# TRAPALRM() { if command -v cmatrix &> /dev/null; then cmatrix -sb; fi }
|
||||
|
||||
speedtest() {
|
||||
curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -
|
||||
setopt localoptions pipefail
|
||||
curl -fsSL https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -
|
||||
}
|
||||
|
||||
dadjoke() {
|
||||
@@ -195,9 +196,9 @@ dadjoke() {
|
||||
ipgeo() {
|
||||
# Specify ip or your ip will be used
|
||||
if [ "$1" ]; then
|
||||
curl "http://api.db-ip.com/v2/free/$1"
|
||||
curl "https://api.db-ip.com/v2/free/$1"
|
||||
else
|
||||
curl "http://api.db-ip.com/v2/free/$(myip)"
|
||||
curl "https://api.db-ip.com/v2/free/$(myip)"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -217,7 +218,7 @@ for file in "$ZSH_CONFIGS_DIR"/*(DN); do
|
||||
done
|
||||
|
||||
# Now source oh-my-zsh.sh so that any plugins added in ~/.config/zshrc/* files also get loaded
|
||||
source $ZSH/oh-my-zsh.sh
|
||||
source "$ZSH/oh-my-zsh.sh"
|
||||
|
||||
# Configs that can only work after "source $ZSH/oh-my-zsh.sh", such as Aliases that depend oh-my-zsh plugins
|
||||
|
||||
@@ -226,6 +227,6 @@ source $ZSH/oh-my-zsh.sh
|
||||
export FZF_DEFAULT_OPS="--extended"
|
||||
|
||||
# Initialize zoxide (smarter cd command)
|
||||
eval "$(zoxide init zsh)"
|
||||
command -v zoxide &> /dev/null && eval "$(zoxide init zsh)"
|
||||
|
||||
alias k="k -h" # show human readable file sizes, in kb, mb etc
|
||||
|
||||
+136
-84
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Save the original working directory
|
||||
ORIGINAL_DIR="$(pwd)"
|
||||
|
||||
@@ -18,7 +20,8 @@ do
|
||||
noninteractive_flag=true
|
||||
;;
|
||||
*)
|
||||
# Handle any other arguments or provide an error message
|
||||
echo "Unknown option: $arg" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
@@ -42,9 +45,52 @@ detect_os() {
|
||||
fi
|
||||
}
|
||||
|
||||
run_as_root() {
|
||||
if (( EUID == 0 )); then
|
||||
"$@"
|
||||
elif command -v sudo &> /dev/null; then
|
||||
sudo "$@"
|
||||
else
|
||||
echo "Error: sudo is required to run: $*" >&2
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
install_eza_binary() {
|
||||
local archive
|
||||
local binary
|
||||
local target
|
||||
|
||||
case $(uname -m) in
|
||||
x86_64|amd64)
|
||||
target="x86_64-unknown-linux-gnu"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
target="aarch64-unknown-linux-gnu"
|
||||
;;
|
||||
armv7*)
|
||||
target="arm-unknown-linux-gnueabihf"
|
||||
;;
|
||||
*)
|
||||
echo "Error: no prebuilt eza binary is available for $(uname -m)." >&2
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
|
||||
archive=$(mktemp)
|
||||
binary=$(mktemp)
|
||||
trap 'rm -f "${archive:-}" "${binary:-}"' EXIT
|
||||
curl -fsSL "https://github.com/eza-community/eza/releases/latest/download/eza_${target}.tar.gz" -o "$archive"
|
||||
tar -xOzf "$archive" ./eza > "$binary"
|
||||
run_as_root install -m 755 "$binary" /usr/local/bin/eza
|
||||
rm -f "$archive" "$binary"
|
||||
trap - EXIT
|
||||
}
|
||||
|
||||
# Install eza using package manager or fallback methods
|
||||
install_eza() {
|
||||
local os=$(detect_os)
|
||||
local os
|
||||
os=$(detect_os)
|
||||
echo "Installing eza..."
|
||||
|
||||
case $os in
|
||||
@@ -56,80 +102,73 @@ install_eza() {
|
||||
brew install eza
|
||||
;;
|
||||
ubuntu|debian)
|
||||
sudo apt-get update
|
||||
if ! sudo apt-get install -y eza; then
|
||||
run_as_root apt-get update
|
||||
if ! run_as_root apt-get install -y eza; then
|
||||
echo "Package manager installation failed, attempting fallback..."
|
||||
# Install cargo if it doesn't exist
|
||||
if ! command -v cargo &> /dev/null; then
|
||||
echo "Installing Rust and cargo..."
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y curl build-essential
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||
source ~/.cargo/env
|
||||
fi
|
||||
cargo install eza
|
||||
install_eza_binary
|
||||
fi
|
||||
;;
|
||||
fedora)
|
||||
if ! sudo dnf install -y eza; then
|
||||
if ! run_as_root dnf install -y eza; then
|
||||
echo "Package manager installation failed, attempting fallback..."
|
||||
if command -v cargo &> /dev/null; then
|
||||
cargo install eza
|
||||
else
|
||||
wget -qO- https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz | tar xz
|
||||
sudo install -m 755 eza /usr/local/bin/eza
|
||||
fi
|
||||
install_eza_binary
|
||||
fi
|
||||
;;
|
||||
centos|rhel)
|
||||
if ! sudo yum install -y eza; then
|
||||
if ! run_as_root yum install -y eza; then
|
||||
echo "Package manager installation failed, attempting fallback..."
|
||||
if command -v cargo &> /dev/null; then
|
||||
cargo install eza
|
||||
else
|
||||
wget -qO- https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz | tar xz
|
||||
sudo install -m 755 eza /usr/local/bin/eza
|
||||
fi
|
||||
install_eza_binary
|
||||
fi
|
||||
;;
|
||||
arch|manjaro)
|
||||
if ! sudo pacman -Syu --noconfirm eza; then
|
||||
if ! run_as_root pacman -Syu --noconfirm eza; then
|
||||
echo "Package manager installation failed, attempting fallback..."
|
||||
wget -qO- https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz | tar xz
|
||||
sudo install -m 755 eza /usr/local/bin/eza
|
||||
install_eza_binary
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported operating system for package manager installation, using fallback..."
|
||||
wget -qO- https://github.com/eza-community/eza/releases/latest/download/eza_x86_64-unknown-linux-gnu.tar.gz | tar xz
|
||||
sudo install -m 755 eza /usr/local/bin/eza
|
||||
install_eza_binary
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Helper: install zoxide if the package manager couldn't provide it
|
||||
install_zoxide_binary() {
|
||||
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh |
|
||||
sh -s -- --bin-dir /usr/local/bin --man-dir /usr/local/share/man
|
||||
}
|
||||
|
||||
install_zoxide_fallback() {
|
||||
local os=$(detect_os)
|
||||
local os
|
||||
os=$(detect_os)
|
||||
echo "Attempting fallback installation of zoxide..."
|
||||
case $os in
|
||||
macos)
|
||||
brew install zoxide
|
||||
;;
|
||||
fedora)
|
||||
sudo dnf install -y zoxide || curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
|
||||
run_as_root dnf install -y zoxide || install_zoxide_binary
|
||||
;;
|
||||
centos|rhel)
|
||||
if command -v dnf &> /dev/null && sudo dnf install -y zoxide; then :; else
|
||||
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
|
||||
if command -v dnf &> /dev/null && run_as_root dnf install -y zoxide; then :; else
|
||||
install_zoxide_binary
|
||||
fi
|
||||
;;
|
||||
arch|manjaro)
|
||||
run_as_root pacman -S --needed --noconfirm zoxide
|
||||
;;
|
||||
*)
|
||||
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
|
||||
install_zoxide_binary
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Core: install required packages via the preferred package manager, then fall back where needed
|
||||
install_packages() {
|
||||
local os=$(detect_os)
|
||||
local base_packages="zsh git wget fontconfig zoxide autoconf"
|
||||
local os
|
||||
local base_packages=(zsh git wget fontconfig autoconf)
|
||||
os=$(detect_os)
|
||||
|
||||
case $os in
|
||||
macos)
|
||||
@@ -137,38 +176,46 @@ install_packages() {
|
||||
echo "Homebrew is not installed. Installing Homebrew..."
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
fi
|
||||
brew install ${base_packages}
|
||||
brew install "${base_packages[@]}"
|
||||
;;
|
||||
ubuntu|debian)
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ${base_packages}
|
||||
run_as_root apt-get update
|
||||
run_as_root apt-get install -y "${base_packages[@]}" curl tar
|
||||
;;
|
||||
fedora)
|
||||
sudo dnf install -y ${base_packages}
|
||||
run_as_root dnf install -y "${base_packages[@]}" curl tar
|
||||
;;
|
||||
centos|rhel)
|
||||
sudo yum install -y ${base_packages}
|
||||
run_as_root yum install -y "${base_packages[@]}" curl tar
|
||||
;;
|
||||
arch|manjaro)
|
||||
sudo pacman -Syu --noconfirm ${base_packages}
|
||||
run_as_root pacman -Syu --noconfirm "${base_packages[@]}" curl tar
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported operating system. Please install ${base_packages} manually."
|
||||
echo "Unsupported operating system. Please install ${base_packages[*]} manually."
|
||||
;;
|
||||
esac
|
||||
|
||||
# Fallbacks for any tools that are still missing after the package-manager step
|
||||
command -v eza &> /dev/null || install_eza
|
||||
command -v zoxide &> /dev/null || install_zoxide_fallback
|
||||
|
||||
local command_name
|
||||
for command_name in zsh git wget curl tar fc-cache eza zoxide autoconf; do
|
||||
if ! command -v "$command_name" &> /dev/null; then
|
||||
echo "Error: required command was not installed: $command_name" >&2
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Check if required packages are installed, if not, install them
|
||||
if command -v zsh &> /dev/null && command -v git &> /dev/null && command -v wget &> /dev/null && command -v fc-cache &> /dev/null && command -v eza &> /dev/null && command -v zoxide &> /dev/null && command -v autoconf &> /dev/null; then
|
||||
echo -e "ZSH, Git, wget, fontconfig, eza, zoxide, and autoconf are already installed\n"
|
||||
if command -v zsh &> /dev/null && command -v git &> /dev/null && command -v wget &> /dev/null && command -v curl &> /dev/null && command -v tar &> /dev/null && command -v fc-cache &> /dev/null && command -v eza &> /dev/null && command -v zoxide &> /dev/null && command -v autoconf &> /dev/null; then
|
||||
echo -e "ZSH, Git, wget, curl, tar, fontconfig, eza, zoxide, and autoconf are already installed\n"
|
||||
else
|
||||
echo "Installing required packages..."
|
||||
install_packages
|
||||
echo -e "zsh, wget, git, fontconfig, eza, zoxide, and autoconf Installed\n"
|
||||
echo -e "zsh, wget, curl, tar, git, fontconfig, eza, zoxide, and autoconf installed\n"
|
||||
fi
|
||||
|
||||
if [ -f ~/.gitconfig.backup ]; then
|
||||
@@ -181,9 +228,9 @@ fi
|
||||
|
||||
ZSH="$HOME/.oh-my-zsh"
|
||||
|
||||
if mv -n ~/.zshrc ~/.zshrc-backup-$(date +"%Y-%m-%d"); then # backup .zshrc
|
||||
echo -e "Backed up the current .zshrc to .zshrc-backup-date\n"
|
||||
fi
|
||||
zshrc_download=$(mktemp "$HOME/.zshrc.download.XXXXXX")
|
||||
trap 'rm -f "$zshrc_download"' EXIT
|
||||
wget -q "https://git.miomio.moe/mio/easyzsh/raw/branch/master/.zshrc" -O "$zshrc_download"
|
||||
|
||||
# echo -e "The setup will be installed in '~/.config/ezsh'\n"
|
||||
# echo -e "Place your personal zshrc config files under '~/.config/ezsh/zshrc/'\n"
|
||||
@@ -194,20 +241,25 @@ fi
|
||||
# fi
|
||||
|
||||
echo -e "Installing oh-my-zsh\n"
|
||||
if [ -d $ZSH ]; then
|
||||
if [ -d "$ZSH" ]; then
|
||||
echo -e "oh-my-zsh is already installed\n"
|
||||
git -C $ZSH remote set-url origin https://github.com/ohmyzsh/ohmyzsh.git
|
||||
git -C "$ZSH" remote set-url origin https://github.com/ohmyzsh/ohmyzsh.git
|
||||
# elif [ -d ~/.oh-my-zsh ]; then
|
||||
# echo -e "oh-my-zsh in already installed at '~/.oh-my-zsh'. Moving it to '$ZSH'"
|
||||
# export ZSH="$HOME/.config/ezsh/oh-my-zsh"
|
||||
# mv ~/.oh-my-zsh $ZSH
|
||||
# git -C $ZSH remote set-url origin https://github.com/ohmyzsh/ohmyzsh.git
|
||||
else
|
||||
git clone --depth=1 https://github.com/ohmyzsh/ohmyzsh.git $ZSH
|
||||
git clone --depth=1 https://github.com/ohmyzsh/ohmyzsh.git "$ZSH"
|
||||
fi
|
||||
|
||||
# cp -f .zshrc ~/
|
||||
wget -q "https://git.miomio.moe/mio/easyzsh/raw/branch/master/.zshrc" -O ~/.zshrc
|
||||
if [ -e "$HOME/.zshrc" ] || [ -L "$HOME/.zshrc" ]; then
|
||||
zshrc_backup=$(mktemp "$HOME/.zshrc.backup.$(date +"%Y%m%d-%H%M%S").XXXXXX")
|
||||
cp -Pp "$HOME/.zshrc" "$zshrc_backup"
|
||||
echo -e "Backed up the current .zshrc to $zshrc_backup\n"
|
||||
fi
|
||||
mv "$zshrc_download" "$HOME/.zshrc"
|
||||
trap - EXIT
|
||||
# cp -f ezshrc.zsh ~/.config/ezsh/
|
||||
# cp -f p10k.zsh ~/.config/ezsh/
|
||||
|
||||
@@ -219,28 +271,28 @@ if [ -f ~/.zcompdump ]; then
|
||||
mv ~/.zcompdump* ~/.cache/zsh/
|
||||
fi
|
||||
|
||||
if [ -d $ZSH/plugins/zsh-autosuggestions ]; then
|
||||
git -C $ZSH/plugins/zsh-autosuggestions pull
|
||||
if [ -d "$ZSH/plugins/zsh-autosuggestions" ]; then
|
||||
git -C "$ZSH/plugins/zsh-autosuggestions" pull
|
||||
else
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions $ZSH/plugins/zsh-autosuggestions
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions "$ZSH/plugins/zsh-autosuggestions"
|
||||
fi
|
||||
|
||||
if [ -d $ZSH/custom/plugins/zsh-syntax-highlighting ]; then
|
||||
git -C $ZSH/custom/plugins/zsh-syntax-highlighting pull
|
||||
if [ -d "$ZSH/custom/plugins/zsh-syntax-highlighting" ]; then
|
||||
git -C "$ZSH/custom/plugins/zsh-syntax-highlighting" pull
|
||||
else
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH/custom/plugins/zsh-syntax-highlighting
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH/custom/plugins/zsh-syntax-highlighting"
|
||||
fi
|
||||
|
||||
if [ -d $ZSH/custom/plugins/zsh-completions ]; then
|
||||
git -C $ZSH/custom/plugins/zsh-completions pull
|
||||
if [ -d "$ZSH/custom/plugins/zsh-completions" ]; then
|
||||
git -C "$ZSH/custom/plugins/zsh-completions" pull
|
||||
else
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-completions $ZSH/custom/plugins/zsh-completions
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-completions "$ZSH/custom/plugins/zsh-completions"
|
||||
fi
|
||||
|
||||
if [ -d $ZSH/custom/plugins/zsh-history-substring-search ]; then
|
||||
git -C $ZSH/custom/plugins/zsh-history-substring-search pull
|
||||
if [ -d "$ZSH/custom/plugins/zsh-history-substring-search" ]; then
|
||||
git -C "$ZSH/custom/plugins/zsh-history-substring-search" pull
|
||||
else
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-history-substring-search $ZSH/custom/plugins/zsh-history-substring-search
|
||||
git clone --depth=1 https://github.com/zsh-users/zsh-history-substring-search "$ZSH/custom/plugins/zsh-history-substring-search"
|
||||
fi
|
||||
|
||||
|
||||
@@ -274,12 +326,12 @@ fi
|
||||
|
||||
fc-cache -fv ~/.fonts
|
||||
|
||||
if [ -d $ZSH/custom/themes/powerlevel10k ]; then
|
||||
git -C $ZSH/custom/themes/powerlevel10k pull
|
||||
if [ -d "$ZSH/custom/themes/powerlevel10k" ]; then
|
||||
git -C "$ZSH/custom/themes/powerlevel10k" pull
|
||||
else
|
||||
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH/custom/themes/powerlevel10k
|
||||
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "$ZSH/custom/themes/powerlevel10k"
|
||||
fi
|
||||
curl -s https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s p10k
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s -- p10k
|
||||
|
||||
if [ -d ~/.fzf ]; then
|
||||
git -C ~/.fzf pull
|
||||
@@ -289,16 +341,16 @@ else
|
||||
~/.fzf/install --all --key-bindings --completion --no-update-rc
|
||||
fi
|
||||
|
||||
if [ -d $ZSH/custom/plugins/k ]; then
|
||||
git -C $ZSH/custom/plugins/k pull
|
||||
if [ -d "$ZSH/custom/plugins/k" ]; then
|
||||
git -C "$ZSH/custom/plugins/k" pull
|
||||
else
|
||||
git clone --depth 1 https://github.com/supercrabtree/k $ZSH/custom/plugins/k
|
||||
git clone --depth 1 https://github.com/supercrabtree/k "$ZSH/custom/plugins/k"
|
||||
fi
|
||||
|
||||
if [ -d $ZSH/custom/plugins/fzf-tab ]; then
|
||||
git -C $ZSH/custom/plugins/fzf-tab pull
|
||||
if [ -d "$ZSH/custom/plugins/fzf-tab" ]; then
|
||||
git -C "$ZSH/custom/plugins/fzf-tab" pull
|
||||
else
|
||||
git clone --depth 1 https://github.com/Aloxaf/fzf-tab $ZSH/custom/plugins/fzf-tab
|
||||
git clone --depth 1 https://github.com/Aloxaf/fzf-tab "$ZSH/custom/plugins/fzf-tab"
|
||||
fi
|
||||
|
||||
# Import existing z data into zoxide if available
|
||||
@@ -342,7 +394,7 @@ if [ "$cp_hist_flag" = true ]; then
|
||||
wget -q --show-progress https://gist.githubusercontent.com/muendelezaji/c14722ab66b505a49861b8a74e52b274/raw/49f0fb7f661bdf794742257f58950d209dd6cb62/bash-to-zsh-hist.py
|
||||
cat ~/.bash_history | python3 bash-to-zsh-hist.py >> ~/.zsh_history
|
||||
else
|
||||
echo "Python is not installed, can't copy bash_history to zsh_history\n"
|
||||
printf "Python is not installed, can't copy bash_history to zsh_history\n"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
@@ -351,18 +403,18 @@ fi
|
||||
|
||||
if [ "$noninteractive_flag" = true ]; then
|
||||
echo -e "Installation complete, exit terminal and enter a new zsh session\n"
|
||||
echo -e "Make sure to change zsh to default shell by running: chsh -s $(which zsh)"
|
||||
echo -e "Make sure to change zsh to default shell by running: chsh -s $(command -v zsh)"
|
||||
echo -e "In a new zsh session manually run: build-fzf-tab-module"
|
||||
else
|
||||
# source ~/.zshrc
|
||||
echo -e "\nSudo access is needed to change default shell\n"
|
||||
echo -e "\nAdministrator access is needed to change the default shell\n"
|
||||
|
||||
if sudo chsh -s $(which zsh) $USER && /bin/zsh -i -c 'omz update'; then
|
||||
if run_as_root chsh -s "$(command -v zsh)" "${USER:-$(id -un)}" && /bin/zsh -i -c 'omz update'; then
|
||||
echo -e "Installation complete, exit terminal and enter a new zsh session"
|
||||
echo -e "In a new zsh session manually run: build-fzf-tab-module"
|
||||
else
|
||||
echo -e "Something is wrong"
|
||||
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
-230
@@ -1,230 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
RELEASE="latest"
|
||||
OS="$(uname -s)"
|
||||
|
||||
case "${OS}" in
|
||||
MINGW* | Win*) OS="Windows" ;;
|
||||
esac
|
||||
|
||||
if [ -d "$HOME/.fnm" ]; then
|
||||
INSTALL_DIR="$HOME/.fnm"
|
||||
elif [ -n "$XDG_DATA_HOME" ]; then
|
||||
INSTALL_DIR="$XDG_DATA_HOME/fnm"
|
||||
elif [ "$OS" = "Darwin" ]; then
|
||||
INSTALL_DIR="$HOME/Library/Application Support/fnm"
|
||||
else
|
||||
INSTALL_DIR="$HOME/.local/share/fnm"
|
||||
fi
|
||||
|
||||
# Parse Flags
|
||||
parse_args() {
|
||||
while [[ $# -gt 0 ]]; do
|
||||
key="$1"
|
||||
|
||||
case $key in
|
||||
-d | --install-dir)
|
||||
INSTALL_DIR="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
-s | --skip-shell)
|
||||
SKIP_SHELL="true"
|
||||
shift # past argument
|
||||
;;
|
||||
--force-install | --force-no-brew)
|
||||
echo "\`--force-install\`: I hope you know what you're doing." >&2
|
||||
FORCE_INSTALL="true"
|
||||
shift
|
||||
;;
|
||||
-r | --release)
|
||||
RELEASE="$2"
|
||||
shift # past release argument
|
||||
shift # past release value
|
||||
;;
|
||||
*)
|
||||
echo "Unrecognized argument $key"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
set_filename() {
|
||||
if [ "$OS" = "Linux" ]; then
|
||||
# Based on https://stackoverflow.com/a/45125525
|
||||
case "$(uname -m)" in
|
||||
arm | armv7*)
|
||||
FILENAME="fnm-arm32"
|
||||
;;
|
||||
aarch* | armv8*)
|
||||
FILENAME="fnm-arm64"
|
||||
;;
|
||||
*)
|
||||
FILENAME="fnm-linux"
|
||||
esac
|
||||
elif [ "$OS" = "Darwin" ] && [ "$FORCE_INSTALL" = "true" ]; then
|
||||
FILENAME="fnm-macos"
|
||||
USE_HOMEBREW="false"
|
||||
echo "Downloading the latest fnm binary from GitHub..."
|
||||
echo " Pro tip: it's easier to use Homebrew for managing fnm in macOS."
|
||||
echo " Remove the \`--force-no-brew\` so it will be easy to upgrade."
|
||||
elif [ "$OS" = "Darwin" ]; then
|
||||
USE_HOMEBREW="true"
|
||||
echo "Downloading fnm using Homebrew..."
|
||||
elif [ "$OS" = "Windows" ] ; then
|
||||
FILENAME="fnm-windows"
|
||||
echo "Downloading the latest fnm binary from GitHub..."
|
||||
else
|
||||
echo "OS $OS is not supported."
|
||||
echo "If you think that's a bug - please file an issue to https://github.com/Schniz/fnm/issues"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
download_fnm() {
|
||||
if [ "$USE_HOMEBREW" = "true" ]; then
|
||||
brew install fnm
|
||||
else
|
||||
if [ "$RELEASE" = "latest" ]; then
|
||||
URL="https://github.com/Schniz/fnm/releases/latest/download/$FILENAME.zip"
|
||||
else
|
||||
URL="https://github.com/Schniz/fnm/releases/download/$RELEASE/$FILENAME.zip"
|
||||
fi
|
||||
|
||||
DOWNLOAD_DIR=$(mktemp -d)
|
||||
|
||||
echo "Downloading $URL..."
|
||||
|
||||
mkdir -p "$INSTALL_DIR" &>/dev/null
|
||||
|
||||
if ! curl --progress-bar --fail -L "$URL" -o "$DOWNLOAD_DIR/$FILENAME.zip"; then
|
||||
echo "Download failed. Check that the release/filename are correct."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
unzip -q "$DOWNLOAD_DIR/$FILENAME.zip" -d "$DOWNLOAD_DIR"
|
||||
|
||||
if [ -f "$DOWNLOAD_DIR/fnm" ]; then
|
||||
mv "$DOWNLOAD_DIR/fnm" "$INSTALL_DIR/fnm"
|
||||
else
|
||||
mv "$DOWNLOAD_DIR/$FILENAME/fnm" "$INSTALL_DIR/fnm"
|
||||
fi
|
||||
|
||||
chmod u+x "$INSTALL_DIR/fnm"
|
||||
fi
|
||||
}
|
||||
|
||||
check_dependencies() {
|
||||
echo "Checking dependencies for the installation script..."
|
||||
|
||||
echo -n "Checking availability of curl... "
|
||||
if hash curl 2>/dev/null; then
|
||||
echo "OK!"
|
||||
else
|
||||
echo "Missing!"
|
||||
SHOULD_EXIT="true"
|
||||
fi
|
||||
|
||||
echo -n "Checking availability of unzip... "
|
||||
if hash unzip 2>/dev/null; then
|
||||
echo "OK!"
|
||||
else
|
||||
echo "Missing!"
|
||||
SHOULD_EXIT="true"
|
||||
fi
|
||||
|
||||
if [ "$USE_HOMEBREW" = "true" ]; then
|
||||
echo -n "Checking availability of Homebrew (brew)... "
|
||||
if hash brew 2>/dev/null; then
|
||||
echo "OK!"
|
||||
else
|
||||
echo "Missing!"
|
||||
SHOULD_EXIT="true"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$SHOULD_EXIT" = "true" ]; then
|
||||
echo "Not installing fnm due to missing dependencies."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_containing_dir_exists() {
|
||||
local CONTAINING_DIR
|
||||
CONTAINING_DIR="$(dirname "$1")"
|
||||
if [ ! -d "$CONTAINING_DIR" ]; then
|
||||
echo " >> Creating directory $CONTAINING_DIR"
|
||||
mkdir -p "$CONTAINING_DIR"
|
||||
fi
|
||||
}
|
||||
|
||||
setup_shell() {
|
||||
CURRENT_SHELL="$(basename "$SHELL")"
|
||||
|
||||
if [ "$CURRENT_SHELL" = "zsh" ]; then
|
||||
CONF_FILE=${ZDOTDIR:-$HOME}/.zshrc
|
||||
ensure_containing_dir_exists "$CONF_FILE"
|
||||
echo "Installing for Zsh. Appending the following to $CONF_FILE:"
|
||||
{
|
||||
echo ''
|
||||
echo '# fnm'
|
||||
echo 'FNM_PATH="'"$INSTALL_DIR"'"'
|
||||
echo 'if [ -d "$FNM_PATH" ]; then'
|
||||
echo ' export PATH="'$INSTALL_DIR':$PATH"'
|
||||
echo ' eval "`fnm env`"'
|
||||
echo 'fi'
|
||||
} | tee -a "$CONF_FILE"
|
||||
|
||||
elif [ "$CURRENT_SHELL" = "fish" ]; then
|
||||
CONF_FILE=$HOME/.config/fish/conf.d/fnm.fish
|
||||
ensure_containing_dir_exists "$CONF_FILE"
|
||||
echo "Installing for Fish. Appending the following to $CONF_FILE:"
|
||||
{
|
||||
echo ''
|
||||
echo '# fnm'
|
||||
echo 'set FNM_PATH "'"$INSTALL_DIR"'"'
|
||||
echo 'if [ -d "$FNM_PATH" ]'
|
||||
echo ' set PATH "$FNM_PATH" $PATH'
|
||||
echo ' fnm env | source'
|
||||
echo 'end'
|
||||
} | tee -a "$CONF_FILE"
|
||||
|
||||
elif [ "$CURRENT_SHELL" = "bash" ]; then
|
||||
if [ "$OS" = "Darwin" ]; then
|
||||
CONF_FILE=$HOME/.profile
|
||||
else
|
||||
CONF_FILE=$HOME/.bashrc
|
||||
fi
|
||||
ensure_containing_dir_exists "$CONF_FILE"
|
||||
echo "Installing for Bash. Appending the following to $CONF_FILE:"
|
||||
{
|
||||
echo ''
|
||||
echo '# fnm'
|
||||
echo 'FNM_PATH="'"$INSTALL_DIR"'"'
|
||||
echo 'if [ -d "$FNM_PATH" ]; then'
|
||||
echo ' export PATH="$FNM_PATH:$PATH"'
|
||||
echo ' eval "`fnm env`"'
|
||||
echo 'fi'
|
||||
} | tee -a "$CONF_FILE"
|
||||
|
||||
else
|
||||
echo "Could not infer shell type. Please set up manually."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "In order to apply the changes, open a new terminal or run the following command:"
|
||||
echo ""
|
||||
echo " source $CONF_FILE"
|
||||
}
|
||||
|
||||
parse_args "$@"
|
||||
set_filename
|
||||
check_dependencies
|
||||
download_fnm
|
||||
if [ "$SKIP_SHELL" != "true" ]; then
|
||||
setup_shell
|
||||
fi
|
||||
+56
-40
@@ -1,7 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Save the original working directory
|
||||
ORIGINAL_DIR="$(pwd)"
|
||||
set -euo pipefail
|
||||
|
||||
# Function to detect the operating system
|
||||
detect_os() {
|
||||
@@ -15,6 +14,46 @@ detect_os() {
|
||||
fi
|
||||
}
|
||||
|
||||
run_as_root() {
|
||||
if (( EUID == 0 )); then
|
||||
"$@"
|
||||
elif command -v sudo &> /dev/null; then
|
||||
sudo "$@"
|
||||
else
|
||||
echo "Error: sudo is required to install unzip." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
install_unzip() {
|
||||
command -v unzip &> /dev/null && return
|
||||
|
||||
echo "Installing required dependency: unzip"
|
||||
case $(detect_os) in
|
||||
ubuntu|debian)
|
||||
run_as_root apt-get update
|
||||
run_as_root apt-get install -y unzip
|
||||
;;
|
||||
fedora)
|
||||
run_as_root dnf install -y unzip
|
||||
;;
|
||||
centos|rhel)
|
||||
if command -v dnf &> /dev/null; then
|
||||
run_as_root dnf install -y unzip
|
||||
else
|
||||
run_as_root yum install -y unzip
|
||||
fi
|
||||
;;
|
||||
arch|manjaro)
|
||||
run_as_root pacman -S --needed --noconfirm unzip
|
||||
;;
|
||||
*)
|
||||
echo "Error: unzip is required. Install it with your package manager and retry." >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Install fnm (Fast Node Manager) if it is not already installed
|
||||
if command -v fnm &> /dev/null; then
|
||||
echo -e "fnm is already installed\n"
|
||||
@@ -24,41 +63,22 @@ else
|
||||
|
||||
os=$(detect_os)
|
||||
|
||||
case $os in
|
||||
macos)
|
||||
# Try homebrew first on macOS
|
||||
if command -v brew &> /dev/null; then
|
||||
if [[ "$os" == "macos" ]] && command -v brew &> /dev/null; then
|
||||
echo "Installing fnm via Homebrew..."
|
||||
brew install fnm
|
||||
else
|
||||
echo "Installing fnm via official installer..."
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/install/fnm.sh | bash
|
||||
fi
|
||||
;;
|
||||
ubuntu|debian)
|
||||
# Use the official installer for Linux
|
||||
echo "Installing fnm via official installer..."
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/install/fnm.sh | bash
|
||||
;;
|
||||
fedora|centos|rhel)
|
||||
# Use the official installer for RHEL-based distros
|
||||
echo "Installing fnm via official installer..."
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/install/fnm.sh | bash
|
||||
;;
|
||||
arch|manjaro)
|
||||
# Use the official installer for Arch-based distros
|
||||
echo "Installing fnm via official installer..."
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/install/fnm.sh | bash
|
||||
;;
|
||||
*)
|
||||
echo "Using official installer for unknown OS..."
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/install/fnm.sh | bash
|
||||
;;
|
||||
esac
|
||||
install_unzip
|
||||
install_dir="${XDG_DATA_HOME:-$HOME/.local/share}/fnm"
|
||||
installer_args=(--install-dir "$install_dir" --skip-shell)
|
||||
[[ "$os" == "macos" ]] && installer_args+=(--force-install)
|
||||
|
||||
# Load fnm for the remainder of this script
|
||||
export PATH="$HOME/.local/share/fnm:$PATH"
|
||||
eval "$(fnm env --use-on-cd)"
|
||||
echo "Installing fnm via official installer..."
|
||||
curl -fsSL https://fnm.vercel.app/install | bash -s -- "${installer_args[@]}"
|
||||
export PATH="$install_dir:$PATH"
|
||||
fi
|
||||
|
||||
command -v fnm &> /dev/null
|
||||
eval "$(fnm env --use-on-cd --shell bash)"
|
||||
fi
|
||||
|
||||
# OPTIONAL: Install the latest LTS version of Node.js
|
||||
@@ -69,17 +89,13 @@ fi
|
||||
# fnm default lts-latest
|
||||
|
||||
# Apply the fnm zsh configuration patch (downloads zshrc/fnm.zsh to ~/.config/zshrc/fnm.zsh)
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s fnm
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s -- fnm
|
||||
|
||||
echo -e "\nfnm installation completed!"
|
||||
echo -e "To start using fnm, restart your terminal or run: source ~/.zshrc"
|
||||
echo -e "\nUseful fnm commands:"
|
||||
echo -e " fnm install --lts # Install latest LTS Node.js"
|
||||
echo -e " fnm install 18 # Install Node.js v18"
|
||||
echo -e " fnm use 18 # Use Node.js v18"
|
||||
echo -e " fnm default 18 # Set Node.js v18 as default"
|
||||
echo -e " fnm use lts-latest # Use the latest LTS release"
|
||||
echo -e " fnm default lts-latest # Set the latest LTS as default"
|
||||
echo -e " fnm list # List installed versions"
|
||||
echo -e " fnm list-remote # List available versions"
|
||||
|
||||
# Restore original working directory
|
||||
cd "$ORIGINAL_DIR"
|
||||
@@ -1,10 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Exit on any error
|
||||
set -e
|
||||
# Exit if either side of a download pipeline fails
|
||||
set -euo pipefail
|
||||
|
||||
# Download and execute the patch script
|
||||
if ! curl -s https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s merlin_worker; then
|
||||
if ! curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s -- merlin_worker; then
|
||||
echo "Error: Failed to download or execute patch script"
|
||||
exit 1
|
||||
fi
|
||||
@@ -12,7 +12,7 @@ fi
|
||||
# Check if ~/.bashrc exists and contains PYTHONPATH export
|
||||
if [ -f "$HOME/.bashrc" ]; then
|
||||
# Extract PYTHONPATH from ~/.bashrc (look for export PYTHONPATH=...)
|
||||
BASHRC_PYTHONPATH=$(grep -E "^export PYTHONPATH=" "$HOME/.bashrc" | tail -1)
|
||||
BASHRC_PYTHONPATH=$(grep -E "^export PYTHONPATH=" "$HOME/.bashrc" | tail -1 || true)
|
||||
|
||||
if [ -n "$BASHRC_PYTHONPATH" ]; then
|
||||
echo "Found PYTHONPATH in ~/.bashrc: $BASHRC_PYTHONPATH"
|
||||
@@ -46,5 +46,5 @@ if [ -f "$HOME/.bashrc" ]; then
|
||||
echo "No PYTHONPATH export found in ~/.bashrc"
|
||||
fi
|
||||
else
|
||||
echo "~/.bashrc not found"
|
||||
echo "$HOME/.bashrc not found"
|
||||
fi
|
||||
|
||||
+9
-11
@@ -1,7 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Save the original working directory
|
||||
ORIGINAL_DIR="$(pwd)"
|
||||
set -euo pipefail
|
||||
|
||||
NVM_VERSION="v0.40.4"
|
||||
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
|
||||
|
||||
# Install nvm (Node Version Manager) if it is not already installed
|
||||
if command -v nvm &> /dev/null; then
|
||||
@@ -9,19 +11,15 @@ if command -v nvm &> /dev/null; then
|
||||
else
|
||||
echo -e "Installing nvm (Node Version Manager)\n"
|
||||
# Using the official install script (https://github.com/nvm-sh/nvm)
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||
curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh" | bash
|
||||
|
||||
# Load nvm for the remainder of this script
|
||||
export NVM_DIR="${XDG_CONFIG_HOME:-$HOME/.nvm}"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
command -v nvm &> /dev/null
|
||||
fi
|
||||
|
||||
# OPTIONAL: Install the latest LTS version of Node.js
|
||||
# Uncomment the following line if you would like to automatically install it
|
||||
# Install the latest LTS version of Node.js
|
||||
nvm install --lts
|
||||
|
||||
# Apply the "basic" zsh configuration patch (downloads zshrc/basic.zsh to ~/.config/zshrc/basic.zsh)
|
||||
curl -s https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s nvm
|
||||
|
||||
# Restore original working directory
|
||||
cd "$ORIGINAL_DIR"
|
||||
# Apply the nvm zsh configuration patch
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s -- nvm
|
||||
|
||||
+3
-6
@@ -1,7 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Save the original working directory
|
||||
ORIGINAL_DIR="$(pwd)"
|
||||
set -euo pipefail
|
||||
|
||||
# Install pyenv (Python Version Manager) if it is not already installed
|
||||
if command -v pyenv &> /dev/null; then
|
||||
@@ -15,6 +14,7 @@ else
|
||||
export PYENV_ROOT="$HOME/.pyenv"
|
||||
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
|
||||
eval "$(pyenv init - bash)"
|
||||
command -v pyenv &> /dev/null
|
||||
fi
|
||||
|
||||
# OPTIONAL: Install the latest stable version of Python
|
||||
@@ -22,7 +22,4 @@ fi
|
||||
# pyenv install 3.12.0 && pyenv global 3.12.0
|
||||
|
||||
# Apply the pyenv zsh configuration patch (downloads zshrc/pyenv.zsh to ~/.config/zshrc/pyenv.zsh)
|
||||
curl -s https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s pyenv
|
||||
|
||||
# Restore original working directory
|
||||
cd "$ORIGINAL_DIR"
|
||||
curl -fsSL https://git.miomio.moe/mio/easyzsh/raw/branch/master/patch.sh | bash -s -- pyenv
|
||||
|
||||
@@ -1,16 +1,30 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
BASE_URL="https://git.miomio.moe/mio/easyzsh/raw/branch/master/zshrc"
|
||||
|
||||
ZSH_CONFIGS_DIR="$HOME/.config/zshrc"
|
||||
mkdir -p $ZSH_CONFIGS_DIR
|
||||
mkdir -p "$ZSH_CONFIGS_DIR"
|
||||
|
||||
if [ "$#" -gt 0 ]; then
|
||||
for arg in "$@"; do
|
||||
if ! wget "${BASE_URL}/${arg}.zsh" -O "${ZSH_CONFIGS_DIR}/${arg}.zsh"; then
|
||||
if [[ -z "$arg" || "$arg" == *[![:alnum:]_-]* ]]; then
|
||||
echo "Invalid config name: $arg" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
destination="${ZSH_CONFIGS_DIR}/${arg}.zsh"
|
||||
temporary=$(mktemp "$HOME/.config/.easyzsh-${arg}.XXXXXX")
|
||||
trap 'rm -f "$temporary"' EXIT
|
||||
|
||||
if ! curl -fsSL "${BASE_URL}/${arg}.zsh" -o "$temporary"; then
|
||||
echo "Failed to download ${arg}.zsh from ${BASE_URL}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mv "$temporary" "$destination"
|
||||
trap - EXIT
|
||||
done
|
||||
else
|
||||
echo "No arguments provided. Please specify the config files to download."
|
||||
|
||||
Executable
+85
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
trap 'rm -rf "$TEMP_DIR"' EXIT
|
||||
|
||||
fail() {
|
||||
echo "FAIL: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
assert_download_failure_is_reported() {
|
||||
local home="$TEMP_DIR/home-${1%.sh}"
|
||||
mkdir -p "$home"
|
||||
|
||||
if HOME="$home" PATH="$TEMP_DIR/bin:/usr/bin:/bin" /bin/bash "$ROOT/$1" >"$home/output" 2>&1; then
|
||||
fail "$1 returned success after curl failed"
|
||||
fi
|
||||
}
|
||||
|
||||
mkdir -p "$TEMP_DIR/bin"
|
||||
ln -s /usr/bin/false "$TEMP_DIR/bin/curl"
|
||||
ln -s /usr/bin/true "$TEMP_DIR/bin/unzip"
|
||||
|
||||
for script in install_fnm.sh install_nvm.sh install_pyenv.sh install_merlin_worker.sh; do
|
||||
assert_download_failure_is_reported "$script"
|
||||
done
|
||||
|
||||
patch_home="$TEMP_DIR/patch-home"
|
||||
mkdir -p "$patch_home/.config/zshrc"
|
||||
cp "$ROOT/README.md" "$patch_home/.config/zshrc/missing.zsh"
|
||||
if HOME="$patch_home" PATH="$TEMP_DIR/bin:/usr/bin:/bin" /bin/bash "$ROOT/patch.sh" missing >/dev/null 2>&1; then
|
||||
fail "patch.sh returned success after curl failed"
|
||||
fi
|
||||
cmp -s "$ROOT/README.md" "$patch_home/.config/zshrc/missing.zsh" ||
|
||||
fail "patch.sh replaced an existing config after curl failed"
|
||||
|
||||
if HOME="$patch_home" PATH="$TEMP_DIR/bin:/usr/bin:/bin" /bin/bash "$ROOT/patch.sh" ../invalid >/dev/null 2>&1; then
|
||||
fail "patch.sh accepted an unsafe config name"
|
||||
fi
|
||||
|
||||
main_bin="$TEMP_DIR/main-bin"
|
||||
main_home="$TEMP_DIR/main-home"
|
||||
mkdir -p "$main_bin" "$main_home"
|
||||
for command_name in zsh git curl tar fc-cache eza zoxide autoconf; do
|
||||
ln -s /usr/bin/true "$main_bin/$command_name"
|
||||
done
|
||||
ln -s /usr/bin/false "$main_bin/wget"
|
||||
cp "$ROOT/README.md" "$main_home/.zshrc"
|
||||
if HOME="$main_home" PATH="$main_bin:/usr/bin:/bin" /bin/bash "$ROOT/install.sh" --non-interactive >/dev/null 2>&1; then
|
||||
fail "install.sh returned success after the zshrc download failed"
|
||||
fi
|
||||
cmp -s "$ROOT/README.md" "$main_home/.zshrc" ||
|
||||
fail "install.sh replaced .zshrc after its download failed"
|
||||
|
||||
fnm_home="$TEMP_DIR/fnm-home"
|
||||
mkdir -p "$fnm_home/.local/share/fnm"
|
||||
ln -s /usr/bin/true "$fnm_home/.local/share/fnm/fnm"
|
||||
HOME="$fnm_home" PATH=/usr/bin:/bin zsh -c 'source "$1"; command -v fnm >/dev/null' zsh "$ROOT/zshrc/fnm.zsh" ||
|
||||
fail "fnm is not restored to PATH in a new Zsh session"
|
||||
|
||||
for script in "$ROOT"/*.sh; do
|
||||
bash -n "$script"
|
||||
done
|
||||
|
||||
for config in "$ROOT/.zshrc" "$ROOT"/zshrc/*.zsh; do
|
||||
zsh -n "$config"
|
||||
done
|
||||
|
||||
grep -q 'NVM_VERSION="v0.40.4"' "$ROOT/install_nvm.sh" || fail "nvm version is stale"
|
||||
grep -q 'apt-get install -y unzip' "$ROOT/install_fnm.sh" || fail "Ubuntu unzip installation is missing"
|
||||
grep -q 'tail -1 || true' "$ROOT/install_merlin_worker.sh" || fail "a missing PYTHONPATH remains fatal"
|
||||
grep -Fq 'mktemp "$HOME/.zshrc.download.' "$ROOT/install.sh" || fail ".zshrc is not downloaded on its target filesystem"
|
||||
grep -Fq 'mktemp "$HOME/.config/.easyzsh-' "$ROOT/patch.sh" || fail "patch downloads can be sourced while incomplete"
|
||||
grep -Fq '"$ZSH_CONFIGS_DIR"/*(DN)' "$ROOT/.zshrc" || fail "existing extensionless Zsh configs are ignored"
|
||||
grep -Fq 'cp -Pp "$HOME/.zshrc"' "$ROOT/install.sh" || fail ".zshrc symlinks are not preserved in backups"
|
||||
grep -Fq '[ -L "$HOME/.zshrc" ]' "$ROOT/install.sh" || fail "broken .zshrc symlinks are not backed up"
|
||||
[[ ! -e "$ROOT/install/fnm.sh" ]] || fail "vendored fnm installer still exists"
|
||||
if grep -Eq '^[[:space:]]*export MLX_USER_TOKEN=' "$ROOT"/zshrc/*.zsh; then
|
||||
fail "a static MLX user token remains"
|
||||
fi
|
||||
|
||||
echo "installer checks passed"
|
||||
+4
-6
@@ -1,8 +1,6 @@
|
||||
# fnm (Fast Node Manager) configuration
|
||||
# https://github.com/Schniz/fnm
|
||||
|
||||
FNM_PATH="$HOME/.local/share/fnm"
|
||||
if [ -d "$FNM_PATH" ]; then
|
||||
export PATH="$HOME/.local/share/fnm:$PATH"
|
||||
# fnm (Fast Node Manager)
|
||||
FNM_PATH="${XDG_DATA_HOME:-$HOME/.local/share}/fnm"
|
||||
[[ -d "$FNM_PATH" ]] && export PATH="$FNM_PATH:$PATH"
|
||||
if command -v fnm &> /dev/null; then
|
||||
eval "$(fnm env --use-on-cd --shell zsh)"
|
||||
fi
|
||||
|
||||
+10
-9
@@ -14,14 +14,15 @@
|
||||
|
||||
|
||||
|
||||
# Set cur_dir before sourcing so prep_env.sh uses the correct path
|
||||
export cur_dir="/workspace/vscode"
|
||||
|
||||
# Patch prep_env.sh for zsh compatibility before sourcing
|
||||
source <(sed -e 's/^shopt -s histappend$/[[ -n "${BASH_VERSION}" ]] \&\& shopt -s histappend/' \
|
||||
_prep_env="/workspace/vscode/prep_env.sh"
|
||||
if [[ -r "$_prep_env" ]]; then
|
||||
export cur_dir="/workspace/vscode"
|
||||
source <(sed -e 's/^shopt -s histappend$/[[ -n "${BASH_VERSION}" ]] \&\& shopt -s histappend/' \
|
||||
-e 's/\${!\([^}]*\)}/${(P)\1}/g' \
|
||||
-e 's/cur_dir="\$(cd "\$(dirname "\$0")" && pwd)"/# cur_dir already set/g' \
|
||||
/workspace/mlx/../vscode/prep_env.sh)
|
||||
"$_prep_env")
|
||||
fi
|
||||
unset _prep_env
|
||||
|
||||
# sh -c /opt/tiger/mlx_deploy/greeting.sh
|
||||
|
||||
@@ -33,7 +34,7 @@ if [ -f "/opt/tiger/rh2_bashrc" ]; then
|
||||
source /opt/tiger/rh2_bashrc
|
||||
fi
|
||||
|
||||
. "$HOME/.cargo/env"
|
||||
[[ -r "$HOME/.cargo/env" ]] && . "$HOME/.cargo/env"
|
||||
|
||||
# huggingface proxy
|
||||
export HF_NETWORK_PROXY=http://huggingface-proxy-sg.byted.org
|
||||
@@ -47,10 +48,10 @@ alias hf_mirror_external='export HF_ENDPOINT=$HF_MIRROR_EXTERNAL'
|
||||
# http proxy
|
||||
export HTTP_PROXY=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export HTTPS_PROXY=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export NO_PROXY=byted.org,bytedance.net,10.*.*.*,127.*.*.*
|
||||
export NO_PROXY='byted.org,bytedance.net,10.*.*.*,127.*.*.*'
|
||||
export http_proxy=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export https_proxy=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export no_proxy=byted.org,bytedance.net,10.*.*.*,127.*.*.*
|
||||
export no_proxy='byted.org,bytedance.net,10.*.*.*,127.*.*.*'
|
||||
|
||||
alias proxy_on='export http_proxy=http://sys-proxy-rd-relay.byted.org:8118; export https_proxy=http://sys-proxy-rd-relay.byted.org:8118; export no_proxy=byted.org,bytedance.net,10.*.*.*,127.*.*.*; export HTTP_PROXY=http://sys-proxy-rd-relay.byted.org:8118; export HTTPS_PROXY=http://sys-proxy-rd-relay.byted.org:8118; export NO_PROXY=byted.org,bytedance.net,10.*.*.*,127.*.*.*'
|
||||
alias proxy_off='unset http_proxy; unset https_proxy; unset no_proxy; unset HTTP_PROXY; unset HTTPS_PROXY; unset NO_PROXY'
|
||||
|
||||
@@ -6,7 +6,6 @@ alias stderr='tail -f /var/log/tiger/stderr'
|
||||
# Essential environment variables
|
||||
export MERLIN_PROFILING_HDFS_DIR='hdfs://haruna/home/byte_merlin_profiling/'
|
||||
export RH2_ENV_JSON=/opt/tiger/rh2/env_json
|
||||
export MLX_USER_TOKEN=bd2a3f1b71d54ab497f13f2eefc4f5bc
|
||||
export RH2_TENSORBOARD_HDFS=hdfs://haruna/home/byte_aml_platform/public/rh2_prod/8b6d8490dc2904e0/tensorboard/20250527/903e5003c90ff1dc/arnold_trial/46714689
|
||||
export SPARK_HOME=/opt/tiger/spark_deploy/spark-3.2/spark-stable
|
||||
export PATH=/opt/common_tools:/opt/tiger/typhoon-blade:/usr/lib/x86_64-linux-gnu/openmpi/bin:/usr/local/cuda/bin:/home/tiger/system_op/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tiger/arnold/arnold_entrypoint/tools:/opt/tiger/arnold/hdfs_client:/opt/tiger/yarn_deploy/hadoop/bin:/opt/tiger/yarn_deploy/hive/bin:/home/tiger/.local/bin:/opt/tiger/nastk/bin:/python:/opt/tiger/mlx_deploy/bin
|
||||
@@ -29,10 +28,10 @@ alias hf_mirror_external='export HF_ENDPOINT=$HF_MIRROR_EXTERNAL'
|
||||
export HF_ENDPOINT=http://huggingface-proxy-sg.byted.org
|
||||
export HTTP_PROXY=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export HTTPS_PROXY=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export NO_PROXY=byted.org,bytedance.net,10.*.*.*,127.*.*.*
|
||||
export NO_PROXY='byted.org,bytedance.net,10.*.*.*,127.*.*.*'
|
||||
export http_proxy=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export https_proxy=http://sys-proxy-rd-relay.byted.org:8118
|
||||
export no_proxy=byted.org,bytedance.net,10.*.*.*,127.*.*.*
|
||||
export no_proxy='byted.org,bytedance.net,10.*.*.*,127.*.*.*'
|
||||
|
||||
alias proxy_on='export http_proxy=http://sys-proxy-rd-relay.byted.org:8118; export https_proxy=http://sys-proxy-rd-relay.byted.org:8118; export no_proxy=byted.org,bytedance.net,10.*.*.*,127.*.*.*; export HTTP_PROXY=http://sys-proxy-rd-relay.byted.org:8118; export HTTPS_PROXY=http://sys-proxy-rd-relay.byted.org:8118; export NO_PROXY=byted.org,bytedance.net,10.*.*.*,127.*.*.*'
|
||||
alias proxy_off='unset http_proxy; unset https_proxy; unset no_proxy; unset HTTP_PROXY; unset HTTPS_PROXY; unset NO_PROXY'
|
||||
|
||||
+7
-20
@@ -65,26 +65,6 @@ export PYSPARK_DRIVER_PYTHON="${PYSPARK_DRIVER_PYTHON:-/usr/bin/python3}"
|
||||
# 默认 local[2],和原 mlxrc 保持一致
|
||||
export PYSPARK_SUBMIT_ARGS="${PYSPARK_SUBMIT_ARGS:---master local[2] pyspark-shell}"
|
||||
|
||||
# MLXLAB devbox code disk 标记(如果启动脚本已经设置,就不要覆盖)
|
||||
if [[ -n "${MLXLAB_DEVBOX_CODE_DISK}" ]]; then
|
||||
export MLXLAB_DEVBOX_CODE_DISK=''
|
||||
fi
|
||||
|
||||
# MLX / Merlin 相关变量(假设在容器启动时已经由 start_devbox.sh 导出)
|
||||
# 这里统一再 export 一遍,保证交互 shell 也能继承
|
||||
export MLX_USER_TOKEN='bd2a3f1b71d54ab497f13f2eefc4f5bc'
|
||||
export MLX_USER='qingyuhao'
|
||||
export MLX_IMAGE_VID='d51qjdbc77u9kebl603g'
|
||||
export MLX_IMAGE_URL='hub.byted.org/reckon/data.reckon.mlx.image_10786:4aa09c59c9cbb1fcde50526696177c84'
|
||||
export MLX_ENGINE_SID='bgi0zldy6943b7db'
|
||||
export MLX_DEVBOX_ID='132783'
|
||||
export MLX_HOST_URL='https://ml.bytedance.net/'
|
||||
export MERLIN_HOST_URL='https://ml.bytedance.net'
|
||||
export TCC_CDN_HOST='//lf6-config.bytetcc.com/obj/tcc-config-web'
|
||||
export ZTI_ENV='cn'
|
||||
export IS_SEED='true'
|
||||
export MLXLAB_DEVBOX_CODE_DISK=''
|
||||
|
||||
# DOAS_ZONE(从 BYTE_REGION 推导)
|
||||
if [[ "${BYTE_REGION}" == "CN" ]]; then
|
||||
export DOAS_ZONE="cn"
|
||||
@@ -154,7 +134,9 @@ if [[ "$WORKSPACE_ENVS_SET" != "1" ]]; then
|
||||
envfile="/etc/.container_env"
|
||||
if [[ -f $envfile ]]; then
|
||||
while IFS= read -r line; do
|
||||
[[ "$line" == *=* ]] || continue
|
||||
_varname="${line%%=*}"
|
||||
[[ "$_varname" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]] || continue
|
||||
if eval "[[ -z \"\${${_varname}+x}\" ]]"; then # env is not set
|
||||
export "${_varname}=${line#*=}"
|
||||
fi
|
||||
@@ -226,7 +208,9 @@ worker_envfile="/etc/worker_envs_$ARNOLD_WORKER_ID"
|
||||
user_worker_envfile="$HOME/.worker_envs/worker_envs_$ARNOLD_WORKER_ID"
|
||||
if [[ -f $user_worker_envfile ]]; then
|
||||
while IFS= read -r line; do
|
||||
[[ "$line" == *=* ]] || continue
|
||||
_varname="${line%%=*}"
|
||||
[[ "$_varname" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]] || continue
|
||||
if eval "[[ -z \"\${${_varname}+x}\" ]]"; then # env is not set
|
||||
export "${_varname}=${line#*=}"
|
||||
fi
|
||||
@@ -234,7 +218,9 @@ if [[ -f $user_worker_envfile ]]; then
|
||||
unset _varname
|
||||
elif [[ -f $worker_envfile ]]; then
|
||||
while IFS= read -r line; do
|
||||
[[ "$line" == *=* ]] || continue
|
||||
_varname="${line%%=*}"
|
||||
[[ "$_varname" =~ ^[a-zA-Z_][a-zA-Z0-9_]*$ ]] || continue
|
||||
if eval "[[ -z \"\${${_varname}+x}\" ]]"; then # env is not set
|
||||
export "${_varname}=${line#*=}"
|
||||
fi
|
||||
@@ -276,6 +262,7 @@ if [[ -f "$envfile" ]]; then
|
||||
# 跳过注释行和空行
|
||||
[[ "$line" =~ ^[[:space:]]*# ]] && continue
|
||||
[[ "$line" =~ ^[[:space:]]*$ ]] && continue
|
||||
[[ "$line" == *=* ]] || continue
|
||||
|
||||
# 提取变量名和值
|
||||
var_name="${line%%=*}"
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Initialize pyenv (Python Version Manager)
|
||||
export PYENV_ROOT="$HOME/.pyenv"
|
||||
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH" # Add pyenv to PATH
|
||||
eval "$(pyenv init - zsh)" # This loads pyenv
|
||||
command -v pyenv &> /dev/null && eval "$(pyenv init - zsh)"
|
||||
|
||||
Reference in New Issue
Block a user