support for jessie, and another snapshot exclusion tag
[shellsnippets/shellsnippets.git] / mksh / sysadmin / kuhbauer
1 #!/bin/mksh
2 # $Id: kuhbauer 3198 2012-09-23 15:46:07Z tglase $
3 #-
4 # Copyright © 2011, 2012
5 #       Thorsten Glaser <t.glaser@tarent.de>
6 # Licenced under the AGPLv3
7 #-
8 # root@dev-hudson:/usr/local/bin/kuhbauer via sudoers
9 # ALL     ALL=(ALL) NOPASSWD: /usr/local/bin/kuhbauer
10
11 unset LANG LANGUAGE LC_ADDRESS LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
12     LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
13     LC_TELEPHONE LC_TIME
14 export LC_ALL=C
15
16 xrepos=
17 issnapshot=0
18 while getopts 'r:S' ch; do
19         case $ch {
20         (r)     xrepos=$OPTARG ;;
21         # passed from vcs2deb, do not pass manually
22         (S)     issnapshot=1 ;;
23         }
24 done
25 shift $((OPTIND - 1))
26
27 if [[ $1 != @(sarge|etch|lenny|squeeze|wheezy|jessie|sid|dapper|hardy|karmic|lucid|maverick|natty|oneiric|precise)?(-backports?(-sloppy))?(/i386) || \
28     $2 != *.dsc || ! -s $2 || $SUDO_UID != +([0-9]) || $SUDO_GID != +([0-9]) ]]; then
29         print -u2 "Syntax: sudo $0 [-r xr] lenny-backports file.dsc [-B -m...]"
30         print -u2 "The third argument onwards are dpkg-buildpackage options."
31         print -u2 "The second argument is the target distribution and can be"
32         print -u2 "something like etch/i386 as well; appropriate chroots for"
33         print -u2 "that must be created by the admins."
34         print -u2 "The -r argument allows to pass extra APT repositories, as"
35         print -u2 "complete sources.list(5) 'deb' or 'deb-src' lines, with a"
36         print -u2 "pipe sign '|' as separator."
37         exit 255
38 fi
39
40 if ! now=$(date +%s) || [[ $now != +([0-9]) ]]; then
41         print -u2 Cannot determine current time.
42         exit 255
43 fi
44 typeset -Uui16 -Z11 now
45 if ! wd=$(realpath .) || [[ -z $wd ]]; then
46         print -u2 Cannot determine current working directory.
47         exit 255
48 fi
49 if ! T=$(mktemp -d /tmp/kuhbauer.XXXXXXXXXX); then
50         print -u2 Cannot create temporary directory.
51         exit 255
52 fi
53
54 export DIST=$1
55 shift
56 fn=$1
57 shift
58 dbargs=
59 binarch=0
60
61 for arg in "$@"; do
62         case $arg {
63         (-B)    binarch=1 ;;
64         }
65         dbargs="$dbargs '${arg//\'/\'\\\'\'}'"
66 done
67
68 set -A cbargs
69 [[ $DIST = */i386 ]] && cbargs[${#cbargs[*]}]=linux32
70 cbargs[${#cbargs[*]}]=cowbuilder
71 (( binarch )) && cbargs[${#cbargs[*]}]=--binary-arch
72 [[ -n $dbargs ]] && cbargs[${#cbargs[*]}]=--debbuildopts
73 [[ -n $dbargs ]] && cbargs[${#cbargs[*]}]=${dbargs# }
74 cbargs[${#cbargs[*]}]=--configfile
75 cbargs[${#cbargs[*]}]=$T/config
76 cbargs[${#cbargs[*]}]=--hookdir
77 cbargs[${#cbargs[*]}]=$T/hooks
78 cbargs[${#cbargs[*]}]=--build
79 cbargs[${#cbargs[*]}]=$fn
80
81 cat >"$T/config" <<-EOF
82         export BUILDRESULT='${T//\'/\'\\\'\'}/res'
83         export BUILDRESULTUID=0
84         export BUILDRESULTGID=0
85         export PKGNAME_LOGFILE_EXTENTION=_\${ARCHITECTURE}.${now#16#}.${DIST//'/'/!}.holzscheit
86 EOF
87
88 mkdir "$T/hooks" "$T/res"
89 print '#!/bin/sh' >"$T/hooks/D02repos"
90 print 'dpkg -i /tmp/tarent-keyring*.deb' >>"$T/hooks/D02repos"
91 has_ssl_repos=0
92 if [[ -n $xrepos ]]; then
93         saveIFS=$IFS
94         IFS='|'
95         print -r -- 'cat >>/etc/apt/sources.list <<"EOD"'
96         for repo in $xrepos; do
97                 [[ $repo = *'https://'* ]] && has_ssl_repos=1
98                 print -r -- "$repo"
99         done
100         print EOD
101         IFS=$saveIFS
102 fi >>"$T/hooks/D02repos"
103 print 'apt-get update' >>"$T/hooks/D02repos"
104 suppresstags=
105 if (( issnapshot )); then
106         extraargs='-X nmu'
107         suppresstags="$suppresstags package-has-long-file-name"
108 else
109         extraargs=
110 fi
111 cat >"$T/hooks/B00lintian" <<-EOF
112         #!/bin/sh
113         # \$MirOS: contrib/hosted/tg/deb/hookdir/B20lintian,v 1.2 2011/12/17 22:33:34 tg Exp $
114         # \$Id: kuhbauer 3198 2012-09-23 15:46:07Z tglase $
115
116         unset LANGUAGE
117         LC_ALL=C; export LC_ALL
118
119         ir=--install-recommends
120         # arrrrrgh!
121         apt-get install \$ir -s apt >/dev/null 2>&1 || ir=
122         apt-get --purge -y install \$ir lintian
123
124         argE=
125         argP=
126         if lintian -h 2>&1 | grep -F -- --display-experimental >/dev/null 2>&1; then
127                 argE=--display-experimental
128         fi
129         if lintian -h 2>&1 | grep -F -- --pedantic >/dev/null 2>&1; then
130                 argP=--pedantic
131         fi
132         argSup=
133         for x in $suppresstags; do
134                 if test -n "\$argSup"; then
135                         argSup=\$argSup,
136                 else
137                         lintian -h 2>&1 | grep -F -- --suppress-tags \
138                             >/dev/null 2>&1 || break
139                         argSup='--suppress-tags '
140                 fi
141                 argSup=\$argSup\$x
142         done
143         echo
144         echo ==================================================================
145         echo Running lintian...
146         echo
147         lintian -vIi \$argE \$argP \$argSup $extraargs --allow-root /tmp/buildd/*.changes 2>&1
148         echo
149         echo ==================================================================
150         echo
151 EOF
152 chmod +x "$T/hooks/D02repos" "$T/hooks/B00lintian"
153 if (( has_ssl_repos )); then
154         print '#!/bin/sh' >"$T/hooks/D01https"
155         print 'apt-get --purge -y install apt-transport-https' >>"$T/hooks/D01https"
156         chmod +x "$T/hooks/D01https"
157 fi
158
159 print -nr -- "=== running"
160 for arg in "${cbargs[@]}"; do
161         print -nr -- " '${arg//\'/\'\\\'\'}'"
162 done
163 print
164 "${cbargs[@]}"
165 rv=$?
166 print "=== errorlevel: $rv"
167
168 cd "$T/res"
169 ls -l
170 (( rv )) || for f in *; do
171         [[ -s $f ]] || continue
172         print -r "=== moving build result to: $wd"
173         chown $SUDO_UID:$SUDO_GID *
174         mv * "$wd/"
175         break
176 done
177
178 cd "$wd"
179 rm -rf "$T"
180 exit $rv