learning_ai_common_plat/scripts/commit-workspace.sh
2026-03-24 16:05:12 -07:00

143 lines
4.5 KiB
Bash

#!/bin/bash
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMMON_PLAT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
WORKSPACE_DIR="${WORKSPACE_DIR:-$(cd "${COMMON_PLAT_DIR}/.." && pwd)}"
REPOS_TXT="${COMMON_PLAT_DIR}/.windsurf/workflows/repos.txt"
if [[ ! -f "$REPOS_TXT" ]]; then
echo -e "${RED}❌ repos.txt not found at ${REPOS_TXT}${NC}"
exit 1
fi
read_repos() {
local repos=()
while IFS= read -r line; do
[[ "$line" =~ ^[[:space:]]*# ]] && continue
[[ -z "${line// }" ]] && continue
repos+=("$line")
done < "$REPOS_TXT"
printf '%s\n' "${repos[@]}"
}
get_commit_message() {
local repo="$1"
local repo_path="${WORKSPACE_DIR}/${repo}"
local files
files="$(git -C "$repo_path" diff --name-only 2>/dev/null || true)"
files+=$'\n'"$(git -C "$repo_path" diff --cached --name-only 2>/dev/null || true)"
files+=$'\n'"$(git -C "$repo_path" ls-files --others --exclude-standard 2>/dev/null || true)"
local has_auth has_ci has_docs has_docker has_package has_python has_tests has_config
has_auth="$(echo "$files" | grep -E '(auth|middleware|jwt)' || true)"
has_ci="$(echo "$files" | grep -E '\.github|workflow|ci' || true)"
has_docs="$(echo "$files" | grep -E '\.md$' || true)"
has_docker="$(echo "$files" | grep -E 'Dockerfile|docker' || true)"
has_package="$(echo "$files" | grep -E 'package\.json|pnpm-lock|yarn\.lock' || true)"
has_python="$(echo "$files" | grep -E '\.py$|requirements' || true)"
has_tests="$(echo "$files" | grep -E 'test|spec' || true)"
has_config="$(echo "$files" | grep -E '\.env|config|\.toml' || true)"
if [[ -n "$has_auth" ]]; then
echo "feat(auth): update authentication and middleware"
elif [[ -n "$has_ci" ]]; then
echo "ci: update CI/CD configuration"
elif [[ -n "$has_docker" ]]; then
if [[ -n "$has_package" ]]; then
echo "feat(devops): update docker and package configuration"
else
echo "feat(devops): update Docker configuration"
fi
elif [[ -n "$has_package" ]]; then
echo "chore: update dependencies"
elif [[ -n "$has_docs" ]]; then
echo "docs: update documentation"
elif [[ -n "$has_python" ]]; then
if [[ -n "$has_tests" ]]; then
echo "test(python): update test suite"
else
echo "feat(python): update Python modules"
fi
elif [[ -n "$has_tests" ]]; then
echo "test: add/update tests"
elif [[ -n "$has_config" ]]; then
echo "chore: update configuration"
else
echo "chore: update project files"
fi
}
commit_repo() {
local repo="$1"
local repo_path="${WORKSPACE_DIR}/${repo}"
echo -e "${BLUE}📝 Committing ${repo}...${NC}"
git -C "$repo_path" add -A
local commit_msg
commit_msg="$(get_commit_message "$repo")"
echo -e " Message: ${YELLOW}${commit_msg}${NC}"
git -C "$repo_path" commit -m "$commit_msg"
echo -e " ${GREEN}✅ Committed${NC}"
echo
}
echo -e "${BLUE}📋 Scanning workspace for changes...${NC}"
echo
mapfile -t REPOS < <(read_repos)
REPOS_WITH_CHANGES=()
for repo in "${REPOS[@]}"; do
repo_path="${WORKSPACE_DIR}/${repo}"
if [[ ! -d "$repo_path/.git" ]]; then
continue
fi
if ! git -C "$repo_path" diff --quiet || ! git -C "$repo_path" diff --cached --quiet || [[ -n "$(git -C "$repo_path" ls-files --others --exclude-standard)" ]]; then
REPOS_WITH_CHANGES+=("$repo")
staged=$(git -C "$repo_path" diff --cached --name-only | wc -l | tr -d ' ')
modified=$(git -C "$repo_path" diff --name-only | wc -l | tr -d ' ')
untracked=$(git -C "$repo_path" ls-files --others --exclude-standard | wc -l | tr -d ' ')
echo -e "${YELLOW}📁 ${repo}${NC}:"
[[ "$staged" -gt 0 ]] && echo " - ${staged} staged"
[[ "$modified" -gt 0 ]] && echo " - ${modified} modified"
[[ "$untracked" -gt 0 ]] && echo " - ${untracked} untracked"
echo
fi
done
if [[ ${#REPOS_WITH_CHANGES[@]} -eq 0 ]]; then
echo -e "${GREEN}✅ No changes to commit${NC}"
exit 0
fi
echo -e "${BLUE}Found changes in ${#REPOS_WITH_CHANGES[@]} repo(s)${NC}"
echo
echo -e "${BLUE}🚀 Committing in dependency order...${NC}"
echo
if [[ " ${REPOS_WITH_CHANGES[*]} " =~ " learning_ai_common_plat " ]]; then
commit_repo "learning_ai_common_plat"
fi
for repo in "${REPOS_WITH_CHANGES[@]}"; do
if [[ "$repo" != "learning_ai_common_plat" ]]; then
commit_repo "$repo"
fi
done
echo -e "${GREEN}✨ All changes committed locally!${NC}"
echo -e "${BLUE}💡 Use /repo_sync-repos or git push to push to remote${NC}"