Fix multiple *.dsc in deb-src produces incorrect version match SA-660
[git-tools-moved-to-github.git] / id-deb-build / id-pbuild.sh
1 #!/bin/sh
2 # This script builds Debian packages for one or more distributions
3 # in i386/amd64 architectures. It uses pbuilder. pbuilder requires root
4 # privilege and so this script should be invoked with sudo.
5
6 usage()
7 {
8     cat <<EOF
9 Usage: id-pbuild.sh [OPTIONS]
10 Options:
11         [--debian=distros]
12         [--ubuntu=distros]
13         [--centos=distros]
14         [--upload]
15         [--concurrency=N]
16 EOF
17     exit $1
18 }
19
20 # things that might be set by options
21 upload=false
22 do_help=false
23 concurrency=4
24 ARCHS="i386 amd64"
25
26 if test -f IDMETA; then
27     . ./IDMETA
28 fi
29 while test $# -gt 0; do
30     case "$1" in
31         -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
32         *) optarg= ;;
33     esac
34     case $1 in
35         --debian=*)
36             DEBIAN_DIST_A=$optarg
37             ;;
38         --ubuntu=*)
39             UBUNTU_DIST_A=$optarg
40             ;;
41         --centos=*)
42             CENTOS_DIST_A=$optarg
43             ;;
44         --upload)
45             upload=true
46             ;;
47         --concurrency=*)
48             concurrency=$optarg
49             ;;
50         -*)
51             do_help=yes
52             ;;
53     esac
54     shift
55 done
56
57 if test "$DEBIAN_DIST_A" -o "$UBUNTU_DIST_A" -o "$CENTOS_DIST_A"; then
58     DEBIAN_DIST=$DEBIAN_DIST_A
59     UBUNTU_DIST=$UBUNTU_DIST_A
60     CENTOS_DIST=$CENTOS_DIST_A
61 fi
62
63 if test "$do_help" = "yes"; then
64     usage 1 1>&2
65 fi
66
67 if test "$DEBIAN_DIST" -o "$UBUNTU_DIST"; then
68     debian=true
69 else
70     debian=false
71 fi
72
73 D0=`dirname $0`
74 ID_DEB_BUILD=`cd $D0; pwd`
75 PBUILDROOT=${ID_DEB_BUILD}/id-pbuild-root.sh
76 if test ! -x $PBUILDROOT; then
77     echo "$PBUILDROOT not found"
78     exit 1
79 fi
80
81 if test "$CENTOS_DIST"; then
82     RNAME=`awk '/Name:/ {print $2}' *.spec`
83     echo "RNAME=$RNAME"
84     if test "$NAME" -a "$NAME" != "$RNAME"; then
85         echo "NAME in IDMETA ($NAME) does not match RPM spec NAME ($RNAME)"
86         exit 1
87     fi
88     PRODUCT=$RNAME
89 fi
90 if $debian; then
91     DNAME=`awk '/Source:/ {print $2}' debian/control`
92     if test "$NAME" -a "$NAME" != "$DNAME"; then
93         echo "NAME in IDMETA ($NAME) does not match debian/control ($DNAME)"
94         exit 1
95     fi
96     PRODUCT=$DNAME
97     if ! $upload; then
98         MKDEBSRC=${ID_DEB_BUILD}/id-mk-deb-src.sh
99         if test ! -x $MKDEBSRC; then
100             echo "$MKDEBSRC not found"
101             exit 1
102         fi
103         DCH=debian/changelog
104         if ! git ls-files $DCH --error-unmatch >/dev/null 2>&1; then
105             rm -f $DCH
106             echo "${DNAME} (${VERSION}-1.indexdata) unstable; urgency=medium" >$DCH
107             echo '' >>$DCH
108             echo '  * Upstream.' >>$DCH
109             echo '' >>$DCH
110             echo " -- `git config --get user.name` <`git config --get user.email`>  `date -R`" >>$DCH
111             echo '' >>$DCH
112         fi
113         if test "${SUDO_USER}"; then
114             if test ! -d deb-src; then
115                 $MKDEBSRC
116             fi
117         else
118             if test -d deb-src; then
119                 rm -f deb-src/*.gz
120                 if test $? -ne 0; then
121                     echo "deb-src could not be removed. Remove deb-src manually"
122                     exit 1
123                 fi
124                 rm -f deb-src/*.dsc
125             fi
126             $MKDEBSRC
127         fi
128     fi
129 else
130     mkdir -p deb-src
131 fi
132
133 cd deb-src
134
135 if $debian; then
136     for f in *.dsc; do
137         if test -f "$f"; then
138             PKG=$f
139         fi
140     done
141     if test -z "$PKG"; then
142         echo "Specify .dsc file"
143         exit 1
144     fi
145     if test ! -e "$PKG"; then
146         echo "${PKG} does not exist"
147         exit 1
148     fi
149     if grep "Architecture: all" $PKG >/dev/null; then
150         USE_ARCHS=i386
151     else
152         USE_ARCHS=$ARCHS
153     fi
154 fi
155
156 echo "Product: $PRODUCT"
157 echo "Ubuntu distros: $UBUNTU_DIST"
158 echo "Debian distros: $DEBIAN_DIST"
159 echo "Centos distros: $CENTOS_DIST"
160
161 if $debian; then
162     if test "${SUDO_USER}"; then
163         echo "Running as sudo."
164         echo "Tip: You can avoid it by adding the following in /etc/sudoers"
165         echo "${SUDO_USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
166         HOME_EXPORT=/home/${SUDO_USER}
167     else
168         sudo -k
169         HOME_EXPORT=$HOME
170     fi
171     if test ! -f ${HOME_EXPORT}/.pbuilderrc; then
172         echo "${HOME_EXPORT}/.pbuilderrc missing"
173         echo "You may need to run: ln -s ~/proj/git-tools/id-deb-build/pbuilderrc ~/.pbuilderrc"
174         exit 1
175     fi
176 fi
177
178 if $upload; then
179     for dist in ${CENTOS_DIST}; do
180         arch=amd64
181         prodver=${PRODUCT}-${VERSION}
182         if ! scp ${ID_DEB_BUILD}/../id-rpm-build/upload-rpms.sh ${dist}:rpmbuild/SOURCES/${prodver}/; then
183             echo "Copy of upload-rpms.sh to $dist failed"
184             exit 1
185         fi
186         if ssh $dist "cd rpmbuild/SOURCES/${prodver} && chmod +x upload-rpms.sh && ./upload-rpms.sh ${PRODUCT}.spec"; then
187             :
188         else
189             echo "Upload failed for $dist"
190             exit 1
191         fi
192     done
193     for dist in ${UBUNTU_DIST}; do
194         ssh ftp.indexdata.dk "mkdir -p /home/ftp/pub/${PRODUCT}/ubuntu/${dist}"
195         if ! scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/ubuntu/${dist}; then
196             echo "Upload failed for $dist"
197             exit 1
198         fi
199     done
200     for dist in ${DEBIAN_DIST}; do
201         ssh ftp.indexdata.dk "mkdir -p /home/ftp/pub/${PRODUCT}/debian/${dist}"
202         if ! scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/debian/${dist}; then
203             echo "Upload failed for $dist"
204             exit 1
205         fi
206     done
207     if test "${CENTOS_DIST}"; then
208         if ! ssh ftp.indexdata.dk "sudo -n /home/indexdata/proj/git-tools/update-archive/update-yum-archive.sh"; then
209             echo "update-yum-archive.sh failed"
210             exit 1
211         fi
212     fi
213     if test "${UBUNTU_DIST}" -o "${DEBIAN_DIST}"; then
214         if ! ssh ftp.indexdata.dk "sudo -n /home/indexdata/proj/git-tools/update-archive/update-archive.sh --ubuntu=\"${UBUNTU_DIST}\" --debian=\"${DEBIAN_DIST}\""; then
215             echo "update-archive.sh failed"
216             exit 1
217         fi
218     fi
219     echo "Upload successful - we hope"
220     exit 0
221 fi
222
223 rm -f *.log
224
225 # copy tars to centos build hosts
226 for dist in ${CENTOS_DIST}; do
227     arch=amd64
228     prodver=${PRODUCT}-${VERSION}
229     tarname=${prodver}.tar.gz
230     if test ! -f ../${tarname}; then
231         echo "$tarname: missing"
232         exit 1
233     fi
234
235     if ssh $dist "test -f .rpmmacros && test -d rpmbuild/SOURCES && test -d rpmbuild/RPMS && test -d rpmbuild/SRPMS"; then
236         :
237     else
238         echo "Host $dist does not seem to be prepared with rpmbuild directories"
239         exit 1
240     fi
241
242     if scp ../${tarname} $dist:rpmbuild/SOURCES/ ; then
243         :
244     else
245         echo "Could not copy $tarname to $dist"
246         exit 1
247     fi
248     if ssh $dist "cd rpmbuild/SOURCES && rm -fr $prodver && tar zxf $tarname && cd ${prodver} && rpmbuild -ba ${PRODUCT}.spec" >${dist}-${arch}.log 2>&1; then
249         :
250     else
251         echo "FAILED: See ${dist}-${arch}.log"
252         exit 1
253     fi
254 done
255
256 # call our privileged wrapper to clean the directories, no --dsc option
257 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
258     for arch in ${USE_ARCHS}; do
259         sudo -n $PBUILDROOT --home=${HOME_EXPORT} --dist=$dist --arch=$arch
260         if test $? -ne 0; then
261             echo "FAILED"
262             echo "Run id-pbuild.sh using sudo or add yourself to /etc/sudoers:"
263             echo "${USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
264             exit 1
265         fi
266     done
267 done
268
269 # call our privileged wrapper to do the real work, with --dsc option
270 i=0
271 date
272 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
273     for arch in ${USE_ARCHS}; do
274         sudo -n $PBUILDROOT --home=${HOME_EXPORT} \
275             --dist=$dist --arch=$arch --dsc=$PKG >${dist}-${arch}.log 2>&1 &
276         i=`expr $i + 1`
277         if test $i -eq $concurrency; then
278             i=0
279             wait
280             if test -f ${dist}-${arch}/*.dsc; then
281                 :
282             else
283                 echo "FAILED: No .dsc file for ${dist}-${arch}"
284                 exit 1
285             fi
286         fi
287     done
288 done
289 wait
290 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
291     for arch in ${USE_ARCHS}; do
292         if test -f ${dist}-${arch}/*.dsc; then
293             :
294         else
295             echo "FAILED: No .dsc file for ${dist}-${arch}"
296             exit 1
297         fi
298     done
299 done
300
301 date
302 echo "Done"
303 # Local Variables:
304 # mode:shell-script
305 # sh-indentation: 2
306 # sh-basic-offset: 4
307 # End: