- Add CLI reference documentation with command examples - Add CLI quick reference card for quick lookups - Add troubleshooting guide for common issues - Add GitHub Actions release workflow for binary builds - Add CHANGELOG.md for release tracking - Add webhook integration examples - Add setup and verification script - Update README with installation instructions and CLI overview Addresses ELF-169: Document CLI and add standalone binary releases Co-Authored-By: Paperclip <noreply@paperclip.ing>
280 lines
7.9 KiB
Bash
Executable File
280 lines
7.9 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Hatch CLI Setup and Verification Script
|
||
# This script helps users install and verify the Hatch CLI
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Function to print colored output
|
||
print_status() {
|
||
local status=$1
|
||
local message=$2
|
||
|
||
case $status in
|
||
"OK")
|
||
echo -e "${GREEN}✓${NC} $message"
|
||
;;
|
||
"WARN")
|
||
echo -e "${YELLOW}⚠${NC} $message"
|
||
;;
|
||
"ERROR")
|
||
echo -e "${RED}✗${NC} $message"
|
||
;;
|
||
"INFO")
|
||
echo -e "${BLUE}ℹ${NC} $message"
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# Function to check if command exists
|
||
command_exists() {
|
||
command -v "$1" >/dev/null 2>&1
|
||
}
|
||
|
||
# Function to get latest release version from GitHub
|
||
get_latest_version() {
|
||
if command_exists curl; then
|
||
curl -s https://api.github.com/repos/elfoundation/hatch/releases/latest | grep -o '"tag_name": "[^"]*"' | cut -d'"' -f4
|
||
elif command_exists wget; then
|
||
wget -qO- https://api.github.com/repos/elfoundation/hatch/releases/latest | grep -o '"tag_name": "[^"]*"' | cut -d'"' -f4
|
||
else
|
||
echo "unknown"
|
||
fi
|
||
}
|
||
|
||
# Function to detect platform
|
||
detect_platform() {
|
||
local os=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||
local arch=$(uname -m)
|
||
|
||
case $os in
|
||
linux)
|
||
case $arch in
|
||
x86_64|amd64)
|
||
echo "linux-amd64"
|
||
;;
|
||
aarch64|arm64)
|
||
echo "linux-arm64"
|
||
;;
|
||
*)
|
||
echo "linux-unknown"
|
||
;;
|
||
esac
|
||
;;
|
||
darwin)
|
||
case $arch in
|
||
x86_64|amd64)
|
||
echo "darwin-amd64"
|
||
;;
|
||
arm64)
|
||
echo "darwin-arm64"
|
||
;;
|
||
*)
|
||
echo "darwin-unknown"
|
||
;;
|
||
esac
|
||
;;
|
||
mingw*|msys*|cygwin*)
|
||
echo "windows-amd64"
|
||
;;
|
||
*)
|
||
echo "unknown"
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# Function to install hatch
|
||
install_hatch() {
|
||
local platform=$(detect_platform)
|
||
local version=$(get_latest_version)
|
||
|
||
if [ "$platform" = "unknown" ]; then
|
||
print_status "ERROR" "Unsupported platform: $(uname -s) $(uname -m)"
|
||
echo "Please install manually from https://github.com/elfoundation/hatch/releases"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$version" = "unknown" ] || [ -z "$version" ]; then
|
||
print_status "WARN" "Could not determine latest version"
|
||
print_status "INFO" "Please check https://github.com/elfoundation/hatch/releases"
|
||
exit 1
|
||
fi
|
||
|
||
local binary_name="hatch-${platform}"
|
||
local download_url="https://github.com/elfoundation/hatch/releases/download/${version}/${binary_name}"
|
||
|
||
if [ "$platform" = "windows-amd64" ]; then
|
||
binary_name="hatch-windows-amd64.exe"
|
||
download_url="https://github.com/elfoundation/hatch/releases/download/${version}/${binary_name}"
|
||
fi
|
||
|
||
print_status "INFO" "Detected platform: ${platform}"
|
||
print_status "INFO" "Latest version: ${version}"
|
||
print_status "INFO" "Download URL: ${download_url}"
|
||
|
||
# Create temporary directory
|
||
local temp_dir=$(mktemp -d)
|
||
local temp_file="${temp_dir}/${binary_name}"
|
||
|
||
print_status "INFO" "Downloading hatch..."
|
||
|
||
# Download binary
|
||
if command_exists curl; then
|
||
curl -L -o "$temp_file" "$download_url"
|
||
elif command_exists wget; then
|
||
wget -O "$temp_file" "$download_url"
|
||
else
|
||
print_status "ERROR" "Neither curl nor wget found. Please install one."
|
||
exit 1
|
||
fi
|
||
|
||
if [ ! -f "$temp_file" ]; then
|
||
print_status "ERROR" "Failed to download binary"
|
||
exit 1
|
||
fi
|
||
|
||
# Make executable (Unix only)
|
||
if [[ "$platform" != windows-* ]]; then
|
||
chmod +x "$temp_file"
|
||
fi
|
||
|
||
# Determine installation directory
|
||
local install_dir=""
|
||
if [ -d "/usr/local/bin" ] && [ -w "/usr/local/bin" ]; then
|
||
install_dir="/usr/local/bin"
|
||
elif [ -d "$HOME/.local/bin" ]; then
|
||
install_dir="$HOME/.local/bin"
|
||
# Ensure PATH includes ~/.local/bin
|
||
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
|
||
print_status "WARN" "Adding ~/.local/bin to PATH"
|
||
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc"
|
||
echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.zshrc" 2>/dev/null || true
|
||
fi
|
||
else
|
||
install_dir="$HOME/.local/bin"
|
||
mkdir -p "$install_dir"
|
||
fi
|
||
|
||
local install_path="${install_dir}/hatch"
|
||
|
||
# Install binary
|
||
if [ -w "$install_dir" ]; then
|
||
mv "$temp_file" "$install_path"
|
||
else
|
||
print_status "INFO" "Using sudo to install to ${install_dir}"
|
||
sudo mv "$temp_file" "$install_path"
|
||
fi
|
||
|
||
# Clean up
|
||
rm -rf "$temp_dir"
|
||
|
||
print_status "OK" "Hatch installed to ${install_path}"
|
||
|
||
# Verify installation
|
||
if command_exists hatch; then
|
||
print_status "OK" "Hatch is in PATH"
|
||
hatch version
|
||
else
|
||
print_status "WARN" "Hatch installed but not in PATH"
|
||
print_status "INFO" "You may need to restart your shell or add ${install_dir} to PATH"
|
||
fi
|
||
}
|
||
|
||
# Function to verify installation
|
||
verify_installation() {
|
||
print_status "INFO" "Verifying Hatch installation..."
|
||
|
||
# Check if hatch is installed
|
||
if ! command_exists hatch; then
|
||
print_status "ERROR" "Hatch is not installed or not in PATH"
|
||
echo "Please install hatch first:"
|
||
echo " $0 install"
|
||
exit 1
|
||
fi
|
||
|
||
# Check version
|
||
print_status "INFO" "Checking version..."
|
||
if hatch version; then
|
||
print_status "OK" "Version check passed"
|
||
else
|
||
print_status "ERROR" "Version check failed"
|
||
exit 1
|
||
fi
|
||
|
||
# Check help
|
||
print_status "INFO" "Checking help..."
|
||
if hatch --help > /dev/null 2>&1; then
|
||
print_status "OK" "Help command works"
|
||
else
|
||
print_status "ERROR" "Help command failed"
|
||
exit 1
|
||
fi
|
||
|
||
# Check if server is running
|
||
print_status "INFO" "Checking server connectivity..."
|
||
if curl -s http://localhost:8080/healthz > /dev/null 2>&1; then
|
||
print_status "OK" "Server is running and accessible"
|
||
|
||
# Test capture command (dry run)
|
||
print_status "INFO" "Testing CLI commands..."
|
||
|
||
# Test inspect (will fail if no endpoints, but that's OK)
|
||
if hatch inspect default -limit 1 > /dev/null 2>&1; then
|
||
print_status "OK" "CLI commands working"
|
||
else
|
||
print_status "WARN" "CLI commands may have issues (server might not have data)"
|
||
fi
|
||
else
|
||
print_status "WARN" "Server not running at http://localhost:8080"
|
||
print_status "INFO" "Start server with: hatch serve"
|
||
fi
|
||
|
||
print_status "OK" "Installation verification complete"
|
||
}
|
||
|
||
# Function to show usage
|
||
show_usage() {
|
||
echo "Hatch CLI Setup and Verification Script"
|
||
echo ""
|
||
echo "Usage: $0 [command]"
|
||
echo ""
|
||
echo "Commands:"
|
||
echo " install Download and install the latest hatch binary"
|
||
echo " verify Verify hatch installation and connectivity"
|
||
echo " help Show this help message"
|
||
echo ""
|
||
echo "Examples:"
|
||
echo " $0 install # Install hatch"
|
||
echo " $0 verify # Verify installation"
|
||
echo ""
|
||
echo "Manual installation:"
|
||
echo " 1. Download from https://github.com/elfoundation/hatch/releases"
|
||
echo " 2. chmod +x hatch-*"
|
||
echo " 3. sudo mv hatch-* /usr/local/bin/hatch"
|
||
}
|
||
|
||
# Main script
|
||
main() {
|
||
local command=${1:-help}
|
||
|
||
case $command in
|
||
install)
|
||
install_hatch
|
||
;;
|
||
verify)
|
||
verify_installation
|
||
;;
|
||
help|*)
|
||
show_usage
|
||
;;
|
||
esac
|
||
}
|
||
|
||
main "$@" |