]> arthur.barton.de Git - netdata.git/blob - packaging/packaging.functions
Merge pull request #1968 from ktsaou/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_MAJOR/s/.*\[\([^[]*\)\].*/\1/p' \
106          -e '/define(\[VERSION_MINOR/s/.*\[\([^[]*\)\].*/.\1/p' \
107          -e '/define(\[VERSION_FIX/s/.*\[\([^[]*\)\].*/.\1/p' \
108          -e '/define(\[VERSION_SUFFIX/s/.*\[\([^[]*\)\].*/\1/p' \
109          $MYTMP/files/configure.ac | tr -d '\n'`
110   if [ ! "$v" ]; then v="No version in configure.ac!"; fi
111   echo "$v"
112 }
113
114 get_configure_ac_package() {
115   get_staged_file configure.ac
116   local v=`sed -n -e 's/AC_INIT(\[\([^]]*\)\].*/\1/p' configure.ac`
117   if [ ! "$v" ]; then v="noname"; fi
118   echo "$v"
119 }
120
121 get_configure_ac_rpmrel() {
122   get_staged_file configure.ac
123   local v=`sed -n -e 's/PACKAGE_RPM_RELEASE="\([^"]*\)".*/\1/p' configure.ac`
124   if [ ! "$v" ]; then v="norpmrel"; fi
125   echo "$v"
126 }
127
128 get_spec_version() {
129   get_staged_file -o "$1".spec.in
130   test -f $MYTMP/files/"$1".spec.in || return 0 # Spec file is optional
131   sed -n -e '1,/^%changelog/d' -e '/^*/{s/.*- \([0-9].*\)/\1/p;q}' "$1".spec.in
132 }
133
134 splitver() {
135         local maj min fix sfx IFS=.-_
136
137         maj=$1
138         min=$2
139         fix=$3
140         sfx=$4
141
142         set -- $5
143         eval $maj=\$1 $min=\$2 $fix=\$3 $sfx=\$4
144 }
145
146 match_version() {
147   case "$1" in
148      [0-9]*.[0-9]*.[0-9]*_*)
149        # x.y.z_ZZZZ = development branch (can be before or after pre/rc)
150        echo "development"
151      ;;
152      [0-9]*.[0-9]*.[0-9]-pre[0-9]*)
153        echo "prerelease"
154      ;;
155      [0-9]*.[0-9]*.[0-9]-rc.[0-9]*)
156        echo "candidate"
157      ;;
158      [0-9]*.[0-9]*.[0-9]*)
159        echo "release"
160      ;;
161      *)
162        # Unknown
163        :
164      ;;
165   esac
166 }
167
168 check_versions() {
169   local status=0 exact=0 prerelease=0
170
171   if [ -f $MYTMP/version-checked ]
172   then
173     read status < $MYTMP/version-checked
174     return $status
175   fi
176
177   local confver=`get_configure_ac_version`
178   case "$(match_version $confver)" in
179      development)
180        :
181      ;;
182      prerelease|candidate|release)
183        exact=1
184      ;;
185      *)
186        echo "Unrecognised version in configure.ac ($confver)"
187        status=1
188      ;;
189   esac
190
191   local clogver=`get_changelog_version`
192   case "$(match_version $clogver)" in
193      development)
194        echo "Do not include development branch version in ChangeLog ($clogver)"
195        status=1
196      ;;
197      prerelease|candidate)
198        prerelease=1
199      ;;
200      release)
201        :
202      ;;
203      *)
204        echo "Unrecognised version format in ChangeLog ($clogver)"
205        status=1
206      ;;
207   esac
208
209   local package=`get_configure_ac_package`
210   local specver=`get_spec_version $package`
211
212   local clogmaj clogmin clogfix clogsfx
213   local confmaj confmin conffix confsfx
214   local specmaj specmin specfix specsfx
215
216   splitver clogmaj clogmin clogfix clogsfx "$clogver"
217   splitver confmaj confmin conffix confsfx "$confver"
218   splitver specmaj specmin specfix specsfx "$specver"
219
220   if [ "$specver" ]
221   then
222     if [ $specmaj -ne $clogmaj \
223       -o $specmin -ne $clogmin \
224       -o $specfix -ne $clogfix ]
225     then
226       echo "Main version of $package.spec.in ($specver) differs from ChangeLog ($clogver)"
227       status=1
228     fi
229   fi
230
231   if [ $status -eq 0 -a $exact -eq 0 ]
232   then
233
234     if [ $confmaj -gt $clogmaj \
235       -o $confmin -gt $clogmin \
236       -o $conffix -gt $clogfix ]
237     then
238       :
239     elif [ $confmaj -eq $clogmaj \
240         -a $confmin -eq $clogmin \
241         -a $conffix -eq $clogfix \
242         -a $prerelease -eq 1 ]
243     then
244       :
245     else
246       echo "Version in configure.ac ($confver) lesser than ChangeLog ($clogver)"
247       status=1
248     fi
249   fi
250
251   if [ $exact -eq 1 ]
252   then
253     echo "Running additional release checks"
254
255     if [ "$confver" != "$clogver" ]
256     then
257       echo "Version in configure.ac ($confver) differs from ChangeLog ($clogver)"
258       status=1
259     fi
260
261     if [ "$specver" ]
262     then
263       local confrpmrel=`get_configure_ac_rpmrel`
264       if [ "$specsfx" != "$confrpmrel" ]
265       then
266         echo "%changelog suffix in $package.spec.in ($specsfx) differs from configure.ac PACKAGE_RPM_RELEASE ($confrpmrel)"
267         status=1
268       fi
269     fi
270
271     if [ ! "$TRAVIS_TAG" ]
272     then
273       if [ "$(git tag -l v$confver)" ]
274       then
275         echo "Tag v$confver already exists"
276         status=1
277       fi
278
279       if [ "$(git config user.signingkey)" = "" ]
280       then
281         echo "You need to set up a PGP signing key e.g.:"
282         echo "   gpg --list-keys"
283         echo "and"
284         echo "   git config user.signingkey SHORTID"
285         echo "or"
286         echo "   git config --global user.signingkey SHORTID"
287         status=1
288       fi
289
290       git status -s | grep "^?" > $MYTMP/needclean
291       if [ -s $MYTMP/needclean ]
292       then
293         echo "The following files must be dealt with before commit:"
294         cat $MYTMP/needclean
295         echo "e.g. add them to .gitignore or remove with 'git clean -fdx'"
296         status=1
297       fi
298     fi
299   fi
300
301   echo $status > $MYTMP/version-checked
302   return $status
303 }
304
305 check_changelog() {
306   local status=0
307
308   if [ -f $MYTMP/changelog-checked ]
309   then
310     read status < $MYTMP/changelog-checked
311     return $status
312   fi
313
314   local version=`sed -ne '1s/.*(\(.*\)).*/\1/p' $filename`
315   if [ "`echo $version | grep '[[:space:]]'`" != "" ]
316   then
317     echo "ChangeLog version contains whitespace! Fix it!"
318     status=1
319   fi
320
321   echo $status > $MYTMP/changelog-checked
322   return $status
323 }