Files
vibe-foreman/scripts/scan-projects.sh
T
wuguanganandClaude Opus 4.6 f92763f8fb feat: scan_dirs 配置 + 智能扫描
- projects.yaml 支持 scan_dirs 字段,配置一次后续扫描无需传参
- scan-projects.sh 自动跳过已存在的项目
- 支持多目录扫描

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 09:41:23 +08:00

110 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
# 扫描目录下的 git 仓库,生成/更新 projects.yaml
# 用法: bash scripts/scan-projects.sh [目录...]
#
# 不传目录 → 从 projects.yaml 的 scan_dirs 读取
# 传目录 → 扫描指定目录
HUB_DIR="$(cd "$(dirname "$0")/.." && pwd)"
YAML_FILE="$HUB_DIR/projects.yaml"
# 收集扫描目录
SCAN_DIRS=()
if [ $# -gt 0 ]; then
# 命令行传入的目录
for arg in "$@"; do
SCAN_DIRS+=("${arg/#\~/$HOME}")
done
elif [ -f "$YAML_FILE" ]; then
# 从 projects.yaml 的 scan_dirs 读取
while IFS= read -r line; do
dir=$(echo "$line" | sed 's/^[[:space:]]*-[[:space:]]*//' | sed "s|~|$HOME|g")
[ -d "$dir" ] && SCAN_DIRS+=("$dir")
done < <(grep -A 100 '^scan_dirs:' "$YAML_FILE" | tail -n +2 | grep '^ -' | sed '/^[a-z]/q' | head -20)
fi
# 默认目录
if [ ${#SCAN_DIRS[@]} -eq 0 ]; then
SCAN_DIRS=("$HOME/Documents/code")
fi
echo "扫描目录:"
for d in "${SCAN_DIRS[@]}"; do echo " $d"; done
echo ""
# 收集已有项目(避免重复)
EXISTING=""
if [ -f "$YAML_FILE" ]; then
EXISTING=$(grep 'name:' "$YAML_FILE" | sed 's/.*name:[[:space:]]*//')
fi
# 扫描所有目录
PROJECTS=""
COUNT=0
SKIP=0
for SCAN_DIR in "${SCAN_DIRS[@]}"; do
[ ! -d "$SCAN_DIR" ] && continue
for dir in "$SCAN_DIR"/*/; do
[ ! -d "$dir/.git" ] && continue
NAME=$(basename "$dir")
# 跳过已存在的
if echo "$EXISTING" | grep -q "^${NAME}$"; then
SKIP=$((SKIP + 1))
continue
fi
PATH_STR="${dir%/}"
PATH_STR="${PATH_STR/#$HOME/~}"
PROJECTS+=" - name: $NAME
path: $PATH_STR
description: \"\"
tags: []
"
COUNT=$((COUNT + 1))
echo " 新增: $NAME ($PATH_STR)"
done
done
[ $SKIP -gt 0 ] && echo " 跳过: $SKIP 个已存在的项目"
echo ""
if [ $COUNT -eq 0 ]; then
echo "没有新项目需要添加"
exit 0
fi
echo "发现 $COUNT 个新项目"
# 确保 projects.yaml 存在
if [ ! -f "$YAML_FILE" ]; then
# 读取 scan_dirs 参数生成 scan_dirs 配置
SCAN_DIRS_YAML=""
for d in "${SCAN_DIRS[@]}"; do
d="${d/#$HOME/~}"
SCAN_DIRS_YAML+=" - $d\n"
done
cat > "$YAML_FILE" << EOF
# 项目清单 - 由 scan-projects.sh 生成
scan_dirs:
$(echo -e "$SCAN_DIRS_YAML")
projects:
$PROJECTS
EOF
echo "已创建 $YAML_FILE"
else
# 追加到已有文件
echo "" >> "$YAML_FILE"
echo " # === 扫描添加 $(date '+%Y-%m-%d') ===" >> "$YAML_FILE"
echo -n "$PROJECTS" >> "$YAML_FILE"
echo "已追加到 $YAML_FILE"
fi