|
|
#!/bin/bash |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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..." |
|
|
|
|
|
|
|
|
cat > "$PRE_COMMIT_HOOK" << 'EOF' |
|
|
|
|
|
|
|
|
|
|
|
if git diff --cached --name-only | grep -q "^tools/server/webui/"; then |
|
|
echo "Formatting and checking webui code..." |
|
|
|
|
|
|
|
|
cd tools/server/webui |
|
|
|
|
|
|
|
|
if [ ! -f "package.json" ]; then |
|
|
echo "Error: package.json not found in tools/server/webui" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
npm run format |
|
|
|
|
|
|
|
|
if [ $? -ne 0 ]; then |
|
|
echo "Error: npm run format failed" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
npm run lint |
|
|
|
|
|
|
|
|
if [ $? -ne 0 ]; then |
|
|
echo "Error: npm run lint failed" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
npm run check |
|
|
|
|
|
|
|
|
if [ $? -ne 0 ]; then |
|
|
echo "Error: npm run check failed" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
cd ../../.. |
|
|
|
|
|
echo "✅ Webui code formatted and checked successfully" |
|
|
fi |
|
|
|
|
|
exit 0 |
|
|
EOF |
|
|
|
|
|
|
|
|
cat > "$PRE_PUSH_HOOK" << 'EOF' |
|
|
|
|
|
|
|
|
|
|
|
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..." |
|
|
|
|
|
|
|
|
cd tools/server/webui |
|
|
|
|
|
|
|
|
if [ ! -f "package.json" ]; then |
|
|
echo "Error: package.json not found in tools/server/webui" |
|
|
exit 1 |
|
|
fi |
|
|
|
|
|
|
|
|
BUILD_FILE="../public/index.html.gz" |
|
|
NEEDS_BUILD=false |
|
|
|
|
|
if [ ! -f "$BUILD_FILE" ]; then |
|
|
echo "Build output not found, building..." |
|
|
NEEDS_BUILD=true |
|
|
else |
|
|
|
|
|
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..." |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
npm run build |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
cd ../../.. |
|
|
|
|
|
|
|
|
if [ -f "tools/server/public/index.html.gz" ]; then |
|
|
|
|
|
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." |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
cat > "$REPO_ROOT/.git/hooks/post-push" << 'EOF' |
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
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 |
|
|
|