diff --git a/README.md b/README.md index edb58928..d46b87b0 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,14 @@ From here we can conclude: ## Install -#### Cargo Packaging status +### Quick Install (Linux, macOS, Windows) +```bash +curl -sSfL https://raw.githubusercontent.com/bootandy/dust/refs/heads/master/install.sh | sh +``` + +### Cargo Packaging status + +#### Cargo - `cargo install du-dust` diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..0cd82aa2 --- /dev/null +++ b/install.sh @@ -0,0 +1,233 @@ +#!/usr/bin/env bash +# dust installer script +# Usage: curl -sSfL https://raw.githubusercontent.com/bootandy/dust/main/install.sh | sh + +set -e + +REPO="bootandy/dust" +BINARY_NAME="dust" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +error() { + echo -e "${RED}[ERROR]${NC} $1" + exit 1 +} + +# Detect OS +detect_os() { + case "$(uname -s)" in + Linux*) OS="linux" ;; + Darwin*) OS="darwin" ;; + MINGW*|MSYS*|CYGWIN*) OS="windows" ;; + *) error "Unsupported operating system: $(uname -s)" ;; + esac +} + +# Detect architecture +detect_arch() { + ARCH=$(uname -m) + case "$ARCH" in + x86_64|amd64) ARCH="x86_64" ;; + aarch64|arm64) ARCH="aarch64" ;; + armv7l) ARCH="arm" ;; + i686|i386) ARCH="i686" ;; + *) error "Unsupported architecture: $ARCH" ;; + esac +} + +# Get the latest release version +get_latest_version() { + info "Fetching latest version..." + + # Try using curl + if command -v curl >/dev/null 2>&1; then + VERSION=$(curl -sSf "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/') + # Try using wget + elif command -v wget >/dev/null 2>&1; then + VERSION=$(wget -qO- "https://api.github.com/repos/$REPO/releases/latest" | grep '"tag_name"' | sed -E 's/.*"v?([^"]+)".*/\1/') + else + error "Neither curl nor wget is available. Please install one of them." + fi + + if [ -z "$VERSION" ]; then + error "Failed to fetch latest version" + fi + + info "Latest version: v$VERSION" +} + +# Determine target triple +get_target() { + if [ "$OS" = "linux" ]; then + if [ "$ARCH" = "x86_64" ]; then + TARGET="x86_64-unknown-linux-musl" + elif [ "$ARCH" = "aarch64" ]; then + TARGET="aarch64-unknown-linux-musl" + elif [ "$ARCH" = "arm" ]; then + TARGET="arm-unknown-linux-musleabi" + elif [ "$ARCH" = "i686" ]; then + TARGET="i686-unknown-linux-musl" + else + error "Unsupported Linux architecture: $ARCH" + fi + elif [ "$OS" = "darwin" ]; then + if [ "$ARCH" = "x86_64" ]; then + TARGET="x86_64-apple-darwin" + elif [ "$ARCH" = "aarch64" ]; then + # For Apple Silicon, use x86_64 with Rosetta if native build not available + TARGET="x86_64-apple-darwin" + warn "Using x86_64 binary (will run via Rosetta 2 on Apple Silicon)" + else + error "Unsupported macOS architecture: $ARCH" + fi + elif [ "$OS" = "windows" ]; then + if [ "$ARCH" = "x86_64" ]; then + TARGET="x86_64-pc-windows-msvc" + elif [ "$ARCH" = "i686" ]; then + TARGET="i686-pc-windows-msvc" + else + error "Unsupported Windows architecture: $ARCH" + fi + else + error "Unsupported OS: $OS" + fi + + info "Target platform: $TARGET" +} + +# Download and extract +download_and_install() { + # Construct download URL + if [ "$OS" = "windows" ]; then + ARCHIVE_NAME="dust-v${VERSION}-${TARGET}.zip" + ARCHIVE_EXT="zip" + else + ARCHIVE_NAME="dust-v${VERSION}-${TARGET}.tar.gz" + ARCHIVE_EXT="tar.gz" + fi + + DOWNLOAD_URL="https://github.com/$REPO/releases/download/v${VERSION}/${ARCHIVE_NAME}" + + info "Downloading from: $DOWNLOAD_URL" + + # Create temporary directory + TMP_DIR=$(mktemp -d) + cd "$TMP_DIR" + + # Download + if command -v curl >/dev/null 2>&1; then + curl -sSfL "$DOWNLOAD_URL" -o "$ARCHIVE_NAME" || error "Download failed" + elif command -v wget >/dev/null 2>&1; then + wget -q "$DOWNLOAD_URL" -O "$ARCHIVE_NAME" || error "Download failed" + fi + + # Extract + info "Extracting archive..." + if [ "$ARCHIVE_EXT" = "tar.gz" ]; then + tar -xzf "$ARCHIVE_NAME" || error "Extraction failed" + elif [ "$ARCHIVE_EXT" = "zip" ]; then + unzip -q "$ARCHIVE_NAME" || error "Extraction failed" + fi + + # Find the binary (it might be in a subdirectory) + if [ "$OS" = "windows" ]; then + BINARY_PATH=$(find . -name "${BINARY_NAME}.exe" | head -n 1) + else + BINARY_PATH=$(find . -name "$BINARY_NAME" -type f | head -n 1) + fi + + if [ -z "$BINARY_PATH" ]; then + error "Binary not found in archive" + fi + + # Determine installation directory + if [ -n "$DUST_INSTALL" ]; then + INSTALL_DIR="$DUST_INSTALL" + elif [ -w "/usr/local/bin" ]; then + INSTALL_DIR="/usr/local/bin" + elif [ -w "$HOME/.local/bin" ]; then + INSTALL_DIR="$HOME/.local/bin" + mkdir -p "$INSTALL_DIR" + else + INSTALL_DIR="$HOME/.local/bin" + mkdir -p "$INSTALL_DIR" + fi + + # Install binary + info "Installing to $INSTALL_DIR..." + + if [ -w "$INSTALL_DIR" ]; then + cp "$BINARY_PATH" "$INSTALL_DIR/" || error "Installation failed" + chmod +x "$INSTALL_DIR/$BINARY_NAME" || true + else + # Try with sudo + warn "Installing with sudo (requires administrator privileges)..." + sudo cp "$BINARY_PATH" "$INSTALL_DIR/" || error "Installation failed" + sudo chmod +x "$INSTALL_DIR/$BINARY_NAME" || true + fi + + # Clean up + cd - > /dev/null + rm -rf "$TMP_DIR" + + info "${GREEN}✓${NC} dust v$VERSION installed successfully!" + + # Check if install directory is in PATH + case ":$PATH:" in + *:$INSTALL_DIR:*) + ;; + *) + warn "⚠️ $INSTALL_DIR is not in your PATH" + warn " Add the following to your shell config (~/.bashrc, ~/.zshrc, etc.):" + echo "" + echo " export PATH=\"$INSTALL_DIR:\$PATH\"" + echo "" + ;; + esac + + # Show version + if command -v "$BINARY_NAME" >/dev/null 2>&1; then + info "Version check:" + "$BINARY_NAME" --version || true + fi +} + +# Main execution +main() { + info "dust installer" + echo "" + + # Check for required tools + if ! command -v tar >/dev/null 2>&1 && ! command -v unzip >/dev/null 2>&1; then + error "Neither tar nor unzip is available. Please install one of them." + fi + + detect_os + detect_arch + get_latest_version + get_target + download_and_install + + echo "" + info "Installation complete! Try running: ${GREEN}dust${NC}" +} + +# Allow version to be specified via environment variable +if [ -n "$DUST_VERSION" ]; then + VERSION="$DUST_VERSION" +fi + +main