##// END OF EJS Templates
hgweb: break templater -> templater circular reference...
hgweb: break templater -> templater circular reference The problem were some functions passed in the "defaults" argument during the templater creation which use "self.t" directly. This creates the cycle: hgweb object -> templater object -> defaults dict -> footer function -> hgweb object Instead of completely avoding the cycle, we break it after using the templater.

File last commit:

r3673:eb0b4a2d default
r4243:3f2e3349 default
Show More
packagescan.py
131 lines | 4.5 KiB | text/x-python | PythonLexer
Thomas Arendsen Hein
Cleanup of tabs and trailing spaces.
r1308 # packagescan.py - Helper module for identifing used modules.
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 # Used for the py2exe distutil.
Volker Kleinfeld
setup.py: install packagescan before any mercurial modules is imported...
r2323 # This module must be the first mercurial module imported in setup.py
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 #
Vadim Gelfer
update copyrights.
r2859 # Copyright 2005, 2006 Volker Kleinfeld <Volker.Kleinfeld@gmx.de>
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 #
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
import glob
import os
import sys
import ihooks
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 import types
import string
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
Volker Kleinfeld
setup.py: install packagescan before any mercurial modules is imported...
r2323 # Install this module as fake demandload module
sys.modules['mercurial.demandload'] = sys.modules[__name__]
# Requiredmodules contains the modules imported by demandload.
Vadim Gelfer
clean up trailing white space.
r2600 # Please note that demandload can be invoked before the
Volker Kleinfeld
setup.py: install packagescan before any mercurial modules is imported...
r2323 # mercurial.packagescan.scan method is invoked in case a mercurial
# module is imported.
Vadim Gelfer
clean up trailing white space.
r2600 requiredmodules = {}
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 def demandload(scope, modules):
Vadim Gelfer
clean up trailing white space.
r2600 """ fake demandload function that collects the required modules
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 foo import foo
foo bar import foo, bar
foo.bar import foo.bar
Shun-ichi GOTO
Support foo@bar notation as demandload module spec.
r2993 foo@bar import foo as bar
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 foo:bar from foo import bar
foo:bar,quux from foo import bar, quux
foo.bar:quux from foo.bar import quux"""
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 for m in modules.split():
mod = None
Eung-ju Park
Fix py2exe packagescan problem with new demandload
r1841 try:
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 module, fromlist = m.split(':')
fromlist = fromlist.split(',')
Eung-ju Park
Fix py2exe packagescan problem with new demandload
r1841 except:
module = m
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 fromlist = []
Vadim Gelfer
merge.
r2996 as_ = None
Shun-ichi GOTO
Support foo@bar notation as demandload module spec.
r2993 if '@' in module:
module, as_ = module.split('@')
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 mod = __import__(module, scope, scope, fromlist)
if fromlist == []:
# mod is only the top package, but we need all packages
comp = module.split('.')
i = 1
mn = comp[0]
while True:
# mn and mod.__name__ might not be the same
Vadim Gelfer
merge.
r2996 if not as_:
as_ = mn
scope[as_] = mod
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 requiredmodules[mod.__name__] = 1
if len(comp) == i: break
Thomas Arendsen Hein
white space and line break cleanups
r3673 mod = getattr(mod, comp[i])
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 mn = string.join(comp[:i+1],'.')
i += 1
else:
# mod is the last package in the component list
requiredmodules[mod.__name__] = 1
for f in fromlist:
Thomas Arendsen Hein
white space and line break cleanups
r3673 scope[f] = getattr(mod, f)
Volker Kleinfeld
packagescan: handle demandload module naming changes.
r2322 if type(scope[f]) == types.ModuleType:
requiredmodules[scope[f].__name__] = 1
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
Vadim Gelfer
do not try to package lsprof if not available.
r2497 class SkipPackage(Exception):
def __init__(self, reason):
self.reason = reason
scan_in_progress = False
Thomas Arendsen Hein
white space and line break cleanups
r3673 def scan(libpath, packagename):
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 """ helper for finding all required modules of package <packagename> """
Vadim Gelfer
do not try to package lsprof if not available.
r2497 global scan_in_progress
scan_in_progress = True
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 # Use the package in the build directory
libpath = os.path.abspath(libpath)
Thomas Arendsen Hein
white space and line break cleanups
r3673 sys.path.insert(0, libpath)
packdir = os.path.join(libpath, packagename.replace('.', '/'))
Thomas Arendsen Hein
Cleanup of tabs and trailing spaces.
r1308 # A normal import would not find the package in
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 # the build directory. ihook is used to force the import.
Thomas Arendsen Hein
Cleanup of tabs and trailing spaces.
r1308 # After the package is imported the import scope for
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 # the following imports is settled.
p = importfrom(packdir)
globals()[packagename] = p
sys.modules[packagename] = p
# Fetch the python modules in the package
cwd = os.getcwd()
os.chdir(packdir)
pymodulefiles = glob.glob('*.py')
extmodulefiles = glob.glob('*.pyd')
os.chdir(cwd)
# Import all python modules and by that run the fake demandload
for m in pymodulefiles:
if m == '__init__.py': continue
tmp = {}
Thomas Arendsen Hein
white space and line break cleanups
r3673 mname, ext = os.path.splitext(m)
Thomas Arendsen Hein
Cleanup of tabs and trailing spaces.
r1308 fullname = packagename+'.'+mname
Vadim Gelfer
do not try to package lsprof if not available.
r2497 try:
Thomas Arendsen Hein
white space and line break cleanups
r3673 __import__(fullname, tmp, tmp)
Vadim Gelfer
do not try to package lsprof if not available.
r2497 except SkipPackage, inst:
print >> sys.stderr, 'skipping %s: %s' % (fullname, inst.reason)
continue
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 requiredmodules[fullname] = 1
# Import all extension modules and by that run the fake demandload
for m in extmodulefiles:
tmp = {}
Thomas Arendsen Hein
white space and line break cleanups
r3673 mname, ext = os.path.splitext(m)
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 fullname = packagename+'.'+mname
Thomas Arendsen Hein
white space and line break cleanups
r3673 __import__(fullname, tmp, tmp)
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 requiredmodules[fullname] = 1
Volker Kleinfeld
setup.py: install packagescan before any mercurial modules is imported...
r2323
def getmodules():
return requiredmodules.keys()
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
def importfrom(filename):
"""
import module/package from a named file and returns the module.
It does not check on sys.modules or includes the module in the scope.
"""
loader = ihooks.BasicModuleLoader()
path, file = os.path.split(filename)
name, ext = os.path.splitext(file)
m = loader.find_module_in_dir(name, path)
if not m:
raise ImportError, name
m = loader.load_module(name, m)
return m