-
Notifications
You must be signed in to change notification settings - Fork 0
/
git-get
executable file
·80 lines (66 loc) · 1.6 KB
/
git-get
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
#!/bin/bash
# SPDX-License-Identifier: GPL-3.0-only
# Copyright 2018, Mattias Bengtsson <[email protected]>
set -e
shopt -s extglob
GIT_GET_BASEDIR=${GIT_GET_BASEDIR:-${HOME}/Code}
function with-extension {
local url
url="${1}"
case "${url}" in
*.git)
echo "${url}"
return
;;
*)
echo "${url}.git"
return
;;
esac
}
function get-repo-dir {
local url
url="$(with-extension "${1}")"
case "${url}" in
http://*|https://*|ssh://*)
repo="${url##*//}"
repo="${repo/:*([0-9])/}"
repo="${repo/*@/}"
;;
*@*.git)
repo="${url##*@}"
repo="${repo/://}"
;;
*)
echo "Not a proper repository! [${url}]"
exit 3
esac
echo "${GIT_GET_BASEDIR}/${repo%.git}"
}
function clone-repo {
url="${1}"
repo="$(get-repo-dir "${url}")"
if [ -d "${repo}" ]; then
echo "${repo} already exists!"
return
fi
mkdir -p "${repo}"
git clone --recurse-submodules "${url}" "${repo}" || {
if [ -n "$(ls -A "${repo}")" ]; then
echo "Couldn't clean up after failed clone!" > /dev/stderr
echo " [${repo}] not empty!" > /dev/stderr
return 4
fi
rm -rf "${repo}"
return 5
}
}
if [ $# -lt 1 ]; then
echo "Usage: git get <url>..."
exit 2
fi
if [ "${1}" == --show-path ]; then
get-repo-dir "$(git ls-remote --get-url "${2}")"
else
clone-repo "$(git ls-remote --get-url "${1}")"
fi