update
[shellsnippets/shellsnippets.git] / mksh / debian-dev / BuildDSC.sh
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/deb/BuildDSC.sh,v 1.20 2016/11/12 04:02:48 tg Exp $
3 #-
4 # Copyright (c) 2010, 2011
5 #       Thorsten Glaser <t.glaser@tarent.de>
6 # Copyright © 2015, 2016
7 #       mirabilos <m@mirbsd.org>
8 #
9 # Provided that these terms and disclaimer and all copyright notices
10 # are retained or reproduced in an accompanying document, permission
11 # is granted to deal in this work without restriction, including un‐
12 # limited rights to use, publicly perform, distribute, sell, modify,
13 # merge, give away, or sublicence.
14 #
15 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
16 # the utmost extent permitted by applicable law, neither express nor
17 # implied; without malicious intent or gross negligence. In no event
18 # may a licensor, author or contributor be held liable for indirect,
19 # direct, other damage, loss, or other issues arising in any way out
20 # of dealing in the work, even if advised of the possibility of such
21 # damage or existence of a defect, except proven that it results out
22 # of said person’s immediate fault when using the work as intended.
23 #-
24 # The current working directory, or else the directory in which this
25 # script resides, must be the root directory of a (extracted) Debian
26 # source package. It will then be renamed to the proper dirname, and
27 # a source package (*.dsc + others) will be created, then it will be
28 # renamed back.
29 # -a: pass -sa to dpkg-buildpackage (include origtgz)
30 # -d: pass -d to dpkg-buildpackage (ignore B-D absence)
31 # -N: pass -nc to dpkg-buildpackage (do not clean)
32 # -s arg: make a snapshot with “arg” being the version number suffix
33 # -S: build a snapshot with snapshot.YYYYMMDD.HHMMSS (UTC) as suffix
34 # -v: pass -v$OPTARG to dpkg-buildpackage (changelog since)
35 # Any further arguments will be passed to debian/rules via MAKEFLAGS
36
37 # sanitise environment
38 unset LANGUAGE
39 export LC_ALL=C
40 cd "$(realpath .)"
41
42 # preload
43 sync
44 date >/dev/null
45 stime_rfc=$(date +"%a, %d %b %Y %H:%M:%S %z")
46 stime_vsn=$(date -u +"%Y%m%d.%H%M%S")
47
48 opta=
49 optd=
50 optN=
51 optv=
52 snap=0
53 ssuf=
54 while getopts "adNSs:v:" ch; do
55         case $ch {
56         (a)     opta=-sa
57                 ;;
58         (+a)    opta=
59                 ;;
60         (d)     optd=-d
61                 ;;
62         (+d)    optd=
63                 ;;
64         (N)     optN=-nc
65                 ;;
66         (+N)    optN=
67                 ;;
68         (S)     snap=1
69                 ssuf=snapshot.$stime_vsn
70                 ;;
71         (+S)    snap=0
72                 ssuf=
73                 ;;
74         (s)     snap=1
75                 ssuf=$OPTARG
76                 ;;
77         (+s)    snap=0
78                 ssuf=
79                 ;;
80         (v)     optv=-v$OPTARG
81                 ;;
82         (*)     print -u2 Syntax error.
83                 exit 1
84                 ;;
85         }
86 done
87 shift $((OPTIND - 1))
88 export MAKEFLAGS="$*"
89
90 if (( snap )) && [[ $DEBEMAIL != +([A-Za-z])*' <'*'>' ]]; then
91         print -u2 'Please set $DEBEMAIL to "First M. Last <email@domain.com>"'
92         exit 1
93 fi
94
95 rmc=0
96 while :; do
97         echo >&2 "=== trying . = $(pwd)"
98         dh_testdir >/dev/null 2>&1 && break
99         if [[ -s debian/control.in && -s debian/rules && \
100             -x debian/rules && ! -e debian/control ]]; then
101                 rmc=1
102                 debian/rules debian/control
103         fi
104         dh_testdir >/dev/null 2>&1 && break
105         (( rmc )) && debian/rules remove/control
106         rmc=0
107         cd "$(dirname "$0")"
108         print -u2 "=== trying basedir = $(pwd)"
109         dh_testdir >/dev/null 2>&1 && break
110         if [[ -s debian/control.in && -s debian/rules && \
111             -x debian/rules && ! -e debian/control ]]; then
112                 rmc=1
113                 debian/rules debian/control
114         fi
115         dh_testdir >/dev/null 2>&1 && break
116         (( rmc )) && debian/rules remove/control
117         print -u2 "FAILED! Please change to the correct directory."
118         exit 1
119 done
120 mydir=$(pwd)
121 pkgstem=$(dpkg-parsechangelog -n1 | sed -n '/^Source: /s///p')
122 version=$(dpkg-parsechangelog -n1 | sed -n '/^Version: /s///p')
123 if (( snap )); then
124         updir=$(cd ..; pwd)
125         if ! T=$(mktemp "$updir/BuildDSC.tmp.XXXXXXXXXX"); then
126                 (( rmc )) && debian/rules remove/control
127                 print -u2 Could not create temporary file.
128                 exit 1
129         fi
130         cat debian/changelog >"$T"
131         touch -r debian/changelog "$T"
132         dist=$(dpkg-parsechangelog -n1 | sed -n '/^Distribution: /s///p')
133         if [[ $dist = UNRELEASED || $dist = x* ]]; then
134                 # we’re at “current” already, reduce
135                 version=$version'~'$ssuf
136         else
137                 # we’re at an uploaded version, raise
138                 version=$version'+'$ssuf
139         fi
140         print "$pkgstem ($version) UNRELEASED; urgency=low\n\n  *" \
141             "Automatically built snapshot (not backport) package.\n\n --" \
142             "$DEBEMAIL  $stime_rfc\n" >debian/changelog
143         cat "$T" >>debian/changelog
144         touch -r "$T" debian/changelog
145         if (( rmc )); then
146                 rm -f debian/control
147                 debian/rules debian/control
148         fi
149 fi
150 upstreamversion=${version%%-*([!-])}
151 upstreamversion=${upstreamversion#+([0-9]):}
152 cd ..
153 curname=${mydir##*/}
154 newname=$pkgstem-$upstreamversion
155 [[ $newname = $curname ]] || mv "$curname" "$newname"
156 cd "$newname"
157 dpkg-buildpackage -rfakeroot -S -I -i $optd $optN $opta $optv -us -uc
158 rv=$?
159 [[ -n $optN ]] || fakeroot debian/rules clean
160 cd ..
161 [[ $newname = $curname ]] || mv "$newname" "$curname"
162
163 cd "$curname"
164 if (( snap )); then
165         cat "$T" >debian/changelog
166         touch -r "$T" debian/changelog
167         rm -f "$T"
168 fi
169 (( rmc )) && debian/rules remove/control
170
171 exit $rv