ui: Improve Git Hooks for UI development (#23403)
* refactor: Improve Git Hooks for UI development * fix: Address review comments * fix: Use absolute git path for `/hooks` Co-authored-by: Pascal <admin@serveurperso.com> --------- Co-authored-by: Pascal <admin@serveurperso.com>
This commit is contained in:
co-authored by
Pascal
parent
2754ce1b3e
commit
5e932a1c8d
@@ -11,24 +11,28 @@
|
|||||||
|
|
||||||
cd ../../
|
cd ../../
|
||||||
|
|
||||||
|
# Ensure node_modules are installed
|
||||||
|
if [ ! -d "tools/ui/node_modules" ]; then
|
||||||
|
echo "📦 Installing npm dependencies..."
|
||||||
|
cd tools/ui && npm install && cd ../../
|
||||||
|
fi
|
||||||
|
|
||||||
# Check and install git hooks if missing
|
# Check and install git hooks if missing
|
||||||
check_and_install_hooks() {
|
check_and_install_hooks() {
|
||||||
local hooks_missing=false
|
local hooks_missing=false
|
||||||
|
|
||||||
# Check for required hooks
|
# Check for required hooks
|
||||||
if [ ! -f ".git/hooks/pre-commit" ] || [ ! -f ".git/hooks/pre-push" ] || [ ! -f ".git/hooks/post-push" ]; then
|
if [ ! -f ".git/hooks/pre-commit" ] || [ ! -f ".git/hooks/pre-push" ]; then
|
||||||
hooks_missing=true
|
hooks_missing=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$hooks_missing" = true ]; then
|
if [ "$hooks_missing" = true ]; then
|
||||||
echo "🔧 Git hooks missing, installing them..."
|
echo "🔧 Git hooks missing, installing them..."
|
||||||
cd tools/ui
|
if bash "$(dirname "$0")/git-hooks/install.sh"; then
|
||||||
if bash scripts/install-git-hooks.sh; then
|
|
||||||
echo "✅ Git hooks installed successfully"
|
echo "✅ Git hooks installed successfully"
|
||||||
else
|
else
|
||||||
echo "⚠️ Failed to install git hooks, continuing anyway..."
|
echo "⚠️ Failed to install git hooks, continuing anyway..."
|
||||||
fi
|
fi
|
||||||
cd ../../
|
|
||||||
else
|
else
|
||||||
echo "✅ Git hooks already installed"
|
echo "✅ Git hooks already installed"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Executable
+35
@@ -0,0 +1,35 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Install git hooks for llama-ui
|
||||||
|
# Copies pre-commit and pre-push hooks into the repo's .git/hooks directory.
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
|
||||||
|
HOOKS_DIR="$REPO_ROOT/$(cd "$REPO_ROOT" && git rev-parse --git-path hooks)"
|
||||||
|
|
||||||
|
# Verify package.json exists
|
||||||
|
if [ ! -f "$REPO_ROOT/tools/ui/package.json" ]; then
|
||||||
|
echo "❌ package.json not found in tools/ui"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Installing git hooks for llama-ui..."
|
||||||
|
|
||||||
|
for hook in pre-commit pre-push; do
|
||||||
|
src="$SCRIPT_DIR/${hook}.sh"
|
||||||
|
dst="$HOOKS_DIR/$hook"
|
||||||
|
|
||||||
|
if cp "$src" "$dst" && chmod +x "$dst"; then
|
||||||
|
echo " ✅ $hook"
|
||||||
|
else
|
||||||
|
echo " ❌ Failed to install $hook"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Pre-commit: format (staged) + type-check"
|
||||||
|
echo "Pre-push: lint + test"
|
||||||
|
echo ""
|
||||||
|
echo "Hooks stash unstaged changes temporarily and restore them after."
|
||||||
|
echo "Skip with: git commit --no-verify / git push --no-verify"
|
||||||
Executable
+57
@@ -0,0 +1,57 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Pre-commit hook for llama-ui
|
||||||
|
# Runs: format (staged files only) + type-check
|
||||||
|
# Stashes unstaged changes temporarily and restores them after.
|
||||||
|
|
||||||
|
# Only run when there are staged changes in tools/ui/
|
||||||
|
if ! git diff --cached --name-only | grep -q "^tools/ui/"; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
REPO_ROOT=$(git rev-parse --show-toplevel)
|
||||||
|
cd "$REPO_ROOT/tools/ui"
|
||||||
|
|
||||||
|
# Check that node_modules exists
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
echo "❌ node_modules not found. Run 'npm install' first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stash unstaged changes in tools/ui/ so they don't interfere
|
||||||
|
stash_name="pi-ui-precommit"
|
||||||
|
git stash push --keep-index -u -m "$stash_name" -- tools/ui/ 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "Running pre-commit checks for llama-ui..."
|
||||||
|
|
||||||
|
# Format only staged files
|
||||||
|
staged_ui=$(git diff --cached --name-only -- tools/ui/)
|
||||||
|
if [ -n "$staged_ui" ]; then
|
||||||
|
echo "$staged_ui" | xargs npx --no-install prettier --write
|
||||||
|
format_ok=$?
|
||||||
|
# Re-stage formatted files
|
||||||
|
git add tools/ui/
|
||||||
|
else
|
||||||
|
format_ok=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Type-check the clean tree
|
||||||
|
npm run check
|
||||||
|
check_ok=$?
|
||||||
|
|
||||||
|
# Restore stashed changes
|
||||||
|
if git stash list | grep -q "$stash_name"; then
|
||||||
|
git stash pop 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $format_ok -ne 0 ]; then
|
||||||
|
echo "❌ Format failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ $check_ok -ne 0 ]; then
|
||||||
|
echo "❌ Type check failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Pre-commit checks passed"
|
||||||
|
exit 0
|
||||||
Executable
+66
@@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Pre-push hook for llama-ui
|
||||||
|
# Runs: lint + test
|
||||||
|
# Ignores unstaged changes (stashes them temporarily and restores after).
|
||||||
|
|
||||||
|
needs_check=false
|
||||||
|
|
||||||
|
# Read refs from stdin: local_ref local_sha remote_ref remote_sha
|
||||||
|
while read local_ref local_sha remote_ref remote_sha; do
|
||||||
|
# New branch or force-push — always check
|
||||||
|
if [ "$local_sha" = "0000000000000000000000000000000000000000" ] || \
|
||||||
|
[ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then
|
||||||
|
needs_check=true
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for changes in tools/ui/ between remote and local
|
||||||
|
if git diff --name-only "$remote_sha...$local_sha" -- tools/ui/ | grep -q .; then
|
||||||
|
needs_check=true
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$needs_check" = false ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
REPO_ROOT=$(git rev-parse --show-toplevel)
|
||||||
|
cd "$REPO_ROOT/tools/ui"
|
||||||
|
|
||||||
|
# Check that node_modules exists
|
||||||
|
if [ ! -d "node_modules" ]; then
|
||||||
|
echo "❌ node_modules not found. Run 'npm install' first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Stash unstaged changes so they don't interfere with checks
|
||||||
|
stash_name="pi-ui-prepush"
|
||||||
|
git stash push -u -m "$stash_name" -- tools/ui/ 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "Running pre-push checks for llama-ui..."
|
||||||
|
|
||||||
|
# Lint
|
||||||
|
npm run lint
|
||||||
|
lint_ok=$?
|
||||||
|
|
||||||
|
# Test
|
||||||
|
npm test
|
||||||
|
test_ok=$?
|
||||||
|
|
||||||
|
# Restore stashed changes
|
||||||
|
if git stash list | grep -q "$stash_name"; then
|
||||||
|
git stash pop 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $lint_ok -ne 0 ]; then
|
||||||
|
echo "❌ Lint failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ $test_ok -ne 0 ]; then
|
||||||
|
echo "❌ Tests failed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Pre-push checks passed"
|
||||||
|
exit 0
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Script to install pre-commit hook for llama-ui
|
|
||||||
# Pre-commit: formats, checks, and builds the UI app
|
|
||||||
|
|
||||||
REPO_ROOT=$(git rev-parse --show-toplevel)
|
|
||||||
PRE_COMMIT_HOOK="$REPO_ROOT/.git/hooks/pre-commit"
|
|
||||||
|
|
||||||
echo "Installing pre-commit hook for llama-ui..."
|
|
||||||
|
|
||||||
# Create the pre-commit hook
|
|
||||||
cat > "$PRE_COMMIT_HOOK" << 'EOF'
|
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Check if there are any changes in the tools/ui directory
|
|
||||||
if git diff --cached --name-only | grep -q "^tools/ui/"; then
|
|
||||||
REPO_ROOT=$(git rev-parse --show-toplevel)
|
|
||||||
cd "$REPO_ROOT/tools/ui"
|
|
||||||
|
|
||||||
# Check if package.json exists
|
|
||||||
if [ ! -f "package.json" ]; then
|
|
||||||
echo "Error: package.json not found in tools/ui"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Formatting and checking llama-ui code..."
|
|
||||||
|
|
||||||
# Run the format command
|
|
||||||
npm run format
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Error: npm run format failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run the lint command
|
|
||||||
npm run lint
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Error: npm run lint failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run the check command
|
|
||||||
npm run check
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "Error: npm run check failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ llama-ui code formatted and checked successfully"
|
|
||||||
|
|
||||||
# Build the llama-ui
|
|
||||||
echo "Building llama-ui..."
|
|
||||||
npm run build
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "❌ npm run build failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ llama-ui built successfully"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# Make hook executable
|
|
||||||
chmod +x "$PRE_COMMIT_HOOK"
|
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
echo "✅ Git hook installed successfully!"
|
|
||||||
echo " Pre-commit: $PRE_COMMIT_HOOK"
|
|
||||||
echo ""
|
|
||||||
echo "The hook will automatically:"
|
|
||||||
echo " • Format, lint and check llama-ui code before commits"
|
|
||||||
echo " • Build llama-ui"
|
|
||||||
else
|
|
||||||
echo "❌ Failed to make hook executable"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
Reference in New Issue
Block a user