Fix chroot name, document dependency
[invirt/third/common.git] / invirtificator.sh
1 # Interface: define variables name, ivversionappend, and function
2 # hack_package ().
3
4 # Depends: dpkg-awk
5
6 # Usage: invirtify-$foo {source|binary|upload}
7
8 set -e
9
10 dist=hardy
11 chroot=$dist-amd64-sbuild
12
13 : ${section=invirt-system}
14 : ${ivname=$name}
15 : ${release=unstable}
16
17 # Create a chroot and define functions for using it.
18 sid=$(schroot -b -c "$chroot")
19 trap 'schroot -e -c "$sid"' EXIT
20 sch() { schroot -r -c "$sid" -- "$@"; }           # Run in the chroot
21 schq() { schroot -q -r -c "$sid" -- "$@"; }       # Run in the chroot quietly
22 schr() { schroot -r -c "$sid" -u root -- "$@"; }  # Run in the chroot as root
23 schr apt-get -qq -y update || exit 3
24
25 quote() {
26   echo "$1" | sed 's/[^[:alnum:]]/\\&/g'
27 }
28
29 munge_sections () {
30     perl -0pe "s/^Section: /Section: $section\\//gm or die" -i debian/control
31 }
32
33 add_changelog () {
34     if [ -n "$dch_done" ]; then
35         dch "$@"
36     else
37         echo | dch -v"${ivversion}" -D unstable "$@"
38         dch_done=1
39     fi
40 }
41
42 append_description () {
43     perl -0pe 'open THREE, "</dev/fd/3"; $x = <THREE>; s/(^Description:.*\n( .*\S.*\n)*)/$1$x/gm or die' -i debian/control 3<&0
44 }
45
46 add_build_depends () {
47     perl -0pe 's/^(Build-Depends:.*(?:\n[ \t].*)*)$/$1, '"$1"'/m or die' -i debian/control
48 }
49
50 add_invirt_provides () {
51     [ "$name" = "$ivname" ]
52     perl -0pe 's/^(Package: (.*)\n(?:(?!Provides:).+\n)*)(?:Provides: (.*)\n((?:.+\n)*))?(?=\n|\z)/$1Provides: $3, invirt-$2\n$4/mg or die; s/^Provides: , /Provides: /mg' -i debian/control
53     add_changelog "Provide invirt-$name."
54 }
55
56 rename_source () {
57     perl -pe "s{^Source: $name\$}{Source: $ivname}" -i debian/control
58     add_changelog "Rename package to $ivname."
59     perl -0pe "s/^$name/$ivname/" -i debian/changelog
60 }
61
62 find_arch () {
63     if grep -iq '^Architecture: all' "${ivname}_$ivfilever.dsc"; then
64         a=-A
65     fi
66 }
67
68 cmd_source () {
69     echo "Building source for $ivname-$ivfilever on ${dist}-amd64" >&2
70     
71     if ! [ -e "${name}_$filever.dsc" ]; then
72         sch apt-get -d source "$name"
73     fi
74     
75     if ! [ -e "${ivname}_$ivfilever.dsc" ]; then
76         (
77             tmpdir=$(mktemp -td "invirtify.$$.XXXXXXXXXX")
78             trap 'rm -rf "$tmpdir"' EXIT
79             origversion=$(echo "$filever" | sed 's/-[^-]*$//')
80             cp -a "${name}_$origversion.orig.tar.gz" "$tmpdir/"
81             dscdir=$(pwd)
82             cd "$tmpdir/"
83             dpkg-source -x "$dscdir/${name}_$filever.dsc" "$tmpdir/$name-$origversion"
84             cd "$tmpdir/$name-$origversion"
85             dch_done=
86             hack_package
87             if [ "$name" != "$ivname" ]; then
88                 rename_source
89                 cp -a "$tmpdir/${name}_$origversion.orig.tar.gz" "$tmpdir/${ivname}_$origversion.orig.tar.gz"
90                 cp -a "$tmpdir/${ivname}_$origversion.orig.tar.gz" "$dscdir"
91             fi
92             [ -n "$dch_done" ]
93             schr apt-get -q -y install devscripts pbuilder
94             schr /usr/lib/pbuilder/pbuilder-satisfydepends
95             sch debuild -S -sa -us -uc -i -I.svn && cp -a "../${ivname}_$ivfilever"* "$dscdir"
96         )
97         [ $? -eq 0 ] || exit 1
98         
99         if [ -n "$IV_CHECK_DIFFS" ]; then
100             interdiff -z "${name}_$filever.diff.gz" "${ivname}_$ivfilever.diff.gz" | \
101                 enscript --color --language=ansi --highlight=diffu --output=- -q | \
102                 less -R
103             echo -n "Press Enter to continue: " >&2
104             read dummy
105         fi
106     fi
107 }
108
109 cmd_binary () {
110     find_arch
111
112     if [ "$a" = "-A" ]; then
113         sbuild -d "$dist" --arch-all "${ivname}_$ivfilever.dsc"
114     else
115         sbuild -d "$dist" --arch amd64 --arch-all "${ivname}_$ivfilever.dsc"
116         sbuild -d "$dist" --arch i386 "${ivname}_$ivfilever.dsc"
117     fi
118 }
119
120 v () {
121     echo "$@"
122     "$@"
123 }
124
125 cmd_upload () {
126     find_arch
127
128     v reprepro-env include "${release}" "${ivname}_${ivfilever}_source.changes"
129     v reprepro-env include "${release}" "${ivname}_${ivfilever}_amd64.changes"
130     if [ -z "$a" ]; then
131         v reprepro-env include "${release}" "${ivname}_${ivfilever}_i386.changes"
132     fi
133 }
134
135 version=$(
136     sch apt-cache showsrc "$name" | \
137         sed -n 's/^Version: \(.*\)$/\1/ p' | (
138         version='~~~'
139         while read -r newversion; do
140             if [ $(expr "$newversion" : '.*invirt') = 0 ] && \
141                 dpkg --compare-versions "$newversion" '>' "$version"; then
142                 version=$newversion
143             fi
144         done
145         if [ "$version" = '~~~' ]; then
146             echo "No version of $name found." >&2
147             exit 1
148         fi
149         echo "$version"
150         )
151     )
152 ivversion=$version$ivversionappend
153
154 filever=$(echo "$version" | perl -pe 's/([^:]*:)?//')
155 ivfilever=$(echo "$ivversion" | perl -pe 's/([^:]*:)?//')
156
157 # Look for binary packages built from the named package with the right
158 # version, and exit out if we find one (an architecture-specific one
159 # if we weren't run with the -A flag).  We need to look for either a
160 # Source: or a Package: header matching $name since there is no
161 # Source: header for a package whose name matches its source.
162 pkgfiles="/srv/repository/dists/$release/$section/binary-*/Packages.gz"
163 if { zcat $pkgfiles | \
164     dpkg-awk -f - "Package:^$ivname\$" "Version:^$(quote "$ivversion")\$" -- Architecture;
165     zcat $pkgfiles | \
166     dpkg-awk -f - "Source:^$ivname\$" "Version:^$(quote "$ivversion")\$" -- Architecture; } \
167     | if [ "$a" = "-A" ]; then cat; else fgrep -vx 'Architecture: all'; fi \
168     | grep -q .; then
169     echo "$ivname $ivversion already exists." >&2
170     exit 0
171 fi
172
173 for cmd; do
174     "cmd_$cmd"
175 done