madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

9ea51b7c81caf8ce4600f36436fe3770fd52073c
[code/mbuild.git] / sbuild-wrapper.sh
1 #!/bin/sh
2 #
3 #  - automate builds with sbuild and dinstall the result
4 #
5 # Copyright (c) 2008–2010 martin f. krafft <madduck@debian.org>
6 # Released under the terms of the Artistic Licence 2.0.
7 #
8 set -eu
9
10 ME="${0##*/}"
11
12 BUILDDIR="$(mktemp -dt $ME.XXXXXXXX)"
13 cleanup() {
14   cd /tmp && rm -r "$BUILDDIR"
15   trap - 1 2 3 4 5 6 7 8 10 11 12 13 14 15
16 }
17 trap cleanup 1 2 3 4 5 6 7 8 10 11 12 13 14 15
18
19 BUNDLE_DIR="${TMPDIR:-/tmp}"
20 TARGET_DIR="$PWD"
21 copy_back_files() {
22   echo "Copying files destined for $1 back to $TARGET_DIR..."
23   dcmd cp -v "$2" "$TARGET_DIR"
24 }
25 dinstall() {
26   copy_back_files "$@"
27 }
28 print_bundle_location() {
29   echo "Bundle available at $@ ."
30 }
31 postbuild() {
32   :
33 }
34
35 KEYID=
36
37 MBUILDRCS="/etc/mbuild/rc $HOME/.mbuildrc $HOME/.mbuild/rc"
38 for rc in $MBUILDRCS; do
39   [ -r "$rc" ] && . "$rc"
40 done
41
42 if [ -z "$KEYID" ]; then
43   echo "E: \$KEYID is not defined in rc file." >&2
44   exit 1
45 fi
46
47 DEB_BUILD_ARCH="$(dpkg-architecture -qDEB_BUILD_ARCH)"
48
49 about()
50 {
51   echo "$ME -- wrapper for sbuild"
52   echo "Copyright © martin f. krafft <madduck@debian.org>"
53   echo "Released under the terms of the Artistic Licence 2.0"
54 }
55
56 usage()
57 {
58   about
59   echo
60   echo "Usage: $ME [options] [sbuild_options] file_source.changes"
61   echo
62   echo "Valid options are:"
63   cat <<-_eof | column -s\& -t
64         --dist & specify the target distribution (default: from changes file)
65         --arch & specify the target architecture (default: $DEB_BUILD_ARCH)
66         -sa & pass --force-orig-source to sbuild
67         -B & do a binary-only build
68         -h|--help & show this output.
69         -V|--version & show version information.
70         _eof
71 }
72
73 binonly=0
74 sbuild_args=
75 schangesfile=
76 arch=
77 for opt in "$@"; do
78   case "$opt" in
79     -h|--help) usage; exit 0;;
80     -V|--version) about; exit 0;;
81     --arch=*) arch="${opt#--arch=}";;
82     -D) sbuild_args="${sbuild_args:+$sbuild_args }$opt";;
83     -sa) sbuild_args="${sbuild_args:+$sbuild_args }--force-orig-source";;
84     -B) binonly=1;;
85     --*) sbuild_args="${sbuild_args:+$sbuild_args }$opt";;
86     *_source.changes)
87       if [ -z "$schangesfile" ]; then
88         if [ -f "$opt" ] && [ -r "$opt" ]; then
89           schangesfile="$opt"
90         else
91           echo "E: file does not exist: $opt" >&2
92           exit 1
93         fi
94       else
95         echo "E: cannot pass more than one source changes file: $opt" >&2
96         exit 1
97       fi
98       ;;
99     *)
100       echo "E: unknown option: $opt" >&2
101       exit 1
102       ;;
103   esac
104 done
105
106 if [ -z "$schangesfile" ]; then
107   usage
108   exit 1
109 fi
110
111 [ -z "$arch" ] && arch="$DEB_BUILD_ARCH"
112
113 dist="$(sed -ne 's,Distribution: ,,p' "$schangesfile")"
114
115 schangesfile_basename="${schangesfile##*/}"
116 packagename="${schangesfile_basename%%_*}"
117 packagenameversion="${schangesfile_basename%_*}"
118 debversion="${packagenameversion#*_}"
119 upstream_version="${debversion%-*}"
120 dscfile_basename="$packagenameversion".dsc
121
122 case "$schangesfile" in
123   */*) cd "${schangesfile%/*}";;
124   *) :;;
125 esac
126 dcmd cp "${schangesfile##*/}" "$BUILDDIR"
127 schangesfile="$schangesfile_basename"
128
129 OLDPWD="$PWD"
130 cd "$BUILDDIR"
131
132 dcmd "$dscfile_basename" | while read f; do
133   test -f "$f" && continue
134
135   case "$f" in
136     *.tar.gz|*.tar.bz2|*.tar.lzma|*.tar.xz)
137       if [ -f "$OLDPWD/$f" ]; then
138         echo "I: using existing tarball for $upstream_version…" >&2
139         cp $OLDPWD/$f $f
140       else
141         last_version="$(apt-cache madison $packagename | sed -rne "s,.+(\<${upstream_version}[^[:space:]]+).*,\1,p")"
142         echo "I: fetching missing tarball for $upstream_version (from $last_version)…" >&2
143         if ! apt-get --tar-only --only-source source "${packagename}=${last_version}"; then
144           echo "E: I do not know how to obtain the file: $f" >&2
145           exit 1
146         fi
147       fi
148       ;;
149     *)
150       echo "E: I do not know how to obtain the file: $f" >&2
151       exit 1
152       ;;
153   esac
154 done
155
156 [ "$binonly" = 0 ] && sbuild_args="${sbuild_args:+$sbuild_args }--source --arch-all"
157
158 sbuild $sbuild_args --arch="$arch" --dist="$dist" --keyid=$KEYID \
159   "$dscfile_basename"
160
161 changesfile="${packagenameversion}_${arch}.changes"
162
163 postbuild "$changesfile"
164
165 dinstall "$dist" "$changesfile"
166
167 DATESTR="$(date +%Y.%m.%d.%H%M%S)"
168 BUILD_PREFIX="${packagenameversion}_${arch}.${DATESTR}"
169
170 mv current "${BUILD_PREFIX}".buildlog
171 rm -f current-*
172
173 bundle="${BUNDLE_DIR}/${BUILD_PREFIX}".bundle.tar
174 tar -chf "$bundle" *
175 chmod 644 "$bundle"
176
177 cleanup
178
179 print_bundle_location "$bundle"
180
181 exit 0