util: adjust 'datapath' to be correct in a frozen OS X package
authorMatt Harbison <matt_harbison@yahoo.com>
Sun, 10 Jan 2016 17:49:01 -0500
changeset 27764 dd0c5f4d1b53
parent 27763 0ac5b7ee5dc2
child 27765 f1fb93eebb1d
util: adjust 'datapath' to be correct in a frozen OS X package Apparently unlike py2exe, py2app copies the Mercurial source tree as-is to a Contents/Resources subdirectory of an app bundle, and places its binary stub in Contents/MacOS. (The Windows install has the 'hgext' and 'mercurial' modules in 'lib/library.zip', while the help and templates subdirectories have been moved out of the mercurial directory to the root of the installation. I assume that the python code living in a zip file is why "py2exe doesn't support __file__".) Therefore, prior to this change, Mercurial in a frozen app bundle on OS X would go looking for help *.txt, templates and locale info in Contents/MacOS, where they don't exist. There are only a handful of places that test for frozen, and not all of them are wrong for OS X, so it seems wiser to handle them on a case by case basis, rather that try to change mainfrozen(). The remaining cases are: 1) util.hgexecutable() wrongly points to the bundled python executable, and affects $HG in util.system() launched processes (e.g. external hooks) 2) util.hgcmd() wrongly points to the bundled python executable, but it seems to only affect 'hg serve -d' 3) hook._pythonhook() may be OK, since I didn't see anything outrageous when printing sys.path from an internal hook. I'm not sure if this special case is needed on OS X though. 4) sslutil._plainapplepython() is OK, because sys.executable is not /usr/bin/python, nor is it in /System/Library/Frameworks
mercurial/util.py
--- a/mercurial/util.py	Sun Jan 10 08:03:58 2016 +0000
+++ b/mercurial/util.py	Sun Jan 10 17:49:01 2016 -0500
@@ -886,7 +886,7 @@
             imp.is_frozen("__main__")) # tools/freeze
 
 # the location of data files matching the source code
-if mainfrozen():
+if mainfrozen() and getattr(sys, 'frozen', None) != 'macosx_app':
     # executable version (py2exe) doesn't support __file__
     datapath = os.path.dirname(sys.executable)
 else: