375 lines
9.8 KiB
Bash
Executable File
375 lines
9.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Repository
|
|
REPO="Burhanverse/colloid-icon-theme"
|
|
|
|
# Color codes
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
MAGENTA='\033[0;35m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
# Script variables
|
|
SCHEME=""
|
|
THEME=""
|
|
NOTINT_FLAG=""
|
|
TAG=""
|
|
TEMP_DIR=$(mktemp -d)
|
|
|
|
# Show help message
|
|
show_help() {
|
|
echo -e "${BLUE}Colloid Icon Theme Installer${NC}"
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo
|
|
echo "Options:"
|
|
echo " -h, --help Show this help message"
|
|
echo " -s, --scheme VALUE Set colorscheme (default, nord, dracula, gruvbox, everforest, catppuccin, all)"
|
|
echo " -t, --theme VALUE Set folder color theme (default, purple, pink, red, orange, yellow, green, teal, grey, all)"
|
|
echo " -n, --notint Disable KDE Plasma color tinting"
|
|
echo " -y, --yes Non-interactive mode (uses default options)"
|
|
echo
|
|
}
|
|
|
|
# Check for dependencies
|
|
check_dependencies() {
|
|
local missing_deps=()
|
|
|
|
for cmd in curl unzip; do
|
|
if ! command -v "$cmd" &>/dev/null; then
|
|
missing_deps+=("$cmd")
|
|
fi
|
|
done
|
|
|
|
if [ ${#missing_deps[@]} -gt 0 ]; then
|
|
echo -e "${RED}Error: Required dependencies not found: ${missing_deps[*]}${NC}"
|
|
echo -e "${YELLOW}Please install them and run this script again.${NC}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Clean up function
|
|
clean_up() {
|
|
echo -e "${CYAN}Cleaning up temporary files...${NC}"
|
|
rm -rf "$TEMP_DIR"
|
|
}
|
|
|
|
# Set up trap for unexpected exits
|
|
trap clean_up EXIT INT TERM
|
|
|
|
get_latest_release_tag() {
|
|
echo -e "${CYAN}Fetching the latest release tag...${NC}"
|
|
|
|
# First try GitHub API with expanded error handling
|
|
local api_response
|
|
api_response=$(curl --silent -i "https://api.github.com/repos/$REPO/releases/latest")
|
|
|
|
# Check HTTP status code
|
|
local status_code
|
|
status_code=$(echo "$api_response" | head -n 1 | grep -o "HTTP/[0-9.]* [0-9]*" | cut -d' ' -f2)
|
|
|
|
case "$status_code" in
|
|
200)
|
|
# Success - extract tag
|
|
TAG=$(echo "$api_response" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
|
;;
|
|
404)
|
|
echo -e "${YELLOW}No releases found for $REPO. Trying tags instead...${NC}"
|
|
# Try to get tags as fallback
|
|
local tags_response
|
|
tags_response=$(curl --silent "https://api.github.com/repos/$REPO/tags")
|
|
|
|
if [ "$tags_response" != "[]" ] && [ -n "$tags_response" ]; then
|
|
TAG=$(echo "$tags_response" | grep -m1 '"name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
|
fi
|
|
;;
|
|
403)
|
|
echo -e "${YELLOW}GitHub API rate limit exceeded. Trying alternative method...${NC}"
|
|
# Skip to fallback
|
|
;;
|
|
*)
|
|
echo -e "${YELLOW}GitHub API returned status code: $status_code. Trying alternative method...${NC}"
|
|
# Skip to fallback
|
|
;;
|
|
esac
|
|
|
|
# If API methods failed, try HTML scraping as last resort
|
|
if [ -z "$TAG" ]; then
|
|
echo -e "${YELLOW}Trying alternative method to get latest tag...${NC}"
|
|
TAG=$(curl --silent "https://github.com/$REPO/releases" |
|
|
grep -o 'href="/'$REPO'/releases/tag/[^"]*' |
|
|
head -1 |
|
|
sed 's|href="/'$REPO'/releases/tag/||')
|
|
fi
|
|
|
|
# If we still don't have a tag, try direct download of main branch as last resort
|
|
if [ -z "$TAG" ]; then
|
|
echo -e "${YELLOW}No release tags found. Using main branch instead.${NC}"
|
|
TAG="main"
|
|
# Adjust download URL in download_latest_release function
|
|
USE_MAIN_BRANCH=true
|
|
return
|
|
fi
|
|
|
|
echo -e "${GREEN}Latest release tag is: $TAG${NC}"
|
|
}
|
|
|
|
# Update download_latest_release to handle main branch fallback
|
|
download_latest_release() {
|
|
if [ "${USE_MAIN_BRANCH:-false}" = true ]; then
|
|
DOWNLOAD_URL="https://github.com/$REPO/archive/refs/heads/main.zip"
|
|
echo -e "${CYAN}Downloading main branch from ${DOWNLOAD_URL}...${NC}"
|
|
else
|
|
DOWNLOAD_URL="https://github.com/$REPO/archive/refs/tags/$TAG.zip"
|
|
echo -e "${CYAN}Downloading the release from ${DOWNLOAD_URL}...${NC}"
|
|
fi
|
|
|
|
# Use progress bar with curl
|
|
if ! curl -L --progress-bar -o "$TEMP_DIR/latest_release.zip" "$DOWNLOAD_URL"; then
|
|
echo -e "${RED}Failed to download from GitHub. Please check your internet connection.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${CYAN}Extracting the zip file...${NC}"
|
|
if ! unzip -q -o "$TEMP_DIR/latest_release.zip" -d "$TEMP_DIR"; then
|
|
echo -e "${RED}Failed to extract the zip file.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
EXTRACTED_DIR=$(unzip -Z -1 "$TEMP_DIR/latest_release.zip" | head -n 1 | cut -d '/' -f 1)
|
|
if [ -z "$EXTRACTED_DIR" ]; then
|
|
echo -e "${RED}Could not determine extracted directory.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
cd "$TEMP_DIR/$EXTRACTED_DIR" || {
|
|
echo -e "${RED}Failed to change directory to $TEMP_DIR/$EXTRACTED_DIR${NC}"
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
remove_old_directories() {
|
|
echo -e "${CYAN}Checking for old Colloid-icon-theme directories...${NC}"
|
|
# Use nullglob to handle the case where no matching directories are found
|
|
shopt -s nullglob
|
|
for dir in Colloid-icon-theme-*; do
|
|
if [[ -d "$dir" ]]; then
|
|
echo -e "${RED}Removing existing directory: $dir${NC}"
|
|
rm -rf "$dir"
|
|
fi
|
|
done
|
|
shopt -u nullglob
|
|
}
|
|
|
|
# Colorscheme
|
|
choose_scheme() {
|
|
if [ -n "$SCHEME" ]; then
|
|
return
|
|
fi
|
|
|
|
echo -e "${YELLOW}Choose a folder colorscheme variant:${NC}"
|
|
echo -e "1) ${GREEN}Default${NC}"
|
|
echo -e "2) ${GREEN}Nord${NC}"
|
|
echo -e "3) ${GREEN}Dracula${NC}"
|
|
echo -e "4) ${GREEN}Gruvbox${NC}"
|
|
echo -e "5) ${GREEN}Everforest${NC}"
|
|
echo -e "6) ${GREEN}Catppuccin${NC}"
|
|
echo -e "7) ${GREEN}All${NC}"
|
|
echo -e -n "${MAGENTA}Enter your choice [1-7]: ${NC}"
|
|
read -r scheme_choice
|
|
|
|
case $scheme_choice in
|
|
1) SCHEME="default" ;;
|
|
2) SCHEME="nord" ;;
|
|
3) SCHEME="dracula" ;;
|
|
4) SCHEME="gruvbox" ;;
|
|
5) SCHEME="everforest" ;;
|
|
6) SCHEME="catppuccin" ;;
|
|
7) SCHEME="all" ;;
|
|
*) echo -e "${RED}Invalid choice! Defaulting to 'default'.${NC}"; SCHEME="default" ;;
|
|
esac
|
|
}
|
|
|
|
# Folder color variant
|
|
choose_theme() {
|
|
if [ -n "$THEME" ]; then
|
|
return
|
|
fi
|
|
|
|
echo -e "${YELLOW}Choose a folder color variant:${NC}"
|
|
echo -e "1) ${GREEN}Blue (Default)${NC}"
|
|
echo -e "2) ${GREEN}Purple${NC}"
|
|
echo -e "3) ${GREEN}Pink${NC}"
|
|
echo -e "4) ${GREEN}Red${NC}"
|
|
echo -e "5) ${GREEN}Orange${NC}"
|
|
echo -e "6) ${GREEN}Yellow${NC}"
|
|
echo -e "7) ${GREEN}Green${NC}"
|
|
echo -e "8) ${GREEN}Teal${NC}"
|
|
echo -e "9) ${GREEN}Grey${NC}"
|
|
echo -e "10) ${GREEN}All${NC}"
|
|
echo -e -n "${MAGENTA}Enter your choice [1-10]: ${NC}"
|
|
read -r theme_choice
|
|
|
|
case $theme_choice in
|
|
1) THEME="default" ;;
|
|
2) THEME="purple" ;;
|
|
3) THEME="pink" ;;
|
|
4) THEME="red" ;;
|
|
5) THEME="orange" ;;
|
|
6) THEME="yellow" ;;
|
|
7) THEME="green" ;;
|
|
8) THEME="teal" ;;
|
|
9) THEME="grey" ;;
|
|
10) THEME="all" ;;
|
|
*) echo -e "${RED}Invalid choice! Defaulting to 'default'.${NC}"; THEME="default" ;;
|
|
esac
|
|
}
|
|
|
|
# KDE Plasma tinting option
|
|
is_kde() {
|
|
if [[ "$(echo "$XDG_CURRENT_DESKTOP" | tr '[:upper:]' '[:lower:]')" == *"kde"* ||
|
|
"$(echo "$XDG_SESSION_DESKTOP" | tr '[:upper:]' '[:lower:]')" == *"kde"* ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
is_gnome() {
|
|
if [[ "$(echo "$XDG_CURRENT_DESKTOP" | tr '[:upper:]' '[:lower:]')" == *"gnome"* ||
|
|
"$(echo "$XDG_SESSION_DESKTOP" | tr '[:upper:]' '[:lower:]')" == *"gnome"* ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
choose_notint() {
|
|
# If notint flag is already set via command line, skip this
|
|
if [ -n "$NOTINT_FLAG" ]; then
|
|
return
|
|
fi
|
|
|
|
if is_kde; then
|
|
echo -e "${YELLOW}Disable Follow ColorScheme for folders on KDE Plasma?${NC}"
|
|
echo -e "1) ${GREEN}Yes${NC}"
|
|
echo -e "2) ${GREEN}No${NC}"
|
|
echo -e -n "${MAGENTA}Enter your choice [1-2]: ${NC}"
|
|
read -r notint_choice
|
|
|
|
case $notint_choice in
|
|
1) NOTINT_FLAG="--notint" ;;
|
|
2) NOTINT_FLAG="" ;;
|
|
*) echo -e "${RED}Invalid choice! Defaulting to 'No'.${NC}"; NOTINT_FLAG="" ;;
|
|
esac
|
|
else
|
|
echo -e "${CYAN}Not running KDE Plasma. Skipping tinting option.${NC}"
|
|
NOTINT_FLAG=""
|
|
fi
|
|
}
|
|
|
|
# Set defaults for non-interactive mode
|
|
set_defaults() {
|
|
SCHEME="default"
|
|
THEME="default"
|
|
NOTINT_FLAG=""
|
|
if is_kde; then
|
|
NOTINT_FLAG="" # Default behavior for KDE
|
|
fi
|
|
}
|
|
|
|
# Parse command line arguments
|
|
parse_arguments() {
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-h|--help)
|
|
show_help
|
|
exit 0
|
|
;;
|
|
-s|--scheme)
|
|
SCHEME="$2"
|
|
shift 2
|
|
;;
|
|
-t|--theme)
|
|
THEME="$2"
|
|
shift 2
|
|
;;
|
|
-n|--notint)
|
|
NOTINT_FLAG="--notint"
|
|
shift
|
|
;;
|
|
-y|--yes)
|
|
NON_INTERACTIVE=true
|
|
shift
|
|
;;
|
|
*)
|
|
echo -e "${RED}Unknown option: $1${NC}"
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Validate scheme and theme if provided
|
|
if [ -n "$SCHEME" ]; then
|
|
case "$SCHEME" in
|
|
default|nord|dracula|gruvbox|everforest|catppuccin|all) ;;
|
|
*)
|
|
echo -e "${RED}Invalid scheme: $SCHEME${NC}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
if [ -n "$THEME" ]; then
|
|
case "$THEME" in
|
|
default|purple|pink|red|orange|yellow|green|teal|grey|all) ;;
|
|
*)
|
|
echo -e "${RED}Invalid theme: $THEME${NC}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
fi
|
|
}
|
|
|
|
# Main
|
|
main() {
|
|
check_dependencies
|
|
parse_arguments "$@"
|
|
|
|
echo -e "${BLUE}Starting Colloid Icon Theme Installer...${NC}"
|
|
|
|
# Set defaults in non-interactive mode
|
|
if [ "${NON_INTERACTIVE:-false}" = true ]; then
|
|
set_defaults
|
|
fi
|
|
|
|
get_latest_release_tag
|
|
|
|
# Get user choices if not in non-interactive mode
|
|
if [ "${NON_INTERACTIVE:-false}" != true ]; then
|
|
choose_scheme
|
|
choose_theme
|
|
choose_notint
|
|
fi
|
|
|
|
remove_old_directories
|
|
download_latest_release
|
|
|
|
# Create installation command
|
|
INSTALL_CMD="./install.sh -s \"$SCHEME\" -t \"$THEME\""
|
|
if [ -n "$NOTINT_FLAG" ]; then
|
|
INSTALL_CMD="$INSTALL_CMD $NOTINT_FLAG"
|
|
fi
|
|
|
|
echo -e "${CYAN}Running the install script...${NC}"
|
|
echo -e "${YELLOW}Command: $INSTALL_CMD${NC}"
|
|
eval "$INSTALL_CMD"
|
|
|
|
cd - > /dev/null
|
|
echo -e "${GREEN}Installation completed successfully.${NC}"
|
|
}
|
|
|
|
main "$@" |