diff --git a/src/calibre/customize/ui.py b/src/calibre/customize/ui.py index c58f36524e..e1b68feace 100644 --- a/src/calibre/customize/ui.py +++ b/src/calibre/customize/ui.py @@ -22,6 +22,11 @@ from calibre.utils.config import make_config_dir, Config, ConfigProxy, \ from calibre.ebooks.epub.fix import ePubFixer from calibre.ebooks.metadata.sources.base import Source +builtin_names = frozenset([p.name for p in builtin_plugins]) + +class NameConflict(ValueError): + pass + def _config(): c = Config('customize') c.add_opt('plugins', default={}, help=_('Installed plugins')) @@ -355,6 +360,9 @@ def set_file_type_metadata(stream, mi, ftype): def add_plugin(path_to_zip_file): make_config_dir() plugin = load_plugin(path_to_zip_file) + if plugin.name in builtin_names: + raise NameConflict( + 'A builtin plugin with the name %r already exists' % plugin.name) plugin = initialize_plugin(plugin, path_to_zip_file) plugins = config['plugins'] zfp = os.path.join(plugin_dir, plugin.name+'.zip') @@ -506,7 +514,9 @@ def initialize_plugin(plugin, path_to_zip_file): def initialize_plugins(): global _initialized_plugins _initialized_plugins = [] - for zfp in list(config['plugins'].values()) + builtin_plugins: + user_plugins = [p for name, p in config['plugins'].iteritems() if name not + in builtin_names] + for zfp in user_plugins + builtin_plugins: try: try: plugin = load_plugin(zfp) if not isinstance(zfp, type) else zfp diff --git a/src/calibre/gui2/preferences/plugins.py b/src/calibre/gui2/preferences/plugins.py index 79cd2b1ce4..8888a64e84 100644 --- a/src/calibre/gui2/preferences/plugins.py +++ b/src/calibre/gui2/preferences/plugins.py @@ -13,9 +13,9 @@ from PyQt4.Qt import Qt, QModelIndex, QAbstractItemModel, QVariant, QIcon, \ from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.plugins_ui import Ui_Form -from calibre.customize.ui import initialized_plugins, is_disabled, enable_plugin, \ - disable_plugin, plugin_customization, add_plugin, \ - remove_plugin +from calibre.customize.ui import (initialized_plugins, is_disabled, enable_plugin, + disable_plugin, plugin_customization, add_plugin, + remove_plugin, NameConflict) from calibre.gui2 import NONE, error_dialog, info_dialog, choose_files, \ question_dialog, gprefs from calibre.utils.search_query_parser import SearchQueryParser @@ -279,7 +279,11 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): ' Are you sure you want to proceed?'), show_copy_button=False): return - plugin = add_plugin(path) + try: + plugin = add_plugin(path) + except NameConflict as e: + return error_dialog(self, _('Already exists'), + unicode(e), show=True) self._plugin_model.populate() self._plugin_model.reset() self.changed_signal.emit()