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