grasp.sh
· 3.5 KiB · Bash
原始文件
#!/usr/bin/env bash
#
# Grasp helper
#
# Используется для клонирования bare-репозиториев в каталог
# имя_пользователя/имя_репозитория.
#
#
#
# Подключаем в .bashrc
# if [ -f /path/to/grasp.sh ]; then
# source /path/to/grasp.sh
# fi
#
# и выполняем
# source ~/.bashrc
#
# теперь поддерживется команда grasp clone или вызов скрипта напрямую.
#
# (c) Karel Wintersky, 2025
#
# Проверка режима выполнения
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
RUN_AS_SCRIPT=true
else
RUN_AS_SCRIPT=false
fi
# Цвета вывода
RED='\033[1;31m'; GREEN='\033[1;32m'; YELLOW='\033[1;33m'
BLUE='\033[1;34m'; CYAN='\033[1;36m'; NC='\033[0m'
main() {
case "$1" in
"clone")
[[ -z "$2" ]] && { show_error "URL не указан"; show_help; return 1; }
clone_bare "$2"
;;
"help"|"")
show_help
;;
*)
show_error "Неподдерживаемая команда '${YELLOW}$1${RED}'"
show_help
return 1
;;
esac
}
clone_bare() {
local url="$1"
local user_repo service
# Определяем сервис и извлекаем user/repo
case "$url" in
*github*)
service="GitHub"
[[ "$url" =~ github.com[/:]([^/]+/[^/]+?)(\.git)?$ ]] || { show_error "Неверный URL GitHub"; return 1; }
;;
*gitlab*)
service="GitLab"
[[ "$url" =~ gitlab.com[/:]([^/]+/[^/]+?)(\.git)?$ ]] || { show_error "Неверный URL GitLab"; return 1; }
;;
*bitbucket*)
service="Bitbucket"
[[ "$url" =~ bitbucket.org[/:]([^/]+/[^/]+?)(\.git)?$ ]] || { show_error "Неверный URL Bitbucket"; return 1; }
;;
*)
show_error "Неподдерживаемый хостинг. Поддерживается: GitHub, GitLab, Bitbucket"
return 1
;;
esac
user_repo="${BASH_REMATCH[1]}"
echo -e "${GREEN}Клонируем ${CYAN}${service}${GREEN} bare-репозиторий в ${YELLOW}$user_repo${NC}..."
if mkdir -p "$user_repo" && git clone --bare "$url" "$user_repo"; then
echo -e "${GREEN}Успешно! Репозиторий сохранён в ${YELLOW}$user_repo${NC}"
else
show_error "Ошибка при клонировании"
return 1
fi
}
show_error() {
echo -e "${RED}Ошибка: ${1}${NC}" >&2
}
show_help() {
echo ""
echo -e "${GREEN}GRASP Helper${NC}"
echo ""
echo -e " ${YELLOW}grasp clone <URL>${NC} - Клонировать как bare-репозиторий"
echo -e " ${YELLOW}grasp help ${NC} - Показать справку"
echo ""
echo -e "${BLUE}Поддерживаемые сервисы:${NC}"
echo ""
echo -e " GitHub: ${CYAN}https://github.com/user/repo${NC}"
echo -e " ${CYAN}git@github.com:user/repo.git${NC}"
echo -e " GitLab: ${CYAN}https://gitlab.com/user/repo${NC}"
echo -e " ${CYAN}git@gitlab.com:user/repo.git${NC}"
echo -e " Bitbucket: ${CYAN}https://bitbucket.org/user/repo${NC}"
echo -e " ${CYAN}git@bitbucket.org:user/repo.git${NC}"
echo ""
}
# Точка входа
if $RUN_AS_SCRIPT; then
main "$@"
else
grasp() { main "$@"; }
fi
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 | # Проверка режима выполнения |
25 | if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then |
26 | RUN_AS_SCRIPT=true |
27 | else |
28 | RUN_AS_SCRIPT=false |
29 | fi |
30 | |
31 | # Цвета вывода |
32 | RED='\033[1;31m'; GREEN='\033[1;32m'; YELLOW='\033[1;33m' |
33 | BLUE='\033[1;34m'; CYAN='\033[1;36m'; NC='\033[0m' |
34 | |
35 | main() { |
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 | |
52 | clone_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 | |
87 | show_error() { |
88 | echo -e "${RED}Ошибка: ${1}${NC}" >&2 |
89 | } |
90 | |
91 | show_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 | # Точка входа |
110 | if $RUN_AS_SCRIPT; then |
111 | main "$@" |
112 | else |
113 | grasp() { main "$@"; } |
114 | fi |