Merge branch 'PolynomialDivision-feature/add_workflow'
[olsrd.git] / redhat / runner
1 #!/bin/bash
2
3 set -e
4 set -u
5
6 script="$0"
7
8 scriptDir="$(dirname "$script" 2> /dev/null)"
9 pushd "$scriptDir" &> /dev/null
10 scriptDir="$(pwd 2> /dev/null)"
11 popd &> /dev/null
12
13 baseDir="$(dirname "$scriptDir" 2> /dev/null)"
14 pushd "$baseDir" &> /dev/null
15 baseDir="$(pwd 2> /dev/null)"
16 popd &> /dev/null
17
18
19 declare -i FEDORAMINVERSION=30
20
21 specTemplateFile="$scriptDir/olsrd.spec.template"
22 outputDir="$scriptDir/generated"
23 specOutputFile="$outputDir/olsrd.spec"
24
25 RPMBUILDDIR="$HOME/rpmbuild"
26 SPECDIR="$RPMBUILDDIR/SPECS"
27 SRCDIR="$RPMBUILDDIR/SOURCES"
28
29 toInstall=""
30 if [[ -z "$(which "mock" 2> /dev/null)" ]]; then
31   toInstall="mock $toInstall"
32 fi
33 if [[ -z "$(which "rpmbuild" 2> /dev/null)" ]]; then
34   toInstall="rpm-build $toInstall"
35 fi
36 if [[ -z "$(which "rpmdev-setuptree" 2> /dev/null)" ]]; then
37   toInstall="rpmdevtools $toInstall"
38 fi
39 if [[ -n "$toInstall" ]]; then
40   echo "ERROR: one or more tools not found, please run"
41   echo "         sudo dnf install -y $toInstall"
42   exit 1
43 fi
44
45
46
47 declare -i fedoraVersion=0
48 checkFedora() {
49   if [[ ! -f "/etc/fedora-release" ]]; then
50     echo "ERROR: this is not a fedora machine."
51     exit 1
52   fi
53
54   local _tmpFile="$(mktemp 2> /dev/null)"
55   cat > "$_tmpFile" << "EOF"
56 Name:    dummy
57 Version: 1
58 Release: 1
59 Summary: dummy
60 License: BSD
61
62 Source0: %{?fedora}
63
64 %description
65 Dummy
66 EOF
67
68   local _tmpDir="$(mktemp -d 2> /dev/null)"
69   local _parsedSpec="$(rpmspec -D "%_topdir $_tmpDir" -P "$_tmpFile" 2> /dev/null)"
70   rm -f "$_tmpFile"
71
72   local -i fed=$(echo "$_parsedSpec" | \
73                  grep -E '^Source0:' 2> /dev/null | \
74                  awk '{print $NF}' 2> /dev/null)
75
76   if [[ $fed -lt $FEDORAMINVERSION ]]; then
77     echo "ERROR: This is Fedora $fed, need at least Fedora $FEDORAMINVERSION."
78     exit 1
79   fi
80   fedoraVersion=$fed
81 }
82
83
84 checkInGitTree() {
85   local gitDir="$(git rev-parse --show-toplevel 2> /dev/null)"
86   if [[ -z "$gitDir" ]]; then
87     echo "ERROR: not in a Git tree."
88     exit 1
89   fi
90 }
91
92
93 gitDescriptor=""
94 gitSHAAbbrev=""
95 gitSHA=""
96 getGitInformation() {
97   pushd "$baseDir" &> /dev/null
98   gitDescriptor="$(git describe --always --dirty --match "v[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*" 2> /dev/null)"
99   gitSHAAbbrev="$(git log -1 --pretty=%h 2> /dev/null)"
100   gitSHA="$(git rev-list -1 HEAD 2> /dev/null)"
101   popd &> /dev/null
102 }
103
104 checkWorkspaceIsClean() {
105   local gitDescriptor="$1"
106
107   if [[ -n "$(echo "$gitDescriptor" | grep -E -i '\-dirty$' 2> /dev/null)" ]]; then
108     echo "ERROR: do not use a dirty workspace, clean up first with"
109     echo "         git clean -fdx"
110     echo "         git reset --hard"
111     exit 1
112   fi
113 }
114
115
116 gitVersion=""
117 gitRelease=""
118 adjustGitInformation() {
119   local gitDescriptor="$1"
120
121   gitDescriptor="${gitDescriptor#v}"
122   gitDescriptor="${gitDescriptor/-/.}"
123   gitDescriptor="${gitDescriptor/-/ }"
124   local -a gitDescriptors=( $gitDescriptor )
125   if [[ ${#gitDescriptors[*]} -eq 1 ]]; then
126     gitVersion="${gitDescriptors[0]}"
127     gitRelease="0"
128   elif [[ ${#gitDescriptors[*]} -eq 2 ]]; then
129     gitVersion="${gitDescriptors[0]}"
130     gitRelease="${gitDescriptors[1]}"
131   else
132     echo "ERROR: too many elements in the Git version"
133     set | egrep '^gitDescriptors='
134     exit 1
135   fi
136
137   gitVersion="${gitVersion//-/.}"
138   gitRelease="${gitRelease//-/.}"
139 }
140
141
142 function clean() {
143   rm -fv "$specOutputFile" "$outputDir/olsrd-"*.$tarGitFormat \
144          "$outputDir/RPMS/"*.rpm "$outputDir/RPMS/"*.log
145   if [[ -d "$outputDir/RPMS" ]]; then
146     rmdir -v --ignore-fail-on-non-empty "$outputDir/RPMS"
147   fi
148   if [[ -d "$outputDir" ]]; then
149     rmdir -v --ignore-fail-on-non-empty "$outputDir"
150   fi
151 }
152
153
154 # generate spec file and tar file in rpmbuild tree
155 function generate() {
156   mkdir -p -v "$outputDir"
157
158   echo "Generating '$specOutputFile'"
159   sed -e "s/__gitVersion__/$gitVersion/g" \
160       -e "s/__gitRelease__/$gitRelease/g" \
161       -e "s/__gitDescriptor__/$gitDescriptor/g" \
162       -e "s/__gitSHAAbbrev__/$gitSHAAbbrev/g" \
163       -e "s/__gitSHA__/$gitSHA/g" \
164       -e "s!__tarFilename__!$tarOutputFilename!g" \
165       "$specTemplateFile" > "$specOutputFile"
166
167   echo "Generating '$outputDir/$tarOutputFilename'"
168   pushd "$baseDir" &> /dev/null
169   git archive \
170     --prefix=$tarPrefix/ \
171     --format $tarGitFormat HEAD \
172     > "$outputDir/$tarOutputFilename"
173   popd &> /dev/null
174 }
175
176
177 build() {
178   local _mockCfg="fedora-$fedoraVersion-x86_64"
179   if [[ $# -gt 0 ]]; then
180     _mockCfg="$1"
181   fi
182
183   rpmdev-setuptree
184
185   cp -v "$specOutputFile" "$SPECDIR/olsrd.spec"
186   cp -v "$outputDir/$tarOutputFilename"  "$SRCDIR/$tarOutputFilename"
187
188   cd "$SPECDIR"
189
190   local msg="$(rpmbuild -v -bs "olsrd.spec" 2> /dev/null)"
191   local srpmFile="$(echo "$msg" | sed -r 's/^[^:]*:[[:space:]]*//' 2> /dev/null)"
192
193   echo "$msg"
194
195   mock \
196     --dnf \
197     --enable-network \
198     -r "$_mockCfg" \
199     --resultdir="$outputDir/RPMS" \
200     "$srpmFile"
201 }
202
203
204 all() {
205   clean
206   generate
207   build "$@"
208 }
209
210
211
212
213 if [[ $# -lt 1 ]]; then
214   echo "ERROR: need a function to run."
215   exit 1
216 fi
217
218 whatToDo="$1"
219 shift 1
220
221 checkFedora
222 checkInGitTree
223 getGitInformation
224 checkWorkspaceIsClean "$gitDescriptor"
225 adjustGitInformation  "$gitDescriptor"
226
227 tarPrefix="olsrd-$gitVersion-$gitRelease"
228 tarGitFormat="tar.gz"
229 tarOutputFilename="$tarPrefix.$tarGitFormat"
230
231 "$whatToDo" "$@"
232