]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
further fixes to windows build (pkg_resources / web templates)
authorrobk-tahoe <robk-tahoe@allmydata.com>
Thu, 24 Jan 2008 01:52:43 +0000 (18:52 -0700)
committerrobk-tahoe <robk-tahoe@allmydata.com>
Thu, 24 Jan 2008 01:52:43 +0000 (18:52 -0700)
now that web templates are found via pkg_resources, then the windows build
should in fact _use_ pkg_resources, rather than exclude it from the build
to prevent nevow exploding upon import due to the zip provider exception,
so that the pkgreshook can do install location based lookups

windows/pkgreshook.py [new file with mode: 0644]
windows/setup.py
windows/tahoe.py
windows/tahoesvc.py

diff --git a/windows/pkgreshook.py b/windows/pkgreshook.py
new file mode 100644 (file)
index 0000000..bb1d985
--- /dev/null
@@ -0,0 +1,46 @@
+
+def install():
+    """
+    This installs a hook into setuptools' pkg_resources infrastructure, so that resource
+    files can be found in files relative to the runnin executable, in addition to the
+    usual egg and source lookup mechanisms.  This overrides the ZipProvider, since that
+    is the lookup mechanism triggered within pkg_resources when running code out of a
+    py2exe or py2app build's library.zip.
+    """
+    import os, sys
+    import pkg_resources, zipimport
+
+    platform_libdirs = {
+        'darwin': '../Resources/pkg_resources',
+        }
+    exedir = os.path.dirname(sys.executable)
+    libdir = platform_libdirs.get(sys.platform, 'pkg_resources')
+
+    class Provider(pkg_resources.ZipProvider):
+
+        def __init__(self, module):
+            self._module_name = module.__name__
+            pkg_resources.ZipProvider.__init__(self, module)
+
+        def get_resource_filename(self, manager, resource_name):
+            #print 'get_resource_filename(%s, %s)' % (manager, resource_name)
+            path = [exedir, libdir] + self._module_name.split('.') + [resource_name]
+            localfile = os.path.join(*path)
+            #print '             checking(%s)' % (localfile,)
+            if os.path.exists(localfile):
+                #print 'found locally'
+                return localfile
+            else:
+                try:
+                    ret = pkg_resources.ZipProvider.get_resource_filename(self, manager, resource_name)
+                    #print 'returning %s' % (ret,)
+                    return ret
+                except NotImplementedError:
+                    #print 'get_resource_filename(%s,%s): not found' % (self._module_name, resource_name)
+                    #import traceback
+                    #traceback.print_exc()
+                    return ''
+
+    pkg_resources.register_loader_type(zipimport.zipimporter, Provider)
+
+
index 9ebf9166635a0ababf0e40fdb22814299c3af69a..62e5e71e89757903de45fefdc3d8f5388b8e6b46 100644 (file)
@@ -65,7 +65,6 @@ setup_args = {
     'options': {
         "py2exe": {
             "excludes": [
-                "pkg_resources",
             ],
             "includes": [
             ],
index f7ceecdadbd68d3f8946559d87bba5a012a4331f..50dd05c78fe91790d20e2a8dfa14695a52bbefaf 100644 (file)
@@ -1,3 +1,5 @@
+import pkgreshook # override the pkg_resources zip provider for py2exe deployment
+pkgreshook.install() # this is done before nevow is imported by depends
 import depends # import dependencies so that py2exe finds them
 _junk = depends # appease pyflakes
 
index d338b95db50a0db888b7d3dc13bd40a73560e295..f5db9d236a1df0a7683a403c79fac388b437697d 100644 (file)
@@ -22,6 +22,9 @@ logmsg('service loaded')
 #
 # Now with some bootstrap util functions in place, let's try and init things:
 try:
+    import pkgreshook # override the pkg_resources zip provider for py2exe deployment
+    pkgreshook.install() # this is done before nevow is imported
+
     logmsg('loading base dir')
     from allmydata.windows import registry
     basedir = registry.get_base_dir_path()