diff options
| -rw-r--r-- | install.sh | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..b7a96fe --- /dev/null +++ b/install.sh @@ -0,0 +1,251 @@ +#!/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 "$@" |
