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