2025-12-18 01:18:34 +00:00

226 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# TypeDialog Installation Script
# Installs TypeDialog binaries and configuration
INSTALL_DIR="${INSTALL_DIR:-$HOME/.local/bin}"
CONFIG_DIR="${CONFIG_DIR:-$HOME/.config/typedialog}"
GITHUB_REPO="anthropics/typedialog"
VERSION="${VERSION:-latest}"
# Function: Print info message
log_info() {
echo "[INFO] $*" >&2
}
# Function: Print error message
log_error() {
echo "[ERROR] $*" >&2
}
# Function: Print success message
log_success() {
echo "[✓] $*" >&2
}
# Function: Detect OS and architecture
detect_platform() {
local os
local arch
os=$(uname -s)
arch=$(uname -m)
case "$os" in
Linux*)
os="linux"
;;
Darwin*)
os="darwin"
;;
*)
log_error "Unsupported OS: $os"
return 1
;;
esac
case "$arch" in
x86_64)
arch="x86_64"
;;
aarch64)
arch="aarch64"
;;
arm64)
arch="aarch64"
;;
*)
log_error "Unsupported architecture: $arch"
return 1
;;
esac
echo "${os}-${arch}"
}
# Function: Create directories
create_dirs() {
mkdir -p "$INSTALL_DIR" || {
log_error "Failed to create install directory: $INSTALL_DIR"
return 1
}
mkdir -p "$CONFIG_DIR" || {
log_error "Failed to create config directory: $CONFIG_DIR"
return 1
}
log_success "Directories created"
}
# Function: Download release
download_release() {
local platform="$1"
local download_url="https://github.com/${GITHUB_REPO}/releases/download/${VERSION}/typedialog-${platform}.tar.gz"
local temp_file
temp_file=$(mktemp) || return 1
trap "rm -f '$temp_file'" EXIT
log_info "Downloading: $download_url"
if command -v curl &>/dev/null; then
curl -fsSL "$download_url" -o "$temp_file" || {
log_error "Download failed"
return 1
}
elif command -v wget &>/dev/null; then
wget -q "$download_url" -O "$temp_file" || {
log_error "Download failed"
return 1
}
else
log_error "curl or wget required"
return 1
fi
log_success "Download complete"
echo "$temp_file"
}
# Function: Extract archive
extract_archive() {
local archive="$1"
local extract_dir
extract_dir=$(mktemp -d) || return 1
log_info "Extracting archive..."
tar -xzf "$archive" -C "$extract_dir" || {
log_error "Extraction failed"
rm -rf "$extract_dir"
return 1
}
echo "$extract_dir"
}
# Function: Install binaries
install_binaries() {
local extract_dir="$1"
for binary in typedialog typedialog-tui typedialog-web; do
local binary_path="${extract_dir}/bin/${binary}"
if [[ -f "$binary_path" ]]; then
cp "$binary_path" "${INSTALL_DIR}/${binary}" || {
log_error "Failed to install: $binary"
return 1
}
chmod +x "${INSTALL_DIR}/${binary}"
log_success "Installed: $binary"
fi
done
}
# Function: Install configurations
install_configs() {
local extract_dir="$1"
local config_src="${extract_dir}/config"
if [[ -d "$config_src" ]]; then
cp -r "$config_src"/* "$CONFIG_DIR/" || {
log_error "Failed to install configurations"
return 1
}
log_success "Configurations installed"
fi
}
# Function: Update PATH if needed
update_path() {
local shell_rc=""
if [[ "$SHELL" == *"bash"* ]]; then
shell_rc="$HOME/.bashrc"
elif [[ "$SHELL" == *"zsh"* ]]; then
shell_rc="$HOME/.zshrc"
else
return 0
fi
if [[ -f "$shell_rc" ]]; then
if ! grep -q "$INSTALL_DIR" "$shell_rc"; then
echo "export PATH=\"\$PATH:$INSTALL_DIR\"" >> "$shell_rc"
log_info "Updated $shell_rc with $INSTALL_DIR"
fi
fi
}
# Function: Verify installation
verify_installation() {
log_info "Verifying installation..."
if command -v typedialog &>/dev/null; then
local version
version=$(typedialog --version 2>/dev/null || echo "unknown")
log_success "TypeDialog installed: $version"
else
log_error "Installation verification failed"
return 1
fi
}
# Function: Main entry point
main() {
log_info "TypeDialog Installation"
log_info "========================"
local platform
platform=$(detect_platform) || return 1
log_info "Detected platform: $platform"
create_dirs || return 1
local archive
archive=$(download_release "$platform") || return 1
local extract_dir
extract_dir=$(extract_archive "$archive") || return 1
trap "rm -rf '$extract_dir'" EXIT
install_binaries "$extract_dir" || return 1
install_configs "$extract_dir" || return 1
update_path
verify_installation || return 1
log_success "TypeDialog installation complete!"
log_info "Install directory: $INSTALL_DIR"
log_info "Config directory: $CONFIG_DIR"
return 0
}
main "$@"