276 lines
8.8 KiB
Bash
Executable File
276 lines
8.8 KiB
Bash
Executable File
#!/bin/sh
|
|
# calista-proxy - Calista Component Proxy
|
|
# Лицензия: GPLv2+ (т.к. вызывает git)
|
|
|
|
CONFIG_DIR="/calista/config/gproxy"
|
|
CONFIG_FILE="$CONFIG_DIR/config"
|
|
CACHE_DIR="/calista/cache/gproxy"
|
|
COMPONENTS_CACHE="$CACHE_DIR/components.json"
|
|
|
|
# Проверяем наличие git
|
|
check_git() {
|
|
if ! command -v git >/dev/null 2>&1; then
|
|
echo "Ошибка: git не установлен" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Инициализация каталогов
|
|
init_dirs() {
|
|
mkdir -p "$CONFIG_DIR" "$CACHE_DIR"
|
|
}
|
|
|
|
# Загрузка конфига
|
|
load_config() {
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
. "$CONFIG_FILE"
|
|
else
|
|
echo "Конфиг не найден. Сначала установите ссылку: $0 set-repo <git-url>" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Команда: установка ссылки на репозиторий компонентов
|
|
cmd_set_repo() {
|
|
if [ -z "$1" ]; then
|
|
echo "Использование: $0 set-repo <git-url>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
init_dirs
|
|
echo "REPO_URL=\"$1\"" > "$CONFIG_FILE"
|
|
echo "CACHE_DIR=\"$CACHE_DIR\"" >> "$CONFIG_FILE"
|
|
echo "Ссылка сохранена: $1"
|
|
|
|
# Обновляем кэш
|
|
cmd_update
|
|
}
|
|
|
|
# Команда: обновление списка компонентов
|
|
cmd_update() {
|
|
check_git
|
|
load_config
|
|
|
|
echo "Обновление списка компонентов из $REPO_URL"
|
|
|
|
# Создаем временный каталог для клонирования
|
|
TMP_DIR="$CACHE_DIR/tmp_repo"
|
|
rm -rf "$TMP_DIR"
|
|
|
|
# Клонируем репозиторий
|
|
if git clone --depth 1 "$REPO_URL" "$TMP_DIR" 2>/dev/null; then
|
|
# Ищем components.json
|
|
if [ -f "$TMP_DIR/components.json" ]; then
|
|
cp "$TMP_DIR/components.json" "$COMPONENTS_CACHE"
|
|
echo "Список компонентов обновлен"
|
|
elif [ -f "$TMP_DIR/component-list.json" ]; then
|
|
cp "$TMP_DIR/component-list.json" "$COMPONENTS_CACHE"
|
|
echo "Список компонентов обновлен"
|
|
else
|
|
echo "Ошибка: Не найден файл components.json в репозитории" >&2
|
|
fi
|
|
rm -rf "$TMP_DIR"
|
|
else
|
|
echo "Ошибка клонирования. Проверьте SSH ключи и доступ к $REPO_URL" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Поиск компонента в списке
|
|
find_component() {
|
|
COMP_ID="$1"
|
|
|
|
if [ ! -f "$COMPONENTS_CACHE" ]; then
|
|
echo "Список компонентов не найден. Сначала выполните обновление: $0 update" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Используем grep для простого парсинга JSON
|
|
if grep -q "\"id\": \"$COMP_ID\"" "$COMPONENTS_CACHE"; then
|
|
# Извлекаем репозиторий
|
|
REPO=$(grep -A 10 "\"id\": \"$COMP_ID\"" "$COMPONENTS_CACHE" | \
|
|
grep "\"repo\":" | head -1 | cut -d'"' -f4)
|
|
echo "$REPO"
|
|
return 0
|
|
else
|
|
echo ""
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Команда: получение компонента
|
|
cmd_get() {
|
|
if [ -z "$1" ]; then
|
|
echo "Использование: $0 get <component-id> [version]" >&2
|
|
echo " version может быть: конкретный тег или 'latest'" >&2
|
|
exit 1
|
|
fi
|
|
|
|
check_git
|
|
load_config
|
|
|
|
COMP_ID="$1"
|
|
VERSION="${2:-latest}"
|
|
|
|
echo "Поиск компонента: $COMP_ID версия: $VERSION"
|
|
|
|
# Ищем компонент
|
|
REPO_URL=$(find_component "$COMP_ID")
|
|
if [ -z "$REPO_URL" ]; then
|
|
echo "Компонент '$COMP_ID' не найден" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Определяем цель клонирования
|
|
TARGET_DIR="$CACHE_DIR/$COMP_ID"
|
|
if [ -n "$2" ] && [ "$2" != "latest" ]; then
|
|
TARGET_DIR="$CACHE_DIR/${COMP_ID}_$2"
|
|
fi
|
|
|
|
# Удаляем старую копию если существует
|
|
if [ -d "$TARGET_DIR" ]; then
|
|
echo "Удаление старой версии..."
|
|
rm -rf "$TARGET_DIR"
|
|
fi
|
|
|
|
# Клонируем компонент
|
|
echo "Клонирование: $REPO_URL"
|
|
if [ "$VERSION" = "latest" ]; then
|
|
if git clone "$REPO_URL" "$TARGET_DIR"; then
|
|
echo "Компонент '$COMP_ID' склонирован в: $TARGET_DIR"
|
|
else
|
|
echo "Ошибка клонирования. Проверьте SSH ключи и доступ" >&2
|
|
exit 1
|
|
fi
|
|
else
|
|
# Клонируем с конкретным тегом
|
|
if git clone --branch "$VERSION" "$REPO_URL" "$TARGET_DIR"; then
|
|
echo "Компонент '$COMP_ID' версии $VERSION склонирован в: $TARGET_DIR"
|
|
else
|
|
echo "Ошибка: Не удалось клонировать версию $VERSION" >&2
|
|
echo "Возможно тег не существует или проблемы с доступом" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Команда: список доступных компонентов
|
|
cmd_list() {
|
|
if [ ! -f "$COMPONENTS_CACHE" ]; then
|
|
echo "Список компонентов не найден. Сначала выполните: $0 update" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Доступные компоненты:"
|
|
echo "====================="
|
|
|
|
# Простой парсинг для вывода списка
|
|
grep '"id":' "$COMPONENTS_CACHE" | cut -d'"' -f4 | while read -r id; do
|
|
name=$(grep -A 2 "\"id\": \"$id\"" "$COMPONENTS_CACHE" | \
|
|
grep '"name":' | head -1 | cut -d'"' -f4)
|
|
echo " $id - $name"
|
|
done
|
|
}
|
|
|
|
# Команда: очистка кэша
|
|
cmd_clean() {
|
|
load_config
|
|
|
|
echo "Очистка кэша в $CACHE_DIR"
|
|
|
|
# Удаляем все кроме конфига и самого файла components.json
|
|
find "$CACHE_DIR" -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} + 2>/dev/null
|
|
rm -f "$COMPONENTS_CACHE"
|
|
|
|
echo "Кэш очищен"
|
|
}
|
|
|
|
# Команда: установка пути к хранилищу
|
|
cmd_set_cache() {
|
|
if [ -z "$1" ]; then
|
|
echo "Использование: $0 set-cache <путь>" >&2
|
|
exit 1
|
|
fi
|
|
|
|
NEW_CACHE="$1"
|
|
if [ ! -d "$NEW_CACHE" ]; then
|
|
mkdir -p "$NEW_CACHE" || {
|
|
echo "Не удалось создать каталог: $NEW_CACHE" >&2
|
|
exit 1
|
|
}
|
|
fi
|
|
|
|
# Обновляем конфиг
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
grep -v "^CACHE_DIR=" "$CONFIG_FILE" > "$CONFIG_FILE.tmp"
|
|
echo "CACHE_DIR=\"$NEW_CACHE\"" >> "$CONFIG_FILE.tmp"
|
|
mv "$CONFIG_FILE.tmp" "$CONFIG_FILE"
|
|
else
|
|
echo "CACHE_DIR=\"$NEW_CACHE\"" > "$CONFIG_FILE"
|
|
fi
|
|
|
|
CACHE_DIR="$NEW_CACHE"
|
|
COMPONENTS_CACHE="$CACHE_DIR/components.json"
|
|
|
|
echo "Путь к хранилищу установлен: $NEW_CACHE"
|
|
}
|
|
|
|
# Команда: помощь
|
|
cmd_help() {
|
|
echo "Calista Component Proxy"
|
|
echo "======================="
|
|
echo "Команды:"
|
|
echo " set-repo <git-url> - Установить ссылку на репозиторий компонентов"
|
|
echo " update - Обновить список компонентов"
|
|
echo " list - Показать список доступных компонентов"
|
|
echo " get <id> [version] - Получить компонент (version может быть тегом или 'latest')"
|
|
echo " clean - Очистить кэш склонированных репозиториев"
|
|
echo " set-cache <path> - Установить путь к хранилищу"
|
|
echo " help - Показать эту справку"
|
|
echo ""
|
|
echo "Примеры:"
|
|
echo " $0 set-repo git@github.com:user/components.git"
|
|
echo " $0 update"
|
|
echo " $0 get cpm v1.0.0"
|
|
echo " $0 get calista-graphics-legacy latest"
|
|
}
|
|
|
|
# Главная функция
|
|
main() {
|
|
case "$1" in
|
|
set-repo)
|
|
cmd_set_repo "$2"
|
|
;;
|
|
update)
|
|
cmd_update
|
|
;;
|
|
get)
|
|
cmd_get "$2" "$3"
|
|
;;
|
|
list)
|
|
cmd_list
|
|
;;
|
|
clean)
|
|
cmd_clean
|
|
;;
|
|
set-cache)
|
|
cmd_set_cache "$2"
|
|
;;
|
|
help|--help|-h)
|
|
cmd_help
|
|
;;
|
|
*)
|
|
if [ -z "$1" ]; then
|
|
cmd_help
|
|
else
|
|
echo "Неизвестная команда: $1" >&2
|
|
echo "Используйте: $0 help" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Запуск
|
|
main "$@"
|