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
|