226 lines
5.1 KiB
Bash
226 lines
5.1 KiB
Bash
|
|
#!/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 "$@"
|