diff --git a/picard/config.py b/picard/config.py index 2ea475da1..f0cf18a3f 100644 --- a/picard/config.py +++ b/picard/config.py @@ -17,6 +17,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +import re from operator import itemgetter from PyQt4 import QtCore from picard import (PICARD_APP_NAME, PICARD_ORG_NAME, PICARD_VERSION, @@ -94,7 +95,25 @@ class Config(QtCore.QSettings): else: raise KeyError("Unknown profile '%s'" % (profilename,)) - def register_upgrade_hook(self, to_version_str, func, *args): + def _detect_upgrade_hooks(self, symbol_table): + """Detect upgrade functions based on their names""" + hooks = dict() + pattern = re.compile("^upgrade_to_v(\d+)_(\d+)_(\d+)_(dev|final)_(\d+)$") + for symbol in symbol_table: + match = re.search(pattern, symbol) + if not match: + continue + version = match.groups() + version_string = version_to_string(version) + hooks[version_string] = symbol_table[symbol] + return hooks + + def register_upgrade_hooks(self, symbol_table): + hooks = self._detect_upgrade_hooks(symbol_table) + for version in sorted(hooks): + self._register_upgrade_hook(version, hooks[version]) + + def _register_upgrade_hook(self, to_version_str, func, *args): """Register a function to upgrade from one config version to another""" to_version = version_from_string(to_version_str) assert to_version <= PICARD_VERSION, "%r > %r !!!" % (to_version, PICARD_VERSION) diff --git a/picard/tagger.py b/picard/tagger.py index 563a1c260..e60aedf17 100644 --- a/picard/tagger.py +++ b/picard/tagger.py @@ -216,10 +216,7 @@ class Tagger(QtGui.QApplication): "from spaces to comma") cfg = config._config - cfg.register_upgrade_hook("1.0.0final0", upgrade_to_v1_0_0_final_0) - cfg.register_upgrade_hook("1.3.0dev1", upgrade_to_v1_3_0_dev_1) - cfg.register_upgrade_hook("1.3.0dev2", upgrade_to_v1_3_0_dev_2) - + cfg.register_upgrade_hooks(locals()) cfg.run_upgrade_hooks() def move_files_to_album(self, files, albumid=None, album=None):