diff --git a/tryton/CHANGELOG b/tryton/CHANGELOG index 8678ee24aab..740996bbd37 100644 --- a/tryton/CHANGELOG +++ b/tryton/CHANGELOG @@ -1,3 +1,4 @@ +* Transfer configuration, profiles and plugins from previous version * Don't reset date/datetime/time to None when it is invalid Version 6.8.3 - 2023-09-06 diff --git a/tryton/tryton/client.py b/tryton/tryton/client.py index ebf1ac29ece..81695eee02a 100644 --- a/tryton/tryton/client.py +++ b/tryton/tryton/client.py @@ -9,7 +9,7 @@ from gi.repository import Gdk, Gio, Gtk from tryton import __version__, common, gui, translate -from tryton.config import CONFIG, get_config_dir +from tryton.config import CONFIG, copy_previous_configuration, get_config_dir from tryton.gui.window.dblogin import DBLogin diff --git a/tryton/tryton/config.py b/tryton/tryton/config.py index 9b4283f8c8e..19ae24511aa 100644 --- a/tryton/tryton/config.py +++ b/tryton/tryton/config.py @@ -21,20 +21,57 @@ _ = gettext.gettext -def get_config_dir(): +def _reverse_series_iterator(starting_version): + major, minor = map(int, starting_version.split('.')) + while major >= 0 and minor >= 0: + yield f"{major}.{minor}" + if minor == 0: + major -= 1 + minor = 8 + else: + minor -= 2 if not minor % 2 else 1 + + +def copy_previous_configuration(config_element): + current_version = __version__.rsplit('.', 1)[0] + config_dir = get_config_root() + for version in _reverse_series_iterator(current_version): + config_path = os.path.join(config_dir, version, config_element) + if version == current_version and os.path.exists(config_path): + break + elif os.path.exists(config_path): + if os.path.isfile(config_path): + shutil.copy(config_path, get_config_dir()) + elif os.path.isdir(config_path): + shutil.copytree( + config_path, + os.path.join(get_config_dir(), config_element)) + break + + +def get_config_root(): if os.name == 'nt': appdata = os.environ['APPDATA'] if not isinstance(appdata, str): appdata = str(appdata, sys.getfilesystemencoding()) - return os.path.join(appdata, '.config', 'tryton', - __version__.rsplit('.', 1)[0]) - config_path = os.getenv('XDG_CONFIG_HOME', os.path.join('~', '.config')) - return os.path.expanduser( - os.path.join(config_path, 'tryton', __version__.rsplit('.', 1)[0])) + config_path = os.path.join(appdata, '.config') + else: + config_path = os.path.expanduser(os.getenv( + 'XDG_CONFIG_HOME', os.path.join('~', '.config'))) + return os.path.join(config_path, 'tryton') + + +def get_config_dir(): + return os.path.join(get_config_root(), __version__.rsplit('.', 1)[0]) if not os.path.isdir(get_config_dir()): os.makedirs(get_config_dir(), 0o700) + copy_previous_configuration('tryton.conf') + copy_previous_configuration('known_hosts') + copy_previous_configuration('accel_map') + copy_previous_configuration('profiles.cfg') + copy_previous_configuration('plugins') class ConfigManager(object): diff --git a/tryton/tryton/gui/window/dblogin.py b/tryton/tryton/gui/window/dblogin.py index 4f1595aefea..5f5bdc3eea7 100644 --- a/tryton/tryton/gui/window/dblogin.py +++ b/tryton/tryton/gui/window/dblogin.py @@ -521,7 +521,7 @@ def __init__(self): temp_name = temp_file.name shutil.copy(self.profile_cfg, temp_name) logger.error( - f"Failed to parse {self.profiles_cfg}. " + f"Failed to parse {self.profile_cfg}. " f"A backup can be found at {temp_name}", exc_info=True) for section in self.profiles.sections():