File: install-git-hooks.sh

package info (click to toggle)
llama.cpp 6641%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 43,824 kB
  • sloc: cpp: 218,020; ansic: 117,624; python: 29,020; lisp: 9,094; sh: 5,776; objc: 1,045; javascript: 828; xml: 259; makefile: 219
file content (202 lines) | stat: -rwxr-xr-x 6,228 bytes parent folder | download
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
191
192
193
194
195
196
197
198
199
200
201
202
#!/bin/bash

# Script to install pre-commit and pre-push hooks for webui
# Pre-commit: formats code and runs checks
# Pre-push: builds the project, stashes unstaged changes

REPO_ROOT=$(git rev-parse --show-toplevel)
PRE_COMMIT_HOOK="$REPO_ROOT/.git/hooks/pre-commit"
PRE_PUSH_HOOK="$REPO_ROOT/.git/hooks/pre-push"

echo "Installing pre-commit and pre-push hooks for webui..."

# Create the pre-commit hook
cat > "$PRE_COMMIT_HOOK" << 'EOF'
#!/bin/bash

# Check if there are any changes in the webui directory
if git diff --cached --name-only | grep -q "^tools/server/webui/"; then
    echo "Formatting and checking webui code..."
    
    # Change to webui directory and run format
    cd tools/server/webui
    
    # Check if npm is available and package.json exists
    if [ ! -f "package.json" ]; then
        echo "Error: package.json not found in tools/server/webui"
        exit 1
    fi
    
    # Run the format command
    npm run format

    # Check if format command succeeded
    if [ $? -ne 0 ]; then
        echo "Error: npm run format failed"
        exit 1
    fi

    # Run the lint command
    npm run lint
    
    # Check if lint command succeeded
    if [ $? -ne 0 ]; then
        echo "Error: npm run lint failed"
        exit 1
    fi

    # Run the check command
    npm run check
    
    # Check if check command succeeded
    if [ $? -ne 0 ]; then
        echo "Error: npm run check failed"
        exit 1
    fi

    # Go back to repo root
    cd ../../..
    
    echo "✅ Webui code formatted and checked successfully"
fi

exit 0
EOF

# Create the pre-push hook
cat > "$PRE_PUSH_HOOK" << 'EOF'
#!/bin/bash

# Check if there are any webui changes that need building
WEBUI_CHANGES=$(git diff --name-only @{push}..HEAD | grep "^tools/server/webui/" || true)

if [ -n "$WEBUI_CHANGES" ]; then
    echo "Webui changes detected, checking if build is up-to-date..."
    
    # Change to webui directory
    cd tools/server/webui
    
    # Check if npm is available and package.json exists
    if [ ! -f "package.json" ]; then
        echo "Error: package.json not found in tools/server/webui"
        exit 1
    fi
    
    # Check if build output exists and is newer than source files
    BUILD_FILE="../public/index.html.gz"
    NEEDS_BUILD=false
    
    if [ ! -f "$BUILD_FILE" ]; then
        echo "Build output not found, building..."
        NEEDS_BUILD=true
    else
        # Check if any source files are newer than the build output
        if find src -newer "$BUILD_FILE" -type f | head -1 | grep -q .; then
            echo "Source files are newer than build output, rebuilding..."
            NEEDS_BUILD=true
        fi
    fi
    
    if [ "$NEEDS_BUILD" = true ]; then
        echo "Building webui..."
        
        # Stash any unstaged changes to avoid conflicts during build
        echo "Checking for unstaged changes..."
        if ! git diff --quiet || ! git diff --cached --quiet --diff-filter=A; then
            echo "Stashing unstaged changes..."
            git stash push --include-untracked -m "Pre-push hook: stashed unstaged changes"
            STASH_CREATED=$?
        else
            echo "No unstaged changes to stash"
            STASH_CREATED=1
        fi
        
        # Run the build command
        npm run build
        
        # Check if build command succeeded
        if [ $? -ne 0 ]; then
            echo "Error: npm run build failed"
            if [ $STASH_CREATED -eq 0 ]; then
                echo "You can restore your unstaged changes with: git stash pop"
            fi
            exit 1
        fi

        # Go back to repo root
        cd ../../..
        
        # Check if build output was created/updated
        if [ -f "tools/server/public/index.html.gz" ]; then
            # Add the build output and commit it
            git add tools/server/public/index.html.gz
            if ! git diff --cached --quiet; then
                echo "Committing updated build output..."
                git commit -m "chore: update webui build output"
                echo "✅ Build output committed successfully"
            else
                echo "Build output unchanged"
            fi
        else
            echo "Error: Build output not found after build"
            if [ $STASH_CREATED -eq 0 ]; then
                echo "You can restore your unstaged changes with: git stash pop"
            fi
            exit 1
        fi
        
        if [ $STASH_CREATED -eq 0 ]; then
            echo "✅ Build completed. Your unstaged changes have been stashed."
            echo "They will be automatically restored after the push."
            # Create a marker file to indicate stash was created by pre-push hook
            touch .git/WEBUI_PUSH_STASH_MARKER
        fi
    else
        echo "✅ Build output is up-to-date"
    fi
    
    echo "✅ Webui ready for push"
fi

exit 0
EOF

# Create the post-push hook (for restoring stashed changes after push)
cat > "$REPO_ROOT/.git/hooks/post-push" << 'EOF'
#!/bin/bash

# Check if we have a stash marker from the pre-push hook
if [ -f .git/WEBUI_PUSH_STASH_MARKER ]; then
    echo "Restoring your unstaged changes after push..."
    git stash pop
    rm -f .git/WEBUI_PUSH_STASH_MARKER
    echo "✅ Your unstaged changes have been restored."
fi

exit 0
EOF

# Make all hooks executable
chmod +x "$PRE_COMMIT_HOOK"
chmod +x "$PRE_PUSH_HOOK"
chmod +x "$REPO_ROOT/.git/hooks/post-push"

if [ $? -eq 0 ]; then
    echo "✅ Git hooks installed successfully!"
    echo "   Pre-commit: $PRE_COMMIT_HOOK"
    echo "   Pre-push:   $PRE_PUSH_HOOK"
    echo "   Post-push:  $REPO_ROOT/.git/hooks/post-push"
    echo ""
    echo "The hooks will automatically:"
    echo "  • Format and check webui code before commits (pre-commit)"
    echo "  • Build webui code before pushes (pre-push)"
    echo "  • Stash unstaged changes during build process"
    echo "  • Restore your unstaged changes after the push"
    echo ""
    echo "To test the hooks:"
    echo "  • Make a change to a file in the webui directory and commit it (triggers format/check)"
    echo "  • Push your commits to trigger the build process"
else
    echo "❌ Failed to make hooks executable"
    exit 1
fi