osx: create a modern package including manpages stable
authorKevin Bullock <kbullock+mercurial@ringworld.org>
Wed, 27 Apr 2016 10:20:36 -0500
branchstable
changeset 31380 db5084d27df5fb19eec75b4b2b57fc3cf499f695
parent 31379 80f15aa32eddc3917172e9afe418f85c6699a2b8
child 31381 67fd250b7c21b859c85d89603fb292de3aaeef26
push id225
push usergszorc@mozilla.com
push dateThu, 05 May 2016 16:13:29 +0000
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.
Makefile
contrib/macosx/distribution.xml
tests/test-mac-packages.t
--- a/Makefile
+++ b/Makefile
@@ -151,28 +151,30 @@ i18n/hg.pot: $(PYFILES) $(DOCFILES) i18n
         # work on a temporary copy for never having a half completed target
 	cp $@ $@.tmp
 	msgmerge --no-location --update $@.tmp $^
 	mv -f $@.tmp $@
 
 # 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
 
 ppa:
 	contrib/builddeb --source-only
 
 docker-debian-jessie:
new file mode 100644
--- /dev/null
+++ b/contrib/macosx/distribution.xml
@@ -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
+++ b/tests/test-mac-packages.t
@@ -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.