aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/common.sh
blob: 8dd00a10684a2427cc4dd438478c019c8ddb4b59 (plain)
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#!/bin/sh
# Various functions and variables used in multiple osmo-ci shell scripts
OSMO_CI_DIR="$(realpath "$(dirname "$0")/..")"
OSMO_GIT_URL="https://git.osmocom.org"
OSMO_GIT_URL_GERRIT="https://gerrit.osmocom.org"

# Osmocom repositories of which we want to build release tarballs automatically, and list the current versions at
# https://jenkins.osmocom.org/jenkins/job/Osmocom-list-commits/lastSuccessfulBuild/artifact/commits.txt
OSMO_RELEASE_REPOS="
	libasn1c
	libosmo-abis
	libosmocore
	libosmo-netif
	libosmo-sccp
	libsmpp34
	libusrp
	osmo-bsc
	osmo-bts
	osmo-ggsn
	osmo-hlr
	osmo-iuh
	osmo-mgw
	osmo-msc
	osmo-pcu
	osmo-sgsn
	osmo-sip-connector
	osmo-sysmon
	osmo-trx
	osmocom-bb
"

OSMO_BRANCH_DOCKER_PLAYGROUND="${OSMO_BRANCH_DOCKER_PLAYGROUND:-master}"

# Print commit of HEAD for an Osmocom git repository, e.g.:
# "f90496f577e78944ce8db1aa5b900477c1e479b0"
# $1: repository
osmo_git_head_commit() {
	# git output:
	# f90496f577e78944ce8db1aa5b900477c1e479b0        HEAD
	ret="$(git ls-remote "$OSMO_GIT_URL/$1" HEAD)"
	ret="$(echo "$ret" | awk '{print $1}')"
	echo "$ret"
}

# Print last tags and related commits for an Osmocom git repository, e.g.:
# "ec798b89700dcca5c5b28edf1a1cd16ea311f30a        refs/tags/1.0.1"
# $1: Osmocom repository
# $2: amount of commit, tag pairs to print (default: 1, set to "all" to print all)
# $3: string to print when there are no tags (default: empty string)
osmo_git_last_commits_tags() {
	# git output:
	# ec798b89700dcca5c5b28edf1a1cd16ea311f30a        refs/tags/1.0.1
	# eab5f594b0a7cf50ad97b039f73beff42cc8312a        refs/tags/1.0.1^{}
	# ...
	# 41e7cf115d4148a9f34fcb863b68b2d5370e335d        refs/tags/1.3.1^{}
	# 8a9f12dc2f69bf3a4e861cc9a81b71bdc5f13180        refs/tags/3G_2016_09
	# ee618ecbedec82dfd240334bc87d0d1c806477b0        refs/tags/debian/0.9.13-0_jrsantos.1
	# a3fdd24af099b449c9856422eb099fb45a5595df        refs/tags/debian/0.9.13-0_jrsantos.1^{}
	# ...
	ret="$(git ls-remote --tags "$OSMO_GIT_URL/$1")"
	ret="$(echo "$ret" | grep 'refs/tags/[0-9.]*$' || true)"
	ret="$(echo "$ret" | sort -V -t/ -k3)"
	if [ "$2" != "all" ]; then
		ret="$(echo "$ret" | tail -n "$2")"
	fi

	if [ -n "$ret" ]; then
		echo "$ret"
	else
		echo "$3"
	fi
}

# Print last commits for an Osmocom git repository, e.g.:
# "ec798b89700dcca5c5b28edf1a1cd16ea311f30a"
# $1: repository
# $2: amount of commits to print (default: 1)
# $3: string to print when there are no tags (default: empty string)
osmo_git_last_commits() {
	ret="$(osmo_git_last_commits_tags "$1" "$2" "$3")"
	echo "$ret" | awk '{print $1}'
}

# Print last tags for an Osmocom git repository, e.g.:
# "1.0.1"
# $1: repository
# $2: amount of commits to print (default: 1)
# $3: string to print when there are no tags (default: empty string)
osmo_git_last_tags() {
	ret="$(osmo_git_last_commits_tags "$1" "$2" "$3")"
	echo "$ret" | cut -d/ -f 3
}

# Pass all arguments to "git clone", but write the current date and time before the clone and on failure.
# This helps analyzing errors with git.osmocom.org (OS#4083).
osmo_git_clone_date() {
	date "+%Y-%m-%d %H:%M:%S"
	if ! git clone "$@"; then
		date "+%Y-%m-%d %H:%M:%S"
		exit 1
	fi
}

# Print git clone URL for an Osmocom git repository. Prefer the gerrit clone URL, because cloning from the regular URL
# sometimes results in the "garbage at end of loose object" error (OS#4083).
# $1: Osmocom project (e.g. "osmo-hlr")
osmo_git_clone_url() {
	case "$1" in
		rtl-sdr|osmo-fl2k|libosmo-dsp|libgtpnl|libasn1c|libusrp|libsmpp34)
			echo "$OSMO_GIT_URL"/"$1"
			;;
		*)
			echo "$OSMO_GIT_URL_GERRIT"/"$1"
			;;
	esac
}

# Print the subdirectory of the repository where the source lies (configure.ac etc.).
# Print nothing when the source is in the topdir of the repository.
osmo_source_subdir() {
	case "$1" in
		openbsc)
			echo "openbsc"
			;;
		simtrace2)
			echo "host"
			;;
	esac
}

# Build docker images from docker-playground.git.
# $1...$n: docker image names (e.g. "debian-stretch-build")
docker_images_require() {
	local oldpwd="$PWD"

	if [ -L "_docker_playground" ]; then
		echo "NOTE: _docker_playground is a symlink, skipping fetch, checkout, reset"
		cd "_docker_playground/$1"
	else
		# Get docker-plaground.git
		if [ -d "_docker_playground" ]; then
			git -C _docker_playground fetch
		else
			git clone https://git.osmocom.org/docker-playground/ _docker_playground
		fi

		cd _docker_playground
		git checkout "$OSMO_BRANCH_DOCKER_PLAYGROUND"
		git reset --hard "origin/$OSMO_BRANCH_DOCKER_PLAYGROUND"

		# jenkins-common.sh expects to run from a subdir in docker-playground.git
		cd "$1"
	fi

	# Subshell: run docker_images_require from jenkins-common.sh, pass all arguments
	(. ../jenkins-common.sh; docker_images_require "$@")
	ret=$?
	cd "$oldpwd"
	return $ret
}

# Abort the script if required programs are missing
# $1...$n: program name
osmo_cmd_require() {
	local fail=0
	for i in "$@"; do
		if ! command -v "$i" >/dev/null 2>&1; then
			echo "Required program not found: $i"
			fail=1
		fi
	done
	if [ "$fail" = 1 ]; then
		exit 1
	fi
}