146 lines
4.5 KiB
Bash
146 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
|
|
|
|
REPOS=()
|
|
while IFS= read -r _r; do
|
|
REPOS+=("$_r")
|
|
done < <(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}"
|