Mercurial > hg
changeset 29027:db5084d27df5 stable
osx: create a modern package including manpages
Instead of using bdist_mpkg, we use the modern Apple-provided tools to
build an OS X Installer package directly. This has several advantages:
* Avoids bdist_mpkg which seems to be barely maintained and is hard to
use.
* Creates a single unified .pkg instead of a .mpkg.
* The package we produce is in the modern, single-file format instead of
a directory bundle that we have to zip up for download.
In addition, this way of building the package now correctly:
* Installs the manpages, bringing the `make osx`-generated package in
line with the official Mac packages we publish on the website.
* Installs files with the correct permissions instead of encoding the
UID of the user who happened to build the package.
Thanks to Augie for updating the test expectations.
author | Kevin Bullock <kbullock+mercurial@ringworld.org> |
---|---|
date | Wed, 27 Apr 2016 10:20:36 -0500 |
parents | 80f15aa32edd |
children | 67fd250b7c21 |
files | Makefile contrib/macosx/distribution.xml tests/test-mac-packages.t |
diffstat | 3 files changed, 62 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Wed Apr 27 11:45:55 2016 -0400 +++ b/Makefile Wed Apr 27 10:20:36 2016 -0500 @@ -156,18 +156,20 @@ # Packaging targets osx: - python -c 'import bdist_mpkg.script_bdist_mpkg' || \ - (echo "Missing bdist_mpkg (easy_install bdist_mpkg)"; false) - rm -rf dist/mercurial-*.mpkg - python -m bdist_mpkg.script_bdist_mpkg setup.py -- - python contrib/fixpax.py dist/mercurial-*.mpkg/Contents/Packages/*.pkg/Contents/Archive.pax.gz - OUTPUTDIR=$${OUTPUTDIR:=packages/osx} && \ - mkdir -p $$OUTPUTDIR && \ - N=`cd dist && echo mercurial-*.mpkg | sed 's,\.mpkg$$,,'` && \ - hdiutil create -srcfolder dist/$$N.mpkg/ -scrub -volname "$$N" \ - -ov $$OUTPUTDIR/$$N.dmg && \ - [ -n "$$KEEPMPKG" ] && mv dist/mercurial-*.mpkg $$OUTPUTDIR || \ - rm -rf dist/mercurial-*.mpkg + python setup.py install --optimize=1 \ + --root=build/mercurial/ --prefix=/usr/local/ \ + --install-lib=/Library/Python/2.7/site-packages/ + make -C doc all install DESTDIR="$(PWD)/build/mercurial/" + mkdir -p $${OUTPUTDIR:-dist} + pkgbuild --root build/mercurial/ --identifier org.mercurial-scm.mercurial \ + build/mercurial.pkg + HGVER=$$((cat build/mercurial/Library/Python/2.7/site-packages/mercurial/__version__.py; echo 'print(version)') | python) && \ + OSXVER=$$(sw_vers -productVersion | cut -d. -f1,2) && \ + productbuild --distribution contrib/macosx/distribution.xml \ + --package-path build/ \ + --version "$${HGVER}" \ + --resources contrib/macosx/ \ + "$${OUTPUTDIR:-dist/}"/Mercurial-"$${HGVER}"-macosx"$${OSXVER}".pkg deb: contrib/builddeb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/macosx/distribution.xml Wed Apr 27 10:20:36 2016 -0500 @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="no"?> +<installer-gui-script minSpecVersion="1"> + <title>Mercurial SCM</title> + <organization>org.mercurial-scm</organization> + <options customize="never" require-scripts="false" rootVolumeOnly="true" /> + <welcome file="Welcome.html" mime-type="text/html" /> + <license file="../../COPYING" mime-type="text/plain" /> + <readme file="Readme.html" mime-type="text/html" /> + <pkg-ref id="org.mercurial-scm.mercurial" + version="0" + auth="root" + onConclusion="none">mercurial.pkg</pkg-ref> + <choices-outline> + <line choice="org.mercurial-scm.mercurial"/> + </choices-outline> + <choice id="org.mercurial-scm.mercurial" visible="false"> + <pkg-ref id="org.mercurial-scm.mercurial"/> + </choice> +</installer-gui-script>
--- a/tests/test-mac-packages.t Wed Apr 27 11:45:55 2016 -0400 +++ b/tests/test-mac-packages.t Wed Apr 27 10:20:36 2016 -0500 @@ -1,42 +1,44 @@ -#require test-repo slow osx bdistmpkg +#require test-repo slow osx osxpackaging $ OUTPUTDIR=`pwd` $ export OUTPUTDIR $ KEEPMPKG=yes $ export KEEPMPKG $ cd "$TESTDIR"/.. + $ rm -rf dist $ make osx > $OUTPUTDIR/build.log 2>&1 $ cd $OUTPUTDIR - $ ls -d *.dmg *.mpkg - mercurial-*-macosx10.*.dmg (glob) - mercurial-*-macosx10.*.mpkg (glob) + $ ls -d *.pkg + Mercurial-*-macosx10.*.pkg (glob) + + $ xar -xf Mercurial*.pkg Gather list of all installed files: - $ find *.mpkg -name Archive.bom | xargs lsbom > boms.txt - -TODO: update to -f 1,2,3 when we're confident the installed owner of -our files is corect. Right now it looks like it's the id of the user -that builds the mpkg, which is probably slightly wrong. + $ lsbom mercurial.pkg/Bom > boms.txt Spot-check some randomly selected files: - $ grep bdiff boms.txt | cut -d ' ' -f 1,2 - ./mercurial/bdiff.so 100775 - ./mercurial/pure/bdiff.py 100664 - ./mercurial/pure/bdiff.pyc 100664 - ./mercurial/pure/bdiff.pyo 100664 -TODO: man pages don't get installed - $ egrep 'man[15]' boms.txt | cut -d ' ' -f 1,2 - $ grep bser boms.txt | cut -d ' ' -f 1,2 - ./hgext/fsmonitor/pywatchman/bser.so 100775 - ./hgext/fsmonitor/pywatchman/pybser.py 100664 - ./hgext/fsmonitor/pywatchman/pybser.pyc 100664 - ./hgext/fsmonitor/pywatchman/pybser.pyo 100664 - $ grep localrepo boms.txt | cut -d ' ' -f 1,2 - ./mercurial/localrepo.py 100664 - ./mercurial/localrepo.pyc 100664 - ./mercurial/localrepo.pyo 100664 - $ grep '/hg ' boms.txt | cut -d ' ' -f 1,2 - ./hg 100775 + $ grep bdiff boms.txt | cut -d ' ' -f 1,2,3 + ./Library/Python/2.7/site-packages/mercurial/bdiff.so 100755 0/0 + ./Library/Python/2.7/site-packages/mercurial/pure/bdiff.py 100644 0/0 + ./Library/Python/2.7/site-packages/mercurial/pure/bdiff.pyc 100644 0/0 + ./Library/Python/2.7/site-packages/mercurial/pure/bdiff.pyo 100644 0/0 + $ egrep 'man[15]' boms.txt | cut -d ' ' -f 1,2,3 + ./usr/local/share/man/man1 40755 0/0 + ./usr/local/share/man/man1/hg.1 100644 0/0 + ./usr/local/share/man/man5 40755 0/0 + ./usr/local/share/man/man5/hgignore.5 100644 0/0 + ./usr/local/share/man/man5/hgrc.5 100644 0/0 + $ grep bser boms.txt | cut -d ' ' -f 1,2,3 + ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/bser.so 100755 0/0 + ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.py 100644 0/0 + ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.pyc 100644 0/0 + ./Library/Python/2.7/site-packages/hgext/fsmonitor/pywatchman/pybser.pyo 100644 0/0 + $ grep localrepo boms.txt | cut -d ' ' -f 1,2,3 + ./Library/Python/2.7/site-packages/mercurial/localrepo.py 100644 0/0 + ./Library/Python/2.7/site-packages/mercurial/localrepo.pyc 100644 0/0 + ./Library/Python/2.7/site-packages/mercurial/localrepo.pyo 100644 0/0 + $ grep '/hg ' boms.txt | cut -d ' ' -f 1,2,3 + ./usr/local/bin/hg 100755 0/0 Note that we're not currently installing any /etc/mercurial stuff, including merge-tool configurations.