~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugin.py

BZR_PLUGINS_AT should import packages properly to handle relative imports

Show diffs side-by-side

added added

removed removed

Lines of Context:
587
587
        # We are called only for specific paths
588
588
        plugin_path = self.specific_paths[fullname]
589
589
        loading_path = None
590
 
        package = False
591
590
        if os.path.isdir(plugin_path):
592
591
            for suffix, mode, kind in imp.get_suffixes():
593
592
                if kind not in (imp.PY_SOURCE, imp.PY_COMPILED):
595
594
                    continue
596
595
                init_path = osutils.pathjoin(plugin_path, '__init__' + suffix)
597
596
                if os.path.isfile(init_path):
598
 
                    loading_path = init_path
599
 
                    package = True
 
597
                    # We've got a module here and load_module needs specific
 
598
                    # parameters.
 
599
                    loading_path = plugin_path
 
600
                    suffix = ''
 
601
                    mode = ''
 
602
                    kind = imp.PKG_DIRECTORY
600
603
                    break
601
604
        else:
602
605
            for suffix, mode, kind in imp.get_suffixes():
606
609
        if loading_path is None:
607
610
            raise ImportError('%s cannot be loaded from %s'
608
611
                              % (fullname, plugin_path))
609
 
        f = open(loading_path, mode)
 
612
        if kind is imp.PKG_DIRECTORY:
 
613
            f = None
 
614
        else:
 
615
            f = open(loading_path, mode)
610
616
        try:
611
617
            mod = imp.load_module(fullname, f, loading_path,
612
618
                                  (suffix, mode, kind))
613
 
            if package:
614
 
                # The plugin can contain modules, so be ready
615
 
                mod.__path__ = [plugin_path]
616
619
            mod.__package__ = fullname
617
620
            return mod
618
621
        finally:
619
 
            f.close()
 
622
            if f is not None:
 
623
                f.close()
620
624
 
621
625
 
622
626
# Install a dedicated importer for plugins requiring special handling