| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #!/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
|