]> arthur.barton.de Git - netdata.git/blob - packaging/packaging.functions
Merge remote-tracking branch 'lucadev/master'
[netdata.git] / packaging / packaging.functions
1 #!/bin/bash
2
3 packaging_check_init() {
4   version_check=
5 }
6
7 packaging_check_file() {
8   local filename="$1" status=0
9
10   case $filename in
11     configure.ac)
12       check_versions || status=1
13       version_check=Y
14     ;;
15     *.spec.in)
16       check_versions || status=1
17       version_check=Y
18     ;;
19     ChangeLog)
20       check_versions || status=1
21       version_check=Y
22       if [ $status -eq 0 ]
23       then
24         check_changelog || status=1
25       fi
26     ;;
27     *)
28       #echo "No checks found for $filename"
29       :
30     ;;
31   esac
32   return $status
33 }
34
35 packaging_check_fin() {
36   if [ "$version_check" ]
37   then
38     version=`get_configure_ac_version`
39     case "$(match_version $version)" in
40       prerelease|candidate|release)
41         try_build || status=1
42         if [ $status -eq 0 ]
43         then
44            cp $MYTMP/build/*.tar.* .
45            echo "Check $(cd $MYTMP/build && ls *.tar.gz) before pushing tags"
46         fi
47       ;;
48     esac
49   fi
50 }
51
52 get_staged_file() {
53   local optional=0
54   if [ "$1" = "-o" ]
55   then
56     optional=1
57     shift
58   fi
59
60   local dir="${1%/*}"
61   if [ "$dir" = "$1" ]; then dir="."; fi
62   mkdir -p $MYTMP/files/$dir
63
64   test -f $MYTMP/files/$1 && return 0
65
66   if [ "$from_cache" ]
67   then
68     if [ $optional -eq 1 ]
69     then
70       git show :$1 > $MYTMP/files/$1 2> /dev/null || rm -f $MYTMP/files/$1
71     else
72       git show :$1 > $MYTMP/files/$1
73     fi
74   else
75     if [ $optional -eq 0 -o -f $1 ]
76     then
77       cp $1 $MYTMP/files/$1
78     fi
79   fi
80 }
81
82 try_build() {
83   if [ -f $MYTMP/success ]; then return 0; fi
84   mkdir -p $MYTMP/build
85   git archive HEAD | tar -xf - -C "$MYTMP/build"
86   git diff --staged | patch -p1 -d "$MYTMP/build"
87   (cd $MYTMP/build; ./packaging/git-build || touch $MYTMP/fail)
88   if [ -f $MYTMP/fail ]; then return 1; fi
89   (cd $MYTMP/build; ./packaging/tar-compare . *.tar.gz || touch $MYTMP/fail)
90   if [ -f $MYTMP/fail ]; then return 1; fi
91   touch $MYTMP/success
92   return 0
93 }
94
95 get_changelog_version() {
96   get_staged_file ChangeLog
97   local v=`sed -ne '1s/.*(\(.*\)).*/\1/p' $MYTMP/files/ChangeLog`
98   if [ ! "$v" ]; then v="No version in ChangeLog!"; fi
99   echo "$v"
100 }
101
102 get_configure_ac_version() {
103   get_staged_file configure.ac
104   local v=`sed -n \
105          -e '/define(\[VERSION_\(MINOR\|FIX\)/s/.*\[\([^[]*\)\].*/.\1/p' \
106          -e '/define(\[VERSION_\(MAJOR\|SUFFIX\)/s/.*\[\([^[]*\)\].*/\1/p' \
107          $MYTMP/files/configure.ac | tr -d '\n'`
108   if [ ! "$v" ]; then v="No version in configure.ac!"; fi
109   echo "$v"
110 }
111
112 get_configure_ac_package() {
113   get_staged_file configure.ac
114   local v=`sed -n -e 's/AC_INIT(\[\([^]]*\)\].*/\1/p' configure.ac`
115   if [ ! "$v" ]; then v="noname"; fi
116   echo "$v"
117 }
118
119 get_configure_ac_rpmrel() {
120   get_staged_file configure.ac
121   local v=`sed -n -e 's/PACKAGE_RPM_RELEASE="\([^"]*\)".*/\1/p' configure.ac`
122   if [ ! "$v" ]; then v="norpmrel"; fi
123   echo "$v"
124 }
125
126 get_spec_version() {
127   get_staged_file "$1".spec.in
128   test -f $MYTMP/files/"$1".spec.in || return 0 # Spec file is optional
129   sed -n -e '1,/^%changelog/d' -e '/^*/{s/.*- \([0-9].*\)/\1/p;q}' "$1".spec.in
130 }
131
132 splitver() {
133         local maj min fix sfx IFS=.-_
134
135         maj=$1
136         min=$2
137         fix=$3
138         sfx=$4
139
140         set -- $5
141         eval $maj=\$1 $min=\$2 $fix=\$3 $sfx=\$4
142 }
143
144 match_version() {
145   case "$1" in
146      [0-9]*.[0-9]*.[0-9]*_*)
147        # x.y.z_ZZZZ = development branch (can be before or after pre/rc)
148        echo "development"
149      ;;
150      [0-9]*.[0-9]*.[0-9]-pre[0-9]*)
151        echo "prerelease"
152      ;;
153      [0-9]*.[0-9]*.[0-9]-rc.[0-9]*)
154        echo "candidate"
155      ;;
156      [0-9]*.[0-9]*.[0-9]*)
157        echo "release"
158      ;;
159      *)
160        # Unknown
161        :
162      ;;
163   esac
164 }
165
166 check_versions() {
167   local status=0 exact=0 prerelease=0
168
169   if [ -f $MYTMP/version-checked ]
170   then
171     read status < $MYTMP/version-checked
172     return $status
173   fi
174
175   local confver=`get_configure_ac_version`
176   case "$(match_version $confver)" in
177      development)
178        :
179      ;;
180      prerelease|candidate|release)
181        exact=1
182      ;;
183      *)
184        echo "Unrecognised version in configure.ac ($confver)"
185        status=1
186      ;;
187   esac
188
189   local clogver=`get_changelog_version`
190   case "$(match_version $clogver)" in
191      development)
192        echo "Do not include development branch version in ChangeLog ($clogver)"
193        status=1
194      ;;
195      prerelease|candidate)
196        prerelease=1
197      ;;
198      release)
199        :
200      ;;
201      *)
202        echo "Unrecognised version format in ChangeLog ($clogver)"
203        status=1
204      ;;
205   esac
206
207   local package=`get_configure_ac_package`
208   local specver=`get_spec_version $package`
209
210   local clogmaj clogmin clogfix clogsfx
211   local confmaj confmin conffix confsfx
212   local specmaj specmin specfix specsfx
213
214   splitver clogmaj clogmin clogfix clogsfx "$clogver"
215   splitver confmaj confmin conffix confsfx "$confver"
216   splitver specmaj specmin specfix specsfx "$specver"
217
218   if [ "$specver" ]
219   then
220     if [ $specmaj -ne $clogmaj \
221       -o $specmin -ne $clogmin \
222       -o $specfix -ne $clogfix ]
223     then
224       echo "Main version of $package.spec.in ($specver) differs from ChangeLog ($clogver)"
225       status=1
226     fi
227   fi
228
229   if [ $status -eq 0 -a $exact -eq 0 ]
230   then
231
232     if [ $confmaj -gt $clogmaj \
233       -o $confmin -gt $clogmin \
234       -o $conffix -gt $clogfix ]
235     then
236       :
237     elif [ $confmaj -eq $clogmaj \
238         -a $confmin -eq $clogmin \
239         -a $conffix -eq $clogfix \
240         -a $prerelease -eq 1 ]
241     then
242       :
243     else
244       echo "Version in configure.ac ($confver) lesser than ChangeLog ($clogver)"
245       status=1
246     fi
247   fi
248
249   if [ $exact -eq 1 ]
250   then
251     echo "Running additional release checks"
252
253     if [ "$confver" != "$clogver" ]
254     then
255       echo "Version in configure.ac ($confver) differs from ChangeLog ($clogver)"
256       status=1
257     elif [ "$(git tag -l v$confver)" ]
258     then
259       echo "Tag v$confver already exists"
260       status=1
261     fi
262
263     if [ "$specver" ]
264     then
265       local confrpmrel=`get_configure_ac_rpmrel`
266       if [ "$specsfx" != "$confrpmrel" ]
267       then
268         echo "%changelog suffix in $package.spec.in ($specsfx) differs from configure.ac PACKAGE_RPM_RELEASE ($confrpmrel)"
269         status=1
270       fi
271     fi
272
273     if [ "$(git config user.signingkey)" = "" ]
274     then
275       echo "You need to set up a PGP signing key e.g.:"
276       echo "   gpg --list-keys"
277       echo "and"
278       echo "   git config user.signingkey SHORTID"
279       echo "or"
280       echo "   git config --global user.signingkey SHORTID"
281       status=1
282     fi
283
284     git status -s | grep "^?" > $MYTMP/needclean
285     if [ -s $MYTMP/needclean ]
286     then
287       echo "The following files must be dealt with before commit:"
288       cat $MYTMP/needclean
289       echo "e.g. add them to .gitignore or remove with 'git clean -fdx'"
290       status=1
291     fi
292   fi
293
294   echo $status > $MYTMP/version-checked
295   return $status
296 }
297
298 check_changelog() {
299   local status=0
300
301   if [ -f $MYTMP/changelog-checked ]
302   then
303     read status < $MYTMP/changelog-checked
304     return $status
305   fi
306
307   local version=`sed -ne '1s/.*(\(.*\)).*/\1/p' $filename`
308   if [ "`echo $version | grep '[[:space:]]'`" != "" ]
309   then
310     echo "ChangeLog version contains whitespace! Fix it!"
311     status=1
312   fi
313
314   echo $status > $MYTMP/changelog-checked
315   return $status
316 }