# HG changeset patch # User Vadim Gelfer # Date 1148054246 25200 # Node ID c4ea7f927dab9d29c47beb019d1c6e542f249d45 # Parent 7cbe8cd69d6b0a381510875d57c37f05dc91babf# Parent 685597676a13770a824228a113012caf1ae16e9b merge with crew. diff --git a/mercurial/packagescan.py b/mercurial/packagescan.py --- a/mercurial/packagescan.py +++ b/mercurial/packagescan.py @@ -10,6 +10,8 @@ import glob import os import sys import ihooks +import types +import string # Install this module as fake demandload module sys.modules['mercurial.demandload'] = sys.modules[__name__] @@ -20,18 +22,43 @@ sys.modules['mercurial.demandload'] = sy # module is imported. requiredmodules = {} def demandload(scope, modules): - """ fake demandload function that collects the required modules """ + """ fake demandload function that collects the required modules + foo import foo + foo bar import foo, bar + foo.bar import foo.bar + foo:bar from foo import bar + foo:bar,quux from foo import bar, quux + foo.bar:quux from foo.bar import quux""" + for m in modules.split(): mod = None try: - module, submodules = m.split(':') - submodules = submodules.split(',') + module, fromlist = m.split(':') + fromlist = fromlist.split(',') except: module = m - submodules = [] - mod = __import__(module, scope, scope, submodules) - scope[module] = mod - requiredmodules[mod.__name__] = 1 + fromlist = [] + 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 + scope[mn] = mod + requiredmodules[mod.__name__] = 1 + if len(comp) == i: break + mod = getattr(mod,comp[i]) + 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: + scope[f] = getattr(mod,f) + if type(scope[f]) == types.ModuleType: + requiredmodules[scope[f].__name__] = 1 def scan(libpath,packagename): """ helper for finding all required modules of package """