|
|
@ -196,12 +196,12 @@ class PluginLoader:
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
suffixes = ['.py', '']
|
|
|
|
suffixes = ['.py', '']
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
potential_names = frozenset('%s%s' % (name, s) for s in suffixes)
|
|
|
|
return self._plugin_path_cache[name]
|
|
|
|
for full_name in potential_names:
|
|
|
|
except KeyError:
|
|
|
|
if full_name in self._plugin_path_cache:
|
|
|
|
# Cache miss. Now let's find the the plugin
|
|
|
|
return self._plugin_path_cache[full_name]
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
found = None
|
|
|
|
for path in [p for p in self._get_paths() if p not in self._searched_paths]:
|
|
|
|
for path in [p for p in self._get_paths() if p not in self._searched_paths]:
|
|
|
|
if os.path.isdir(path):
|
|
|
|
if os.path.isdir(path):
|
|
|
|
try:
|
|
|
|
try:
|
|
|
@ -212,38 +212,30 @@ class PluginLoader:
|
|
|
|
for suffix in suffixes:
|
|
|
|
for suffix in suffixes:
|
|
|
|
if full_path.endswith(suffix):
|
|
|
|
if full_path.endswith(suffix):
|
|
|
|
full_name = os.path.basename(full_path)
|
|
|
|
full_name = os.path.basename(full_path)
|
|
|
|
if suffix:
|
|
|
|
|
|
|
|
base_name = full_name[:-len(suffix)]
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
base_name = full_name
|
|
|
|
|
|
|
|
break
|
|
|
|
break
|
|
|
|
else: # Yes, this is a for-else: http://bit.ly/1ElPkyg
|
|
|
|
else: # Yes, this is a for-else: http://bit.ly/1ElPkyg
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# Module found, now see if it's already in the cache
|
|
|
|
if full_name not in self._plugin_path_cache:
|
|
|
|
if base_name not in self._plugin_path_cache:
|
|
|
|
self._plugin_path_cache[full_name] = full_path
|
|
|
|
self._plugin_path_cache[base_name] = full_path
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self._searched_paths.add(path)
|
|
|
|
self._searched_paths.add(path)
|
|
|
|
try:
|
|
|
|
for full_name in potential_names:
|
|
|
|
return self._plugin_path_cache[name]
|
|
|
|
if full_name in self._plugin_path_cache:
|
|
|
|
except KeyError:
|
|
|
|
return self._plugin_path_cache[full_name]
|
|
|
|
# Didn't find the plugin in this directory. Load modules from
|
|
|
|
|
|
|
|
# the next one
|
|
|
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# if nothing is found, try finding alias/deprecated
|
|
|
|
# if nothing is found, try finding alias/deprecated
|
|
|
|
if not name.startswith('_'):
|
|
|
|
if not name.startswith('_'):
|
|
|
|
alias_name = '_' + name
|
|
|
|
for alias_name in ('_%s' % n for n in potential_names):
|
|
|
|
# We've already cached all the paths at this point
|
|
|
|
# We've already cached all the paths at this point
|
|
|
|
if alias_name in self._plugin_path_cache:
|
|
|
|
if alias_name in self._plugin_path_cache:
|
|
|
|
if not os.path.islink(self._plugin_path_cache[alias_name]):
|
|
|
|
if not os.path.islink(self._plugin_path_cache[alias_name]):
|
|
|
|
display.deprecated('%s is kept for backwards compatibility '
|
|
|
|
display.deprecated('%s is kept for backwards compatibility '
|
|
|
|
'but usage is discouraged. The module '
|
|
|
|
'but usage is discouraged. The module '
|
|
|
|
'documentation details page may explain '
|
|
|
|
'documentation details page may explain '
|
|
|
|
'more about this rationale.' %
|
|
|
|
'more about this rationale.' %
|
|
|
|
name.lstrip('_'))
|
|
|
|
name.lstrip('_'))
|
|
|
|
return self._plugin_path_cache[alias_name]
|
|
|
|
return self._plugin_path_cache[alias_name]
|
|
|
|
|
|
|
|
|
|
|
|
return None
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|