blob: b7a96fed0e82e992fa3d3193f2d6dda38e827ca4 (
plain) (
tree)
|
|
#!/bin/bash
set -e
# Makima CLI Installer
# Usage: curl -fsSL https://raw.githubusercontent.com/soryu-co/soryu/master/install.sh | bash
# curl -fsSL https://raw.githubusercontent.com/soryu-co/soryu/master/install.sh | INSTALL_DIR=/opt/bin bash
REPO="soryu-co/soryu"
INSTALL_DIR="${INSTALL_DIR:-/usr/local/bin}"
BINARY_NAME="makima"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_error() {
echo -e "${RED}Error: $1${NC}" >&2
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}$1${NC}"
}
print_info() {
echo "$1"
}
# Check for required tools
check_dependencies() {
local missing=""
if ! command -v curl &> /dev/null; then
missing="$missing curl"
fi
if ! command -v tar &> /dev/null; then
missing="$missing tar"
fi
if [ -n "$missing" ]; then
print_error "Missing required tools:$missing"
print_info "Please install the missing tools and try again."
exit 1
fi
}
# Detect operating system
detect_os() {
local os
os="$(uname -s)"
case "$os" in
Linux*)
echo "linux"
;;
Darwin*)
echo "macos"
;;
*)
print_error "Unsupported operating system: $os"
print_info "Supported: Linux, macOS"
exit 1
;;
esac
}
# Detect CPU architecture
detect_arch() {
local arch
arch="$(uname -m)"
case "$arch" in
x86_64|amd64)
echo "x86_64"
;;
arm64|aarch64)
echo "arm64"
;;
*)
print_error "Unsupported architecture: $arch"
print_info "Supported: x86_64, arm64"
exit 1
;;
esac
}
# Get the latest release version from GitHub API
get_latest_version() {
local version
version=$(curl -fsSL "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
if [ -z "$version" ]; then
print_error "Failed to fetch latest release version from GitHub"
exit 1
fi
echo "$version"
}
# Construct the download URL for the release asset
get_download_url() {
local version=$1
local os=$2
local arch=$3
# Handle macOS arm64 vs Linux x86_64 naming
local asset_name="makima-${version}-${os}-${arch}.tar.gz"
echo "https://github.com/$REPO/releases/download/${version}/${asset_name}"
}
# Download and install the binary
install_binary() {
local url=$1
local tmpdir
tmpdir=$(mktemp -d)
local tarball="$tmpdir/makima.tar.gz"
print_info "Downloading from: $url"
# Download the tarball
if ! curl -fsSL "$url" -o "$tarball"; then
print_error "Failed to download release from: $url"
print_info "Please check if the release exists for your platform."
rm -rf "$tmpdir"
exit 1
fi
# Verify download was successful
if [ ! -f "$tarball" ] || [ ! -s "$tarball" ]; then
print_error "Downloaded file is empty or missing"
rm -rf "$tmpdir"
exit 1
fi
# Extract the tarball
print_info "Extracting archive..."
if ! tar -xzf "$tarball" -C "$tmpdir"; then
print_error "Failed to extract archive"
rm -rf "$tmpdir"
exit 1
fi
# Find the binary (it should be in the extracted files)
local binary
if [ -f "$tmpdir/$BINARY_NAME" ]; then
binary="$tmpdir/$BINARY_NAME"
elif [ -f "$tmpdir/makima/$BINARY_NAME" ]; then
binary="$tmpdir/makima/$BINARY_NAME"
else
# Search for the binary
binary=$(find "$tmpdir" -name "$BINARY_NAME" -type f | head -1)
if [ -z "$binary" ]; then
print_error "Could not find $BINARY_NAME binary in archive"
print_info "Archive contents:"
ls -la "$tmpdir"
rm -rf "$tmpdir"
exit 1
fi
fi
# Make binary executable
chmod +x "$binary"
# Create install directory if it doesn't exist
if [ ! -d "$INSTALL_DIR" ]; then
print_info "Creating directory: $INSTALL_DIR"
if ! mkdir -p "$INSTALL_DIR" 2>/dev/null; then
print_warning "Cannot create $INSTALL_DIR, trying with sudo..."
sudo mkdir -p "$INSTALL_DIR"
fi
fi
# Install binary
print_info "Installing to: $INSTALL_DIR/$BINARY_NAME"
if ! mv "$binary" "$INSTALL_DIR/$BINARY_NAME" 2>/dev/null; then
print_warning "Cannot write to $INSTALL_DIR, trying with sudo..."
sudo mv "$binary" "$INSTALL_DIR/$BINARY_NAME"
fi
# Cleanup
rm -rf "$tmpdir"
}
# Verify installation
verify_installation() {
if [ -x "$INSTALL_DIR/$BINARY_NAME" ]; then
print_success "Successfully installed $BINARY_NAME to $INSTALL_DIR/$BINARY_NAME"
# Check if install dir is in PATH
if ! echo "$PATH" | grep -q "$INSTALL_DIR"; then
print_warning "Note: $INSTALL_DIR is not in your PATH"
print_info "Add it with: export PATH=\"$INSTALL_DIR:\$PATH\""
fi
# Show version if possible
if command -v "$BINARY_NAME" &> /dev/null; then
print_info ""
print_info "Installed version:"
"$BINARY_NAME" --version 2>/dev/null || true
fi
else
print_error "Installation failed - binary not found at $INSTALL_DIR/$BINARY_NAME"
exit 1
fi
}
# Main installation flow
main() {
print_info "Makima CLI Installer"
print_info "===================="
print_info ""
# Check dependencies
check_dependencies
# Detect platform
local os arch
os=$(detect_os)
arch=$(detect_arch)
print_info "Detected platform: $os-$arch"
# Get latest version
print_info "Fetching latest release..."
local version
version=$(get_latest_version)
print_info "Latest version: $version"
# Construct download URL
local url
url=$(get_download_url "$version" "$os" "$arch")
# Download and install
print_info ""
install_binary "$url"
# Verify
print_info ""
verify_installation
print_info ""
print_success "Installation complete!"
}
main "$@"
|