mirror of
https://github.com/vinceliuice/Colloid-icon-theme.git
synced 2026-08-25 12:22:31 -07:00
Was listed as "Burhanverse/colloid-icon-theme" which is 91 commits behind `vinceliuice/Colloid-icon-theme` at the time of writing, so it is corrected for those inclined to use it to ease variant installation.
376 lines
9.8 KiB
Bash
Executable File
376 lines
9.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Repository
|
|
REPO="vinceliuice/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 "$@"
|