/ veet / install.sh
swadhinbiswas feat(install): pin nerd font release to v3.3.0 with SHA256 verification and add ref cloning support · 8/17/2026
41c3a00
190 lines · 7.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/usr/bin/env bash
# ==============================================================================
#  VEET Installer
#  Universal Linux App Uninstaller & Deep-Clean Residual Purger
# ==============================================================================

set -e

# Colors
BOLD='\033[1m'
CYAN='\033[0;36m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

printf "\n${CYAN}${BOLD}╔═══════════════════════════════════════════════╗${NC}\n"
printf "${CYAN}${BOLD}║              VEET Auto-Installer              ║${NC}\n"
printf "${CYAN}${BOLD}║      Universal Linux App Uninstaller          ║${NC}\n"
printf "${CYAN}${BOLD}╚═══════════════════════════════════════════════╝${NC}\n\n"

# 1. Determine destination directory
if [ "$(id -u)" -eq 0 ]; then
    INSTALL_DIR="/usr/local/bin"
else
    INSTALL_DIR="$HOME/.local/bin"
fi

mkdir -p "$INSTALL_DIR"

# 2. Locate Go compiler
GO_CMD=""
if command -v go >/dev/null 2>&1; then
    GO_CMD="go"
elif [ -x "$HOME/.local/go/bin/go" ]; then
    GO_CMD="$HOME/.local/go/bin/go"
elif [ -x "/usr/local/go/bin/go" ]; then
    GO_CMD="/usr/local/go/bin/go"
fi

if [ -z "$GO_CMD" ]; then
    printf "${RED}✗ Error:${NC} Go compiler (Go 1.24+) not found.\n"
    printf "Please install Go from ${CYAN}https://go.dev/dl/${NC} and run this installer again.\n\n"
    exit 1
fi

GO_VERSION=$($GO_CMD version | awk '{print $3}')
printf "${GREEN}✓${NC} Found Go compiler: ${BOLD}%s${NC} (%s)\n" "$GO_CMD" "$GO_VERSION"

# 3. Determine build directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TMP_BUILD=""

if [ -f "$SCRIPT_DIR/main.go" ] && [ -f "$SCRIPT_DIR/go.mod" ]; then
    SRC_DIR="$SCRIPT_DIR"
    printf "${GREEN}✓${NC} Installing from local source: ${BOLD}%s${NC}\n" "$SRC_DIR"
else
    VEET_REF="${VEET_VERSION:-main}"
    printf "${YELLOW}•${NC} Fetching VEET repository (${CYAN}%s${NC})...\n" "$VEET_REF"
    TMP_BUILD=$(mktemp -d)
    if [ "$VEET_REF" = "main" ]; then
        git clone --depth 1 https://github.com/swadhinbiswas/veet.git "$TMP_BUILD"
    else
        git clone --depth 1 --branch "$VEET_REF" https://github.com/swadhinbiswas/veet.git "$TMP_BUILD"
    fi
    SRC_DIR="$TMP_BUILD"
fi

# Cleanup on exit if temp dir was created
cleanup() {
    if [ -n "$TMP_BUILD" ] && [ -d "$TMP_BUILD" ]; then
        rm -rf "$TMP_BUILD"
    fi
}
trap cleanup EXIT

# 4. Build single binary
printf "${YELLOW}•${NC} Compiling veet single binary...\n"
cd "$SRC_DIR"
"$GO_CMD" build -ldflags="-s -w" -o "$INSTALL_DIR/veet" .
chmod +x "$INSTALL_DIR/veet"

printf "${GREEN}✓${NC} Installed binary to: ${BOLD}%s/veet${NC}\n" "$INSTALL_DIR"

# 5. Shell autocompletions
printf "${YELLOW}•${NC} Configuring shell autocompletions...\n"

# Bash completion
if [ -d "$HOME/.local/share/bash-completion/completions" ] || mkdir -p "$HOME/.local/share/bash-completion/completions" 2>/dev/null; then
    "$INSTALL_DIR/veet" completion bash > "$HOME/.local/share/bash-completion/completions/veet" 2>/dev/null || true
fi

# Zsh completion
if [ -d "$HOME/.local/share/zsh/site-functions" ] || mkdir -p "$HOME/.local/share/zsh/site-functions" 2>/dev/null; then
    "$INSTALL_DIR/veet" completion zsh > "$HOME/.local/share/zsh/site-functions/_veet" 2>/dev/null || true
fi

# Fish completion
if [ -d "$HOME/.config/fish/completions" ] || mkdir -p "$HOME/.config/fish/completions" 2>/dev/null; then
    "$INSTALL_DIR/veet" completion fish > "$HOME/.config/fish/completions/veet.fish" 2>/dev/null || true
fi

printf "${GREEN}✓${NC} Shell completions generated.\n"

# 6. Auto-install Nerd Font Symbols if missing
printf "${YELLOW}•${NC} Checking Nerd Font icon support...\n"
HAS_NERD=false
if command -v fc-list >/dev/null 2>&1; then
    if fc-list : family | grep -qi "Nerd Font"; then
        HAS_NERD=true
        printf "${GREEN}✓${NC} Nerd Font detected in fontconfig.\n"
    fi
fi

if [ "$HAS_NERD" = false ]; then
    if [ "$(id -u)" -eq 0 ]; then
        FONT_DIR="/usr/local/share/fonts/NerdFonts"
    else
        FONT_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/fonts/NerdFonts"
    fi
    mkdir -p "$FONT_DIR"
    FONT_FILE="$FONT_DIR/SymbolsNerdFont-Regular.ttf"
    FONT_MONO="$FONT_DIR/SymbolsNerdFontMono-Regular.ttf"

    if [ ! -f "$FONT_FILE" ] || [ ! -f "$FONT_MONO" ]; then
        printf "${YELLOW}•${NC} Downloading official Nerd Font Symbols into ${BOLD}%s${NC}...\n" "$FONT_DIR"
        FONT_URL="https://github.com/ryanoasis/nerd-fonts/raw/v3.3.0/patched-fonts/NerdFontsSymbolsOnly/SymbolsNerdFont-Regular.ttf"
        FONT_MONO_URL="https://github.com/ryanoasis/nerd-fonts/raw/v3.3.0/patched-fonts/NerdFontsSymbolsOnly/SymbolsNerdFontMono-Regular.ttf"
        FONT_HASH="d7cda3a97797a3764b80a8df8b54f2bd7229a12cbc75c9c74f31496866c6eee9"
        FONT_MONO_HASH="7f14415832a929155c3d6d1c7d404fae00dfbfe4f1b29940e3736e6e790e3312"
        
        FONT_FILE_TMP="${FONT_FILE}.tmp.$$"
        FONT_MONO_TMP="${FONT_MONO}.tmp.$$"
        DOWNLOADED=false

        if command -v curl >/dev/null 2>&1; then
            if curl -fLo "$FONT_FILE_TMP" "$FONT_URL" 2>/dev/null && curl -fLo "$FONT_MONO_TMP" "$FONT_MONO_URL" 2>/dev/null; then
                DOWNLOADED=true
            fi
        elif command -v wget >/dev/null 2>&1; then
            if wget -qO "$FONT_FILE_TMP" "$FONT_URL" 2>/dev/null && wget -qO "$FONT_MONO_TMP" "$FONT_MONO_URL" 2>/dev/null; then
                DOWNLOADED=true
            fi
        fi

        # Verify SHA256 checksums if sha256sum utility is available
        VALID_CHECKSUM=true
        if [ "$DOWNLOADED" = true ] && command -v sha256sum >/dev/null 2>&1; then
            CALC_HASH=$(sha256sum "$FONT_FILE_TMP" | awk '{print $1}')
            CALC_MONO_HASH=$(sha256sum "$FONT_MONO_TMP" | awk '{print $1}')
            if [ "$CALC_HASH" != "$FONT_HASH" ] || [ "$CALC_MONO_HASH" != "$FONT_MONO_HASH" ]; then
                VALID_CHECKSUM=false
            fi
        fi

        if [ "$DOWNLOADED" = true ] && [ "$VALID_CHECKSUM" = true ] && [ -s "$FONT_FILE_TMP" ] && [ -s "$FONT_MONO_TMP" ]; then
            mv -f "$FONT_FILE_TMP" "$FONT_FILE"
            mv -f "$FONT_MONO_TMP" "$FONT_MONO"
            if command -v fc-cache >/dev/null 2>&1; then
                fc-cache -f "$FONT_DIR" 2>/dev/null || true
            fi
            printf "${GREEN}✓${NC} Installed Nerd Font Symbols fallback font (v3.3.0).\n"
        else
            rm -f "$FONT_FILE_TMP" "$FONT_MONO_TMP"
            printf "${YELLOW}• Note:${NC} Could not auto-download font. VEET will use universal Unicode fallback (${CYAN}icons: auto${NC}).\n"
        fi
    else
        printf "${GREEN}✓${NC} Nerd Font Symbols already present in %s.\n" "$FONT_DIR"
    fi
fi

# 7. Verify PATH
IN_PATH=false
case ":$PATH:" in
    *":$INSTALL_DIR:"*) IN_PATH=true ;;
esac

printf "\n${GREEN}${BOLD}🎉 Installation Complete!${NC}\n\n"

if [ "$IN_PATH" = false ]; then
    printf "${YELLOW}⚠ Notice:${NC} ${BOLD}%s${NC} is not currently in your \$PATH.\n" "$INSTALL_DIR"
    printf "Add it by running the following command (or add to your ~/.bashrc / ~/.zshrc):\n\n"
    printf "    ${CYAN}export PATH=\"\$PATH:%s\"${NC}\n\n" "$INSTALL_DIR"
fi

printf "To launch VEET:\n"
printf "    ${CYAN}veet${NC}         # Launch interactive TUI\n"
printf "    ${CYAN}veet scan${NC}    # List installed apps across all sources\n"
printf "    ${CYAN}veet --help${NC}  # View CLI commands and flags\n\n"