166 lines
3.9 KiB
Bash
Executable File
166 lines
3.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# Transmute CLI installer
|
|
# Usage: curl -fsSL https://raw.githubusercontent.com/noauf/Transmute/main/install.sh | sh
|
|
set -e
|
|
|
|
REPO="noauf/Transmute"
|
|
BINARY="transmute"
|
|
|
|
# Detect OS
|
|
OS="$(uname -s)"
|
|
case "$OS" in
|
|
Darwin) OS="darwin" ;;
|
|
Linux) OS="linux" ;;
|
|
MINGW*|MSYS*|CYGWIN*) OS="windows" ;;
|
|
*)
|
|
echo "Error: unsupported operating system: $OS"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Detect architecture
|
|
ARCH="$(uname -m)"
|
|
case "$ARCH" in
|
|
x86_64|amd64) ARCH="x86_64" ;;
|
|
arm64|aarch64) ARCH="arm64" ;;
|
|
*)
|
|
echo "Error: unsupported architecture: $ARCH"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Determine file extension
|
|
if [ "$OS" = "windows" ]; then
|
|
EXT="zip"
|
|
else
|
|
EXT="tar.gz"
|
|
fi
|
|
|
|
ASSET="${BINARY}-${OS}-${ARCH}.${EXT}"
|
|
|
|
echo ""
|
|
echo " Transmute CLI installer"
|
|
echo " ======================"
|
|
echo ""
|
|
echo " OS: $OS"
|
|
echo " Arch: $ARCH"
|
|
echo ""
|
|
|
|
# Get latest release tag
|
|
echo " Fetching latest release..."
|
|
TAG=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name"' | head -1 | sed 's/.*"tag_name": *"\([^"]*\)".*/\1/')
|
|
|
|
if [ -z "$TAG" ]; then
|
|
echo " Error: could not determine latest release"
|
|
exit 1
|
|
fi
|
|
|
|
echo " Latest version: $TAG"
|
|
|
|
DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${TAG}/${ASSET}"
|
|
|
|
echo " Downloading $ASSET..."
|
|
|
|
# Create temp directory
|
|
TMP_DIR="$(mktemp -d)"
|
|
trap 'rm -rf "$TMP_DIR"' EXIT
|
|
|
|
curl -fsSL "$DOWNLOAD_URL" -o "${TMP_DIR}/${ASSET}"
|
|
|
|
# Extract
|
|
echo " Extracting..."
|
|
if [ "$EXT" = "tar.gz" ]; then
|
|
tar -xzf "${TMP_DIR}/${ASSET}" -C "$TMP_DIR"
|
|
else
|
|
unzip -q "${TMP_DIR}/${ASSET}" -d "$TMP_DIR"
|
|
fi
|
|
|
|
# Find the binary
|
|
BIN_PATH=""
|
|
if [ -f "${TMP_DIR}/${BINARY}" ]; then
|
|
BIN_PATH="${TMP_DIR}/${BINARY}"
|
|
elif [ -f "${TMP_DIR}/${BINARY}-${OS}-${ARCH}/${BINARY}" ]; then
|
|
BIN_PATH="${TMP_DIR}/${BINARY}-${OS}-${ARCH}/${BINARY}"
|
|
fi
|
|
|
|
if [ -z "$BIN_PATH" ]; then
|
|
echo " Error: could not find ${BINARY} binary in archive"
|
|
exit 1
|
|
fi
|
|
|
|
chmod +x "$BIN_PATH"
|
|
|
|
# Determine install directory — try in order of preference
|
|
INSTALL_DIR=""
|
|
NEEDS_PATH_HINT=""
|
|
|
|
if [ -w "/usr/local/bin" ]; then
|
|
INSTALL_DIR="/usr/local/bin"
|
|
elif command -v sudo >/dev/null 2>&1; then
|
|
# Try sudo to /usr/local/bin
|
|
echo " Installing to /usr/local/bin (requires sudo)..."
|
|
if sudo mv "$BIN_PATH" "/usr/local/bin/${BINARY}" 2>/dev/null; then
|
|
sudo chmod +x "/usr/local/bin/${BINARY}"
|
|
INSTALL_DIR="/usr/local/bin"
|
|
fi
|
|
fi
|
|
|
|
# Fallback: ~/.local/bin (no sudo needed)
|
|
if [ -z "$INSTALL_DIR" ]; then
|
|
INSTALL_DIR="${HOME}/.local/bin"
|
|
mkdir -p "$INSTALL_DIR"
|
|
mv "$BIN_PATH" "${INSTALL_DIR}/${BINARY}"
|
|
chmod +x "${INSTALL_DIR}/${BINARY}"
|
|
|
|
# Check if ~/.local/bin is in PATH
|
|
case ":${PATH}:" in
|
|
*":${INSTALL_DIR}:"*) ;;
|
|
*)
|
|
NEEDS_PATH_HINT="true"
|
|
;;
|
|
esac
|
|
else
|
|
if [ -f "$BIN_PATH" ]; then
|
|
mv "$BIN_PATH" "${INSTALL_DIR}/${BINARY}"
|
|
chmod +x "${INSTALL_DIR}/${BINARY}"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo " Installed transmute $TAG to ${INSTALL_DIR}/${BINARY}"
|
|
echo ""
|
|
|
|
# If we installed to a dir not in PATH, tell the user how to fix it
|
|
if [ "$NEEDS_PATH_HINT" = "true" ]; then
|
|
SHELL_NAME="$(basename "$SHELL")"
|
|
case "$SHELL_NAME" in
|
|
zsh) RC_FILE="~/.zshrc" ;;
|
|
bash) RC_FILE="~/.bashrc" ;;
|
|
fish) RC_FILE="~/.config/fish/config.fish" ;;
|
|
*) RC_FILE="your shell config" ;;
|
|
esac
|
|
|
|
echo " To make it globally available, add ~/.local/bin to your PATH:"
|
|
echo ""
|
|
if [ "$SHELL_NAME" = "fish" ]; then
|
|
echo " fish_add_path ${INSTALL_DIR}"
|
|
else
|
|
echo " echo 'export PATH=\"\$HOME/.local/bin:\$PATH\"' >> ${RC_FILE}"
|
|
fi
|
|
echo ""
|
|
echo " Then restart your terminal, or run:"
|
|
echo ""
|
|
if [ "$SHELL_NAME" = "fish" ]; then
|
|
echo " fish_add_path ${INSTALL_DIR}"
|
|
else
|
|
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
fi
|
|
echo ""
|
|
fi
|
|
|
|
echo " Get started:"
|
|
echo " transmute *.png Convert all PNGs"
|
|
echo " transmute ./photos/ Convert all files in a directory"
|
|
echo " transmute --help Show all options"
|
|
echo ""
|