diff --git a/direct/src/plugin/p3dMultifileReader.cxx b/direct/src/plugin/p3dMultifileReader.cxx index 5b9eef39ea..e96ce50f00 100644 --- a/direct/src/plugin/p3dMultifileReader.cxx +++ b/direct/src/plugin/p3dMultifileReader.cxx @@ -208,6 +208,11 @@ read_index() { s._start = read_uint32(); s._length = read_uint32(); unsigned int flags = read_uint16(); + if ((flags & 0x18) != 0) { + // Skip over the uncompressed length. + read_uint32(); + } + s._timestamp = read_uint32(); size_t name_length = read_uint16(); char *buffer = new char[name_length]; diff --git a/direct/src/plugin/p3dSession.cxx b/direct/src/plugin/p3dSession.cxx index 9692686ade..79115310ad 100644 --- a/direct/src/plugin/p3dSession.cxx +++ b/direct/src/plugin/p3dSession.cxx @@ -702,7 +702,7 @@ start_p3dpython(P3DInstance *inst) { const char *keep[] = { "TMP", "TEMP", "HOME", "USER", #ifdef _WIN32 - "SYSTEMROOT", "USERPROFILE", + "SYSTEMROOT", "USERPROFILE", "COMSPEC", #endif NULL }; diff --git a/direct/src/showbase/VFSImporter.py b/direct/src/showbase/VFSImporter.py index 026212be26..f19f7e00ea 100644 --- a/direct/src/showbase/VFSImporter.py +++ b/direct/src/showbase/VFSImporter.py @@ -8,7 +8,7 @@ import imp import struct import __builtin__ -__all__ = ['register'] +__all__ = ['register', 'reload_from', 'reload_packages'] vfs = VirtualFileSystem.getGlobalPtr() @@ -274,3 +274,43 @@ def register(): _registered = True sys.path_hooks.insert(0, VFSImporter) +def reload_from(root_path, moduleName): + """ Reloads the named module from the indicated root directory, + merging it with the module already loaded, if any. This is + particularly useful for merging a VFS-mounted package with a + previously-frozen package. It allows you to release the initial + version of a package via the freeze mechanism, while still + allowing new additions to be added later via multifile. + + See also reload_packages(), which is a convenience function + wrapped around this one. """ + + path = root_path + '/' + '/'.join(moduleName.split('.')[:-1]) + importer = VFSImporter(path) + loader = importer.find_module(moduleName) + if loader: + loader.load_module(moduleName) + +def reload_packages(multifile, root_path): + """ Walks the multifile and looks for Python packages that already + exist as frozen modules. For any such packages found, calls + reload_from() to merge them with the preloaded frozen package. """ + + for i in range(multifile.getNumSubfiles()): + filename = multifile.getSubfileName(i) + isInit = False + for ext in ['py'] + compiledExtensions: + if filename.endswith('/__init__.' + ext): + isInit = True + break + if not isInit: + continue + + # Found a package. + moduleName = '.'.join(filename.split('/')[:-1]) + module = sys.modules.get(moduleName, None) + if module: + file = getattr(module, '__file__', None) + if file == '': + # It's a frozen module; replace it. + reload_from(root_path, moduleName) diff --git a/direct/src/showutil/FreezeTool.py b/direct/src/showutil/FreezeTool.py index 315cc2a3e1..dd7fb9d6ca 100644 --- a/direct/src/showutil/FreezeTool.py +++ b/direct/src/showutil/FreezeTool.py @@ -720,7 +720,7 @@ class Freezer: for mdef in autoIncludes: try: self.__loadModule(mdef) - # Since it succesfully loaded, it's no longer a guess. + # Since it successfully loaded, it's no longer a guess. mdef.guess = False except: # Something went wrong, guess it's not an importable diff --git a/direct/src/showutil/packp3d.py b/direct/src/showutil/packp3d.py index b12aa3fbaf..faaa2ecce9 100755 --- a/direct/src/showutil/packp3d.py +++ b/direct/src/showutil/packp3d.py @@ -132,7 +132,13 @@ def main(appRunner): """ This function is called when this module is invoked as packp3d.p3d. """ - makePackedApp(appRunner.argv[1:]) + print "args = %s" % (appRunner.argv,) + try: + makePackedApp(appRunner.argv[1:]) + except ArgumentError, e: + print e.args[0] + sys.exit(1) + sys.exit(0) if __name__ == '__main__': try: diff --git a/direct/src/showutil/runp3d.py b/direct/src/showutil/runp3d.py index 83b5b42518..ecfa88c1a3 100755 --- a/direct/src/showutil/runp3d.py +++ b/direct/src/showutil/runp3d.py @@ -300,6 +300,7 @@ class AppRunner(DirectObject): # Mount the Multifile under /mf, by convention. vfs.mount(mf, MultifileRoot, vfs.MFReadOnly) + VFSImporter.reload_packages(mf, MultifileRoot) # Load any prc files in the root. We have to load them # explicitly, since the ConfigPageManager can't directly look