Files
wehub-resource-sync 8c89588461
CI / Coverage (push) Waiting to run
CI / Format (push) Waiting to run
CI / Clippy (push) Waiting to run
CI / Test (push) Waiting to run
CI / Nix Build (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:16:47 +08:00

253 lines
7.0 KiB
Bash
Executable File

#!/bin/bash
# GitType installer script
# Usage: curl -sSL https://raw.githubusercontent.com/unhappychoice/gittype/main/install.sh | bash
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
# Default values
VERSION="latest"
INSTALL_DIR="/usr/local/bin"
# Help function
show_help() {
cat << EOF
GitType installer script
Usage: $0 [options]
Options:
-v, --version VERSION Install specific version (default: latest)
-d, --dir DIRECTORY Install directory (default: /usr/local/bin)
-h, --help Show this help message
Examples:
$0 # Install latest version to /usr/local/bin
$0 -v v0.5.0 # Install specific version
$0 -d ~/.local/bin # Install to user directory (no sudo required)
One-liner installation:
curl -sSL https://raw.githubusercontent.com/unhappychoice/gittype/main/install.sh | bash
EOF
}
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-v|--version)
VERSION="$2"
shift 2
;;
-d|--dir)
INSTALL_DIR="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo -e "${RED}Unknown option: $1${NC}" >&2
show_help
exit 1
;;
esac
done
# Detect OS and architecture
detect_platform() {
local os
local arch
case "$(uname -s)" in
Darwin*)
os="apple-darwin"
;;
Linux*)
os="unknown-linux-gnu"
;;
MINGW*|MSYS*|CYGWIN*)
os="pc-windows-msvc"
;;
*)
echo -e "${RED}Unsupported operating system: $(uname -s)${NC}" >&2
exit 1
;;
esac
case "$(uname -m)" in
x86_64|amd64)
arch="x86_64"
;;
aarch64|arm64)
arch="aarch64"
;;
*)
echo -e "${RED}Unsupported architecture: $(uname -m)${NC}" >&2
exit 1
;;
esac
echo "${arch}-${os}"
}
# Get latest version from GitHub API
get_latest_version() {
curl -sSL https://api.github.com/repos/unhappychoice/gittype/releases/latest | \
grep '"tag_name":' | \
head -n 1 | \
cut -d'"' -f4
}
# Check if sudo is needed for installation directory
check_sudo_needed() {
local install_dir="$1"
# If directory doesn't exist, check parent directory
local check_dir="$install_dir"
while [[ ! -d "$check_dir" && "$check_dir" != "/" ]]; do
check_dir="$(dirname "$check_dir")"
done
# Test if we can actually write to the directory by creating a test file
local test_file="$check_dir/.gittype_install_test_$$"
if touch "$test_file" 2>/dev/null; then
rm -f "$test_file" 2>/dev/null
return 1 # No sudo needed
else
return 0 # Sudo needed
fi
}
# Download and install gittype
install_gittype() {
local platform
local download_url
local temp_dir
local binary_name="gittype"
platform=$(detect_platform)
if [[ "$VERSION" == "latest" ]]; then
echo -e "${BLUE}Fetching latest version...${NC}"
VERSION=$(get_latest_version)
fi
if [[ "$platform" == *"pc-windows-msvc"* ]]; then
download_url="https://github.com/unhappychoice/gittype/releases/download/${VERSION}/gittype-${VERSION}-${platform}.zip"
binary_name="gittype.exe"
else
download_url="https://github.com/unhappychoice/gittype/releases/download/${VERSION}/gittype-${VERSION}-${platform}.tar.gz"
fi
echo -e "${BLUE}Installing GitType ${VERSION} for ${platform}...${NC}"
echo -e "${BLUE}Download URL: ${download_url}${NC}"
# Create temporary directory
temp_dir=$(mktemp -d)
trap "rm -rf $temp_dir" EXIT
# Download archive
echo -e "${BLUE}Downloading...${NC}"
if ! curl -sSL "$download_url" -o "$temp_dir/gittype-archive"; then
echo -e "${RED}Failed to download GitType. Please check if version ${VERSION} exists.${NC}" >&2
exit 1
fi
# Extract archive
echo -e "${BLUE}Extracting...${NC}"
cd "$temp_dir"
if [[ "$download_url" == *.zip ]]; then
unzip -q gittype-archive
else
tar -xzf gittype-archive
fi
# Check if sudo is needed
local use_sudo=""
if check_sudo_needed "$INSTALL_DIR"; then
echo -e "${YELLOW}⚠️ Installing to ${INSTALL_DIR} requires sudo privileges${NC}"
# Check if sudo is available
if ! command -v sudo >/dev/null 2>&1; then
echo -e "${RED}Error: sudo is required but not available${NC}" >&2
echo -e "${BLUE}💡 Try installing to a user directory instead:${NC}"
if [[ "$(uname -s)" == "Darwin" ]]; then
echo -e "${BLUE} $0 -d \$HOME/.local/bin${NC}"
echo -e "${BLUE} $0 -d /opt/homebrew/bin # if using Homebrew${NC}"
else
echo -e "${BLUE} $0 -d \$HOME/.local/bin${NC}"
fi
exit 1
fi
echo -e "${BLUE}You may be prompted for your password...${NC}"
use_sudo="sudo"
fi
# Create install directory if it doesn't exist
if [[ -n "$use_sudo" ]]; then
sudo mkdir -p "$INSTALL_DIR"
else
mkdir -p "$INSTALL_DIR"
fi
# Install binary
echo -e "${BLUE}Installing to ${INSTALL_DIR}...${NC}"
if [[ -f "$binary_name" ]]; then
if [[ -n "$use_sudo" ]]; then
sudo cp "$binary_name" "$INSTALL_DIR/"
sudo chmod +x "$INSTALL_DIR/$binary_name"
else
cp "$binary_name" "$INSTALL_DIR/"
chmod +x "$INSTALL_DIR/$binary_name"
fi
else
echo -e "${RED}Binary not found in archive${NC}" >&2
exit 1
fi
echo -e "${GREEN}✅ GitType ${VERSION} installed successfully!${NC}"
echo -e "${GREEN} Location: ${INSTALL_DIR}/${binary_name}${NC}"
# Check if install directory is in PATH
if [[ ":$PATH:" != *":$INSTALL_DIR:"* ]]; then
echo -e "${YELLOW}⚠️ Warning: ${INSTALL_DIR} is not in your PATH${NC}"
echo -e "${YELLOW} Add it to your shell profile:${NC}"
echo -e "${YELLOW} export PATH=\"${INSTALL_DIR}:\$PATH\"${NC}"
echo
fi
# Test installation
if command -v gittype >/dev/null 2>&1; then
echo -e "${GREEN}🎮 Ready to play! Run 'gittype' to start typing practice${NC}"
else
echo -e "${BLUE}💡 Run '${INSTALL_DIR}/gittype' to start typing practice${NC}"
fi
}
# Main execution
main() {
echo -e "${GREEN}GitType Installation Script${NC}"
echo "================================="
echo
# Check required commands
for cmd in curl tar; do
if ! command -v $cmd >/dev/null 2>&1; then
echo -e "${RED}Error: $cmd is required but not installed${NC}" >&2
exit 1
fi
done
install_gittype
}
main "$@"