mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			203 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 | 
