feat: add comprehensive GitHub workflow and development tools
This commit is contained in:
232
scripts/git-workflow.sh
Normal file
232
scripts/git-workflow.sh
Normal file
@@ -0,0 +1,232 @@
|
||||
#!/bin/bash
|
||||
# Git workflow helper script
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Functions
|
||||
print_header() {
|
||||
echo -e "${BLUE}$1${NC}"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✅ $1${NC}"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}❌ $1${NC}"
|
||||
}
|
||||
|
||||
# Check if we're in a git repository
|
||||
if [ ! -d ".git" ]; then
|
||||
print_error "Not in a git repository"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Main menu
|
||||
echo "🔧 Git Workflow Helper"
|
||||
echo "======================"
|
||||
echo "1) Create feature branch"
|
||||
echo "2) Commit changes"
|
||||
echo "3) Push to GitHub"
|
||||
echo "4) Create release"
|
||||
echo "5) Clean up branches"
|
||||
echo "6) Show status"
|
||||
echo "0) Exit"
|
||||
echo ""
|
||||
|
||||
read -p "Choose an option (0-6): " choice
|
||||
|
||||
case $choice in
|
||||
1)
|
||||
print_header "Creating feature branch"
|
||||
read -p "Enter feature name (e.g., helpbox-improvements): " feature_name
|
||||
|
||||
if [ -z "$feature_name" ]; then
|
||||
print_error "Feature name cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if we're on main/develop
|
||||
current_branch=$(git branch --show-current)
|
||||
if [ "$current_branch" != "main" ] && [ "$current_branch" != "develop" ]; then
|
||||
print_warning "You're not on main or develop branch. Current: $current_branch"
|
||||
read -p "Continue anyway? (y/N): " continue_anyway
|
||||
if [ "$continue_anyway" != "y" ] && [ "$continue_anyway" != "Y" ]; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
branch_name="feature/$feature_name"
|
||||
git checkout -b "$branch_name"
|
||||
print_success "Created and switched to branch: $branch_name"
|
||||
;;
|
||||
|
||||
2)
|
||||
print_header "Committing changes"
|
||||
|
||||
# Check for changes
|
||||
if git diff --quiet && git diff --cached --quiet; then
|
||||
print_warning "No changes to commit"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Show status
|
||||
git status
|
||||
echo ""
|
||||
|
||||
# Commit type
|
||||
echo "Select commit type:"
|
||||
echo "1) feat: New feature"
|
||||
echo "2) fix: Bug fix"
|
||||
echo "3) docs: Documentation"
|
||||
echo "4) style: Code style changes"
|
||||
echo "5) refactor: Code refactoring"
|
||||
echo "6) test: Add or update tests"
|
||||
echo "7) chore: Maintenance tasks"
|
||||
|
||||
read -p "Choose type (1-7): " commit_type_choice
|
||||
|
||||
case $commit_type_choice in
|
||||
1) commit_type="feat" ;;
|
||||
2) commit_type="fix" ;;
|
||||
3) commit_type="docs" ;;
|
||||
4) commit_type="style" ;;
|
||||
5) commit_type="refactor" ;;
|
||||
6) commit_type="test" ;;
|
||||
7) commit_type="chore" ;;
|
||||
*) print_error "Invalid choice"; exit 1 ;;
|
||||
esac
|
||||
|
||||
read -p "Enter commit message: " commit_message
|
||||
|
||||
if [ -z "$commit_message" ]; then
|
||||
print_error "Commit message cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git add .
|
||||
git commit -m "$commit_type: $commit_message"
|
||||
print_success "Changes committed: $commit_type: $commit_message"
|
||||
;;
|
||||
|
||||
3)
|
||||
print_header "Pushing to GitHub"
|
||||
current_branch=$(git branch --show-current)
|
||||
|
||||
# Check if upstream exists
|
||||
if ! git rev-parse --verify "origin/$current_branch" > /dev/null 2>&1; then
|
||||
print_warning "Upstream branch doesn't exist. Setting up..."
|
||||
git push -u origin "$current_branch"
|
||||
else
|
||||
git push
|
||||
fi
|
||||
|
||||
print_success "Pushed to origin/$current_branch"
|
||||
|
||||
# Suggest creating PR
|
||||
if [ "$current_branch" != "main" ] && [ "$current_branch" != "develop" ]; then
|
||||
print_warning "Consider creating a Pull Request on GitHub"
|
||||
echo "URL: https://github.com/yourusername/stiftung-starter/compare/$current_branch"
|
||||
fi
|
||||
;;
|
||||
|
||||
4)
|
||||
print_header "Creating release"
|
||||
|
||||
# Check if on main branch
|
||||
current_branch=$(git branch --show-current)
|
||||
if [ "$current_branch" != "main" ]; then
|
||||
print_error "Must be on main branch to create release"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get last tag
|
||||
last_tag=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
|
||||
print_warning "Last tag: $last_tag"
|
||||
|
||||
read -p "Enter new version (e.g., v2.1.0): " new_version
|
||||
|
||||
if [ -z "$new_version" ]; then
|
||||
print_error "Version cannot be empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create tag
|
||||
git tag -a "$new_version" -m "Release $new_version"
|
||||
git push origin "$new_version"
|
||||
|
||||
print_success "Created and pushed tag: $new_version"
|
||||
;;
|
||||
|
||||
5)
|
||||
print_header "Cleaning up branches"
|
||||
|
||||
# Show merged branches
|
||||
echo "Merged branches that can be deleted:"
|
||||
git branch --merged main | grep -v "main\|develop\|\*" | sed 's/^/ /'
|
||||
echo ""
|
||||
|
||||
read -p "Delete merged branches? (y/N): " delete_merged
|
||||
if [ "$delete_merged" = "y" ] || [ "$delete_merged" = "Y" ]; then
|
||||
git branch --merged main | grep -v "main\|develop\|\*" | xargs -n 1 git branch -d
|
||||
print_success "Deleted merged branches"
|
||||
fi
|
||||
|
||||
# Clean remote tracking branches
|
||||
git remote prune origin
|
||||
print_success "Cleaned remote tracking branches"
|
||||
;;
|
||||
|
||||
6)
|
||||
print_header "Repository Status"
|
||||
|
||||
# Current branch
|
||||
current_branch=$(git branch --show-current)
|
||||
echo "📍 Current branch: $current_branch"
|
||||
|
||||
# Uncommitted changes
|
||||
if ! git diff --quiet || ! git diff --cached --quiet; then
|
||||
print_warning "You have uncommitted changes"
|
||||
else
|
||||
print_success "Working directory is clean"
|
||||
fi
|
||||
|
||||
# Unpushed commits
|
||||
if [ -n "$(git log origin/$current_branch..$current_branch 2>/dev/null)" ]; then
|
||||
print_warning "You have unpushed commits"
|
||||
else
|
||||
print_success "All commits are pushed"
|
||||
fi
|
||||
|
||||
# Show recent commits
|
||||
echo ""
|
||||
echo "📝 Recent commits:"
|
||||
git log --oneline -5
|
||||
|
||||
# Show branches
|
||||
echo ""
|
||||
echo "🌿 Branches:"
|
||||
git branch -v
|
||||
;;
|
||||
|
||||
0)
|
||||
print_success "Goodbye!"
|
||||
exit 0
|
||||
;;
|
||||
|
||||
*)
|
||||
print_error "Invalid option"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user