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