191 lines
5.9 KiB
Bash
Executable File
191 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Clean Branch Script
|
|
# Safely removes common personal development artifacts before PR submission
|
|
# Part of the open-source-contributions skill
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[1;33m'
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
echo -e "${BLUE}====================================${NC}"
|
|
echo -e "${BLUE} Clean Branch for PR${NC}"
|
|
echo -e "${BLUE}====================================${NC}"
|
|
echo ""
|
|
|
|
# Check if we're in a git repository
|
|
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
|
echo -e "${RED}✗ Not in a git repository${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
# Interactive mode flag
|
|
INTERACTIVE=true
|
|
if [ "$1" = "--non-interactive" ] || [ "$1" = "-y" ]; then
|
|
INTERACTIVE=false
|
|
fi
|
|
|
|
# Files to potentially remove
|
|
PERSONAL_FILES=(
|
|
"SESSION.md"
|
|
"NOTES.md"
|
|
"TODO.md"
|
|
"SCRATCH.md"
|
|
"DEBUGGING.md"
|
|
"TESTING.md"
|
|
)
|
|
|
|
FOUND_FILES=()
|
|
|
|
echo -e "${BLUE}Scanning for personal development artifacts...${NC}"
|
|
echo ""
|
|
|
|
# Check for personal files
|
|
for file in "${PERSONAL_FILES[@]}"; do
|
|
if git ls-files --error-unmatch "$file" > /dev/null 2>&1; then
|
|
FOUND_FILES+=("$file")
|
|
echo -e "${YELLOW} Found: $file${NC}"
|
|
fi
|
|
done
|
|
|
|
# Check for planning directory
|
|
if git ls-files | grep -q "^planning/"; then
|
|
FOUND_FILES+=("planning/")
|
|
echo -e "${YELLOW} Found: planning/* directory${NC}"
|
|
git ls-files | grep "^planning/" | head -5 | sed 's/^/ - /'
|
|
PLANNING_COUNT=$(git ls-files | grep "^planning/" | wc -l)
|
|
if [ "$PLANNING_COUNT" -gt 5 ]; then
|
|
echo -e "${YELLOW} ... and $((PLANNING_COUNT - 5)) more files${NC}"
|
|
fi
|
|
fi
|
|
|
|
# Check for debug screenshots
|
|
DEBUG_SCREENSHOTS=$(git ls-files | grep -E "(debug|test|scratch).*\.(png|jpg|jpeg|gif)" || true)
|
|
if [ -n "$DEBUG_SCREENSHOTS" ]; then
|
|
echo -e "${YELLOW} Found: debug/test screenshots${NC}"
|
|
echo "$DEBUG_SCREENSHOTS" | sed 's/^/ - /'
|
|
FOUND_FILES+=("screenshots-debug")
|
|
fi
|
|
|
|
# Check for temporary test files
|
|
TEMP_TESTS=$(git ls-files | grep -iE "(test-manual|test-debug|quick-test|scratch-test|example-local)" || true)
|
|
if [ -n "$TEMP_TESTS" ]; then
|
|
echo -e "${YELLOW} Found: temporary test files${NC}"
|
|
echo "$TEMP_TESTS" | sed 's/^/ - /'
|
|
FOUND_FILES+=("temp-tests")
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# If nothing found, exit
|
|
if [ ${#FOUND_FILES[@]} -eq 0 ]; then
|
|
echo -e "${GREEN}✓ No personal artifacts found!${NC}"
|
|
echo -e "${GREEN}Your branch is clean.${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
# Confirm removal
|
|
if [ "$INTERACTIVE" = true ]; then
|
|
echo -e "${YELLOW}These files should not be included in your PR.${NC}"
|
|
echo -e "${BLUE}Would you like to remove them? (y/n)${NC}"
|
|
read -r response
|
|
if [[ ! "$response" =~ ^[Yy]$ ]]; then
|
|
echo -e "${YELLOW}Cancelled. No files removed.${NC}"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}Removing files...${NC}"
|
|
|
|
REMOVED_COUNT=0
|
|
|
|
# Remove personal files
|
|
for file in "${PERSONAL_FILES[@]}"; do
|
|
if git ls-files --error-unmatch "$file" > /dev/null 2>&1; then
|
|
git rm --cached "$file" 2>/dev/null || git rm "$file" 2>/dev/null || true
|
|
echo -e "${GREEN} ✓ Removed: $file${NC}"
|
|
((REMOVED_COUNT++))
|
|
fi
|
|
done
|
|
|
|
# Remove planning directory
|
|
if git ls-files | grep -q "^planning/"; then
|
|
git rm --cached -r "planning/" 2>/dev/null || git rm -r "planning/" 2>/dev/null || true
|
|
echo -e "${GREEN} ✓ Removed: planning/* directory${NC}"
|
|
((REMOVED_COUNT++))
|
|
fi
|
|
|
|
# Remove debug screenshots (interactive)
|
|
if [ -n "$DEBUG_SCREENSHOTS" ]; then
|
|
if [ "$INTERACTIVE" = true ]; then
|
|
echo ""
|
|
echo -e "${YELLOW}Found debug screenshots. Remove these too? (y/n)${NC}"
|
|
echo "$DEBUG_SCREENSHOTS" | sed 's/^/ - /'
|
|
read -r response
|
|
if [[ "$response" =~ ^[Yy]$ ]]; then
|
|
echo "$DEBUG_SCREENSHOTS" | while read -r file; do
|
|
git rm --cached "$file" 2>/dev/null || git rm "$file" 2>/dev/null || true
|
|
echo -e "${GREEN} ✓ Removed: $file${NC}"
|
|
done
|
|
((REMOVED_COUNT++))
|
|
fi
|
|
else
|
|
echo "$DEBUG_SCREENSHOTS" | while read -r file; do
|
|
git rm --cached "$file" 2>/dev/null || git rm "$file" 2>/dev/null || true
|
|
done
|
|
echo -e "${GREEN} ✓ Removed: debug screenshots${NC}"
|
|
((REMOVED_COUNT++))
|
|
fi
|
|
fi
|
|
|
|
# Remove temporary test files (interactive)
|
|
if [ -n "$TEMP_TESTS" ]; then
|
|
if [ "$INTERACTIVE" = true ]; then
|
|
echo ""
|
|
echo -e "${YELLOW}Found temporary test files. Remove these too? (y/n)${NC}"
|
|
echo "$TEMP_TESTS" | sed 's/^/ - /'
|
|
read -r response
|
|
if [[ "$response" =~ ^[Yy]$ ]]; then
|
|
echo "$TEMP_TESTS" | while read -r file; do
|
|
git rm --cached "$file" 2>/dev/null || git rm "$file" 2>/dev/null || true
|
|
echo -e "${GREEN} ✓ Removed: $file${NC}"
|
|
done
|
|
((REMOVED_COUNT++))
|
|
fi
|
|
else
|
|
echo "$TEMP_TESTS" | while read -r file; do
|
|
git rm --cached "$file" 2>/dev/null || git rm "$file" 2>/dev/null || true
|
|
done
|
|
echo -e "${GREEN} ✓ Removed: temporary test files${NC}"
|
|
((REMOVED_COUNT++))
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BLUE}====================================${NC}"
|
|
|
|
if [ $REMOVED_COUNT -gt 0 ]; then
|
|
echo -e "${GREEN}✓ Cleaned $REMOVED_COUNT artifact(s)${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}Next steps:${NC}"
|
|
echo -e " 1. Review changes: ${YELLOW}git status${NC}"
|
|
echo -e " 2. Commit removal: ${YELLOW}git commit -m 'chore: remove personal development artifacts'${NC}"
|
|
echo -e " 3. Re-run check: ${YELLOW}./scripts/pre-pr-check.sh${NC}"
|
|
echo -e " 4. Push changes: ${YELLOW}git push${NC}"
|
|
else
|
|
echo -e "${GREEN}✓ No files removed${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${YELLOW}Note:${NC} Files are removed from git tracking but still exist locally."
|
|
echo -e "Add them to .git/info/exclude to prevent re-adding:"
|
|
echo ""
|
|
echo -e "${BLUE}echo 'SESSION.md' >> .git/info/exclude${NC}"
|
|
echo -e "${BLUE}echo 'planning/' >> .git/info/exclude${NC}"
|