grasp.sh
· 3.5 KiB · Bash
Raw
#!/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 |