summary refs log tree commit diff
path: root/bin/clone
blob: 1882a2580bbd3142b6c34c5debf4ba973039dec5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/bin/bash
#
# To use this create a directory that you want to use for git repos, e.g. $HOME/git and copy/symlink this script into it.
# Then you can use it like this:
#
# ./clone github.com/robertgzr/dotfiles
# ./clone https://bitbucket.org/foo/bar
#
# If you don't have gitconfig set up like I have (using aliases for github/bitbucket ssh access) this won't really work
set -e

SHALLOW=0
RECURSE_SUBMODULES=
TEMP="$(mktemp -d -p /tmp clone.XXXXXXXXXX)"

URL=$1
if [[ -z "${URL}" ]]; then
    fail "no input"
else
    URL="${URL//(http|https):\/\//}"
fi

make_dirs() {
    local url=$1

    if [[ -d "${url}" ]]
    then
        echo "exists: ${url}"
        return
    fi

    confirm "create ${url}"
    mkdir -p "${url}"
}

clone() {
    local in=$1
    local to=$2
    IFS='/' read -r -a url <<< "${in}"

    case "${url[0]}" in
        github.com ) ssh_clone gh "${in}" "${to}";;
        gitlab.com ) ssh_clone gl "${in}" "${to}";;
        bitbucket.org ) ssh_clone bb "${in}" "${to}";;
        git.sr.ht ) ssh_clone srht "${in}" "${to}";;
        * ) http_clone "${url[@]// /\/}" "${to}";;
    esac
}

ssh_clone() {
    local prefix=$1
    local in=$2
    local to=$3
    IFS='/' read -r -a url <<< "${in}"
    local ssh_url="${prefix}:${url[1]}/${url[2]}"

    # confirm "clone $ssh_url"
    git_clone "${ssh_url}" "${to}"
}

http_clone() {
    local to=$2
    local http_url="https://${URL}"

    # confirm "clone $http_url"
    git_clone "${GIT_FLAGS}" "${http_url}" "${to}"
}

git_clone() {
    declare -a GIT_FLAGS
    if [[ ${SHALLOW} -ne 0 ]]; then
        GIT_FLAGS+="--depth=${SHALLOW}"
    fi
    if [[ ! -z ${RECURSE_SUBMODULES} ]]; then
        GIT_FLAGS+="--recurse-submodules"
    fi
    git clone "${GIT_FLAGS[@]}" "${@}"
}

fail() {
    echo "${1:-error}"
    exit ${2:-1}
}

confirm() {
    echo -n "${1:-'do something'}, ok (y/n)? "
    read yn
    if [[ "$yn" = "${yn#[Yy]}" ]]; then
        fail "ok, exiting" 0
    fi
}

usage() {
    echo "usage: clone [-s][-r] URL"
    echo ""
    echo -e " -s\tshallow clone"
    echo -e " -r\trecurse submodules"
    echo -e " URL\texample.com/user/repo"
    echo -e "\thttp[s]://example.com/user/repo"
    exit 0
}

while getopts ":hsr" opt; do
    case ${opt} in
        s )
            echo "Shallow clone"
            SHALLOW=1
            ;;
        r )
            echo "Recurse submodules"
            RECURSE_SUBMODULES=1
            ;;
        h ) 
            usage
            ;;
        \? ) 
            usage
            ;;
    esac
done
shift $((OPTIND -1))

clone "${URL}" "${TEMP}/${URL}" || fail

target="${PWD}/$(dirname "${URL}")"
install -d "${target}" || fail
mv "${TEMP}/${URL}" "${target}" || fail