@@ -7,6 +7,7 @@
. $(dirname $0)/packagelib.sh
BUILD=1
+CLEANUP=1
DEBVERSION=jessie
while [ "$1" ]; do
case "$1" in
@@ -15,10 +16,14 @@ while [ "$1" ]; do
DEBVERSION="$1"
shift
;;
- --prepare )
+ --cleanup )
shift
BUILD=
;;
+ --build )
+ shift
+ CLEANUP=
+ ;;
--debbuilddir )
shift
DEBBUILDDIR="$1"
@@ -31,13 +36,10 @@ while [ "$1" ]; do
esac
done
-DEBBUILDDIR=${OUTPUTDIR:="$PWD/debbuild"}
+trap "if [ '$CLEANUP' ] ; then rm -r '$PWD/debian' ; fi" EXIT
set -u
-rm -rf $DEBBUILDDIR
-mkdir -p $DEBBUILDDIR
-
if [ ! -d .hg ]; then
echo 'You are not inside a Mercurial repository!' 1>&2
exit 1
@@ -45,26 +47,38 @@ fi
gethgversion
-cp -r $PWD/contrib/debian $DEBBUILDDIR/DEBIAN
-chmod -R 0755 $DEBBUILDDIR/DEBIAN
-
-control=$DEBBUILDDIR/DEBIAN/control
-
-# This looks like sed -i, but sed -i behaves just differently enough
-# between BSD and GNU sed that I gave up and did the dumb thing.
-sed "s/__VERSION__/$version/" < $control > $control.tmp
-mv $control.tmp $control
+control=debian/control
+changelog=debian/changelog
if [ "$BUILD" ]; then
- make PREFIX=$DEBBUILDDIR/usr install
- dpkg-deb --build $DEBBUILDDIR
- mv $DEBBUILDDIR.deb $DEBBUILDDIR/mercurial-$version-$release.deb
- if [ $? = 0 ]; then
- echo
- echo "Built packages for $version-$release:"
- find $DEBBUILDDIR/ -type f -newer $control
+ if [ -d debian ] ; then
+ echo "Error! debian control directory already exists!"
+ exit 1
fi
-else
- echo "Prepared sources for $version-$release $control are in $DEBBUILDDIR - use like:"
- echo "dpkg-deb --build $DEBBUILDDIR"
+
+ cp -r $PWD/contrib/debian debian
+ chmod -R 0755 debian
+
+ # This looks like sed -i, but sed -i behaves just differently enough
+ # between BSD and GNU sed that I gave up and did the dumb thing.
+ sed "s/__VERSION__/$version/" < $changelog > $changelog.tmp
+ date=$(date --rfc-2822)
+ sed "s/__DATE__/$date/" < $changelog.tmp > $changelog
+ rm $changelog.tmp
+
+ debuild -us -uc -b
+ if [ $? != 0 ]; then
+ echo 'debuild failed!'
+ exit 1
+ fi
+
fi
+if [ "$CLEANUP" ] ; then
+ echo
+ OUTPUTDIR=${OUTPUTDIR:=packages/debian-$DEBVERSION}
+ find ../mercurial*.deb ../mercurial_*.build ../mercurial_*.changes \
+ -type f -newer $control -print0 | \
+ xargs -Inarf -0 mv narf "$OUTPUTDIR"
+ echo "Built packages for $version-$release:"
+ find "$OUTPUTDIR" -type f -newer $control -name '*.deb'
+fi
new file mode 100644
@@ -0,0 +1,5 @@
+mercurial (__VERSION__) unstable; urgency=medium
+
+ * Automated build performed by upstream.
+
+ -- Mercurial Devel <mercurial-devel@selenic.com> __DATE__
new file mode 100644
@@ -0,0 +1,1 @@
+9
@@ -1,9 +1,47 @@
-Package: mercurial
-Version: __VERSION__
+Source: mercurial
Section: vcs
Priority: optional
+Maintainer: Mercurial Developers <mercurial-devel@selenic.com>
+Build-Depends:
+ debhelper (>= 7),
+ dh-python,
+ python-all
+Standards-Version: 3.9.4
+X-Python-Version: >= 2.6
+
+Package: mercurial
+Depends:
+ python,
+ ${shlibs:Depends},
+ ${misc:Depends},
+ ${python:Depends},
+ mercurial-common (= ${source:Version})
+Architecture: any
+Description: fast, easy to use, distributed revision control tool.
+ Mercurial is a fast, lightweight Source Control Management system designed
+ for efficient handling of very large distributed projects.
+ .
+ Its features include:
+ * O(1) delta-compressed file storage and retrieval scheme
+ * Complete cross-indexing of files and changesets for efficient exploration
+ of project history
+ * Robust SHA1-based integrity checking and append-only storage model
+ * Decentralized development model with arbitrary merging between trees
+ * Easy-to-use command-line interface
+ * Integrated stand-alone web interface
+ * Small Python codebase
+
+Package: mercurial-common
Architecture: all
-Depends: python
-Conflicts: mercurial-common
-Maintainer: Mercurial Developers <mercurial-devel@selenic.com>
-Description: Mercurial (probably nightly) package built by upstream.
+Depends:
+ ${misc:Depends},
+ ${python:Depends},
+Recommends: mercurial (= ${source:Version}), ca-certificates
+Breaks: mercurial (<< ${source:Version})
+Replaces: mercurial (<< 2.6.3)
+Description: easy-to-use, scalable distributed version control system (common files)
+ Mercurial is a fast, lightweight Source Control Management system designed
+ for efficient handling of very large distributed projects.
+ .
+ This package contains the architecture independent components of Mercurial,
+ and is generally useless without the mercurial package.
new file mode 100644
@@ -0,0 +1,27 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: mercurial
+Source: http://www.selenic.com/mercurial/
+
+Files: *
+Copyright: 2005-2015, Matt Mackall <mpm@selenic.com> and others.
+License: GPL-2+
+ This program is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later
+ version.
+ .
+ This program is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU General Public License for more
+ details.
+ .
+ You should have received a copy of the GNU General Public
+ License along with this package; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ Boston, MA 02110-1301 USA
+ .
+ On Debian systems, the full text of the GNU General Public
+ License version 2 can be found in the file
+ `/usr/share/common-licenses/GPL-2'.
new file mode 100644
@@ -0,0 +1,29 @@
+#!/usr/bin/make -f
+# Uncomment this to turn on verbose mode.
+# export DH_VERBOSE=1
+
+CPUS=$(shell cat /proc/cpuinfo | grep -E ^processor | wc -l)
+
+%:
+ dh $@ --with python2
+
+override_dh_auto_test:
+ http_proxy='' dh_auto_test -- TESTFLAGS="-j$(CPUS)"
+
+override_dh_python2:
+ dh_python2
+ find debian/mercurial/usr/share -type d -empty -delete
+
+override_dh_install:
+ python$(PYVERS) setup.py install --root $(CURDIR)/debian/mercurial --install-layout=deb
+ # remove arch-independent python stuff
+ find $(CURDIR)/debian/mercurial/usr/lib \
+ ! -name '*.so' ! -type d -delete , \
+ -type d -empty -delete
+ python$(PYVERS) setup.py install --root $(CURDIR)/debian/mercurial-common --install-layout=deb
+ make install-doc PREFIX=$(CURDIR)/debian/mercurial-common/usr
+ # remove arch-dependent python stuff
+ find $(CURDIR)/debian/mercurial-common/usr/lib \
+ -name '*.so' ! -type d -delete , \
+ -type d -empty -delete
+ rm $(CURDIR)/debian/mercurial-common/usr/bin/hg
@@ -12,29 +12,23 @@ DEBPLATFORM="$1"
PLATFORM="debian-$1"
shift # extra params are passed to build process
+OUTPUTDIR=${OUTPUTDIR:=$ROOTDIR/packages/$PLATFORM}
+
initcontainer $PLATFORM
-DEBBUILDDIR=${OUTPUTDIR:=$ROOTDIR/packages/$PLATFORM}
-OUTPUTDIR=$DEBBUILDDIR/staged contrib/builddeb --release $DEBPLATFORM --prepare
+# debuild only appears to be able to save built debs etc to .., so we
+# have to share the .. of the current directory with the docker
+# container and hope it's writable. Whee.
+dn=$(basename $PWD)
-DSHARED=/mnt/shared/
if [ $(uname) = "Darwin" ] ; then
- $DOCKER run -u $DBUILDUSER --rm -v $DEBBUILDDIR:$DSHARED -v $PWD:/mnt/hg $CONTAINER \
- sh -c "cd /mnt/hg && make clean && make local"
+ $DOCKER run -u $DBUILDUSER --rm -v $PWD/..:/mnt $CONTAINER \
+ sh -c "cd /mnt/$dn && make clean && make local"
fi
-$DOCKER run -u $DBUILDUSER --rm -v $DEBBUILDDIR:$DSHARED -v $PWD:/mnt/hg $CONTAINER \
- sh -c "cd /mnt/hg && make PREFIX=$DSHARED/staged/usr install"
-$DOCKER run -u $DBUILDUSER --rm -v $DEBBUILDDIR:$DSHARED $CONTAINER \
- dpkg-deb --build $DSHARED/staged
+$DOCKER run -u $DBUILDUSER --rm -v $PWD/..:/mnt $CONTAINER \
+ sh -c "cd /mnt/$dn && DEB_BUILD_OPTIONS='$DEB_BUILD_OPTIONS' contrib/builddeb --build --release $DEBPLATFORM"
+contrib/builddeb --cleanup --release $DEBPLATFORM
if [ $(uname) = "Darwin" ] ; then
- $DOCKER run -u $DBUILDUSER --rm -v $DEBBUILDDIR:$DSHARED -v $PWD:/mnt/hg $CONTAINER \
- sh -c "cd /mnt/hg && make clean"
+ $DOCKER run -u $DBUILDUSER --rm -v $PWD/..:/mnt $CONTAINER \
+ sh -c "cd /mnt/$dn && make clean"
fi
-
-gethgversion
-
-rm -r $DEBBUILDDIR/staged
-mv $DEBBUILDDIR/staged.deb $DEBBUILDDIR/mercurial-$version-$release.deb
-
-echo
-echo "Build complete - results can be found in $DEBBUILDDIR"
@@ -1,12 +1,21 @@
#require test-repo slow
+Ensure debuild doesn't run the testsuite, as that could get silly.
+ $ export DEB_BUILD_OPTIONS=nocheck
+
We check debian package contents with portable tools so that when
we're on non-debian machines we can still test the packages that are
built using docker.
$ checkdeb() {
> ls *.deb
- > ar x mercurial*.deb
- > tar tf data.tar* | grep localrepo | sort
+ > echo main deb should have .so but no .py
+ > ar x mercurial_*.deb
+ > tar tf data.tar* | grep parsers
+ > tar tf data.tar* | grep localrepo
+ > echo common deb should have .py but no .so
+ > ar x mercurial-common_*.deb
+ > tar tf data.tar* | grep parsers
+ > tar tf data.tar* | grep localrepo
> }
$ OUTPUTDIR=`pwd`
$ export OUTPUTDIR
@@ -16,9 +25,12 @@ built using docker.
$ make docker-debian-jessie > $OUTPUTDIR/build.log 2>&1
$ cd $OUTPUTDIR
$ checkdeb
- mercurial-*.deb (glob)
- ./usr/lib/python2.7/site-packages/mercurial/localrepo.py
- ./usr/lib/python2.7/site-packages/mercurial/localrepo.pyc
+ mercurial-common_*.deb (glob)
+ mercurial_*.deb (glob)
+ main deb should have .so but no .py
+ ./usr/lib/python2.7/dist-packages/mercurial/parsers*.so (glob)
+ common deb should have .py but no .so
+ ./usr/lib/python2.7/dist-packages/mercurial/localrepo.py
$ rm -f *.deb build.log
#endif
@@ -27,8 +39,11 @@ built using docker.
$ make debian-jessie > $OUTPUTDIR/build.log 2>&1
$ cd $OUTPUTDIR
$ checkdeb
- mercurial-*.deb (glob)
- ./usr/lib/python2.7/site-packages/mercurial/localrepo.py
- ./usr/lib/python2.7/site-packages/mercurial/localrepo.pyc
+ mercurial-common_*.deb (glob)
+ mercurial_*.deb (glob)
+ main deb should have .so but no .py
+ ./usr/lib/python2.7/dist-packages/mercurial/parsers*.so (glob)
+ common deb should have .py but no .so
+ ./usr/lib/python2.7/dist-packages/mercurial/localrepo.py
$ rm -f *.deb build.log
#endif