最終更新 1749140282

Скрипт-хелпер для пакета GRASP. Клонирует bare-репозиторий.

修正履歴 69f1a17cd29d887b480c10a66856c9c6fb604c9f

grasp.sh Raw
1#!/usr/bin/env bash
2
3#
4# Grasp helper
5#
6# Используется для клонирования bare-репозиториев в каталог
7# имя_пользователя/имя_репозитория.
8#
9#
10#
11# Подключаем в .bashrc
12# if [ -f /path/to/grasp.sh ]; then
13# source /path/to/grasp.sh
14# fi
15#
16# и выполняем
17# source ~/.bashrc
18#
19# теперь поддерживется команда grasp clone или вызов скрипта напрямую.
20#
21# (c) Karel Wintersky, 2025
22#
23
24# Проверка режима выполнения
25if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
26 RUN_AS_SCRIPT=true
27else
28 RUN_AS_SCRIPT=false
29fi
30
31# Цвета вывода
32RED='\033[1;31m'; GREEN='\033[1;32m'; YELLOW='\033[1;33m'
33BLUE='\033[1;34m'; CYAN='\033[1;36m'; NC='\033[0m'
34
35main() {
36 case "$1" in
37 "clone")
38 [[ -z "$2" ]] && { show_error "URL не указан"; show_help; return 1; }
39 clone_bare "$2"
40 ;;
41 "help"|"")
42 show_help
43 ;;
44 *)
45 show_error "Неподдерживаемая команда '${YELLOW}$1${RED}'"
46 show_help
47 return 1
48 ;;
49 esac
50}
51
52clone_bare() {
53 local url="$1"
54 local user_repo service
55
56 # Определяем сервис и извлекаем user/repo
57 case "$url" in
58 *github*)
59 service="GitHub"
60 [[ "$url" =~ github.com[/:]([^/]+/[^/]+?)(\.git)?$ ]] || { show_error "Неверный URL GitHub"; return 1; }
61 ;;
62 *gitlab*)
63 service="GitLab"
64 [[ "$url" =~ gitlab.com[/:]([^/]+/[^/]+?)(\.git)?$ ]] || { show_error "Неверный URL GitLab"; return 1; }
65 ;;
66 *bitbucket*)
67 service="Bitbucket"
68 [[ "$url" =~ bitbucket.org[/:]([^/]+/[^/]+?)(\.git)?$ ]] || { show_error "Неверный URL Bitbucket"; return 1; }
69 ;;
70 *)
71 show_error "Неподдерживаемый хостинг. Поддерживается: GitHub, GitLab, Bitbucket"
72 return 1
73 ;;
74 esac
75
76 user_repo="${BASH_REMATCH[1]}"
77 echo -e "${GREEN}Клонируем ${CYAN}${service}${GREEN} bare-репозиторий в ${YELLOW}$user_repo${NC}..."
78
79 if mkdir -p "$user_repo" && git clone --bare "$url" "$user_repo"; then
80 echo -e "${GREEN}Успешно! Репозиторий сохранён в ${YELLOW}$user_repo${NC}"
81 else
82 show_error "Ошибка при клонировании"
83 return 1
84 fi
85}
86
87show_error() {
88 echo -e "${RED}Ошибка: ${1}${NC}" >&2
89}
90
91show_help() {
92 echo ""
93 echo -e "${GREEN}GRASP Helper${NC}"
94 echo ""
95 echo -e " ${YELLOW}grasp clone <URL>${NC} - Клонировать как bare-репозиторий"
96 echo -e " ${YELLOW}grasp help ${NC} - Показать справку"
97 echo ""
98 echo -e "${BLUE}Поддерживаемые сервисы:${NC}"
99 echo ""
100 echo -e " GitHub: ${CYAN}https://github.com/user/repo${NC}"
101 echo -e " ${CYAN}git@github.com:user/repo.git${NC}"
102 echo -e " GitLab: ${CYAN}https://gitlab.com/user/repo${NC}"
103 echo -e " ${CYAN}git@gitlab.com:user/repo.git${NC}"
104 echo -e " Bitbucket: ${CYAN}https://bitbucket.org/user/repo${NC}"
105 echo -e " ${CYAN}git@bitbucket.org:user/repo.git${NC}"
106 echo ""
107}
108
109# Точка входа
110if $RUN_AS_SCRIPT; then
111 main "$@"
112else
113 grasp() { main "$@"; }
114fi