URI: 
       tstorage: upgrade format version automatically in load_data() - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit a5ffa69a3eac325dfa38102824abcfe751ffb704
   DIR parent 1320b18d7e1f16c061dff276f462f31e6a8509ea
  HTML Author: SomberNight <SomberNight@users.noreply.github.com>
       Date:   Thu, 12 Oct 2017 07:08:00 +0200
       
       storage: upgrade format version automatically in load_data()
       
       Diffstat:
         M gui/qt/installwizard.py             |       2 +-
         M lib/daemon.py                       |       3 +--
         M lib/storage.py                      |      20 +++++++++++++++++---
       
       3 files changed, 19 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py
       t@@ -191,7 +191,7 @@ class InstallWizard(QDialog, MessageBoxMixin, BaseWizard):
                def on_filename(filename):
                    path = os.path.join(wallet_folder, filename)
                    try:
       -                self.storage = WalletStorage(path)
       +                self.storage = WalletStorage(path, manual_upgrades=True)
                    except IOError:
                        self.storage = None
                    if self.storage:
   DIR diff --git a/lib/daemon.py b/lib/daemon.py
       t@@ -210,7 +210,7 @@ class Daemon(DaemonThread):
                if path in self.wallets:
                    wallet = self.wallets[path]
                    return wallet
       -        storage = WalletStorage(path)
       +        storage = WalletStorage(path, manual_upgrades=True)
                if not storage.file_exists():
                    return
                if storage.is_encrypted():
       t@@ -220,7 +220,6 @@ class Daemon(DaemonThread):
                if storage.requires_split():
                    return
                if storage.requires_upgrade():
       -            self.print_error('upgrading wallet format')
                    storage.upgrade()
                if storage.get_action():
                    return
   DIR diff --git a/lib/storage.py b/lib/storage.py
       t@@ -62,8 +62,9 @@ def multisig_type(wallet_type):
        
        class WalletStorage(PrintError):
        
       -    def __init__(self, path):
       +    def __init__(self, path, manual_upgrades=False):
                self.print_error("wallet path", path)
       +        self.manual_upgrades = manual_upgrades
                self.lock = threading.RLock()
                self.data = {}
                self.path = path
       t@@ -74,6 +75,9 @@ class WalletStorage(PrintError):
                        self.raw = f.read()
                    if not self.is_encrypted():
                        self.load_data(self.raw)
       +        else:
       +            # avoid new wallets getting 'upgraded'
       +            self.put('seed_version', FINAL_SEED_VERSION)
        
            def load_data(self, s):
                try:
       t@@ -99,6 +103,12 @@ class WalletStorage(PrintError):
                l = plugin_loaders.get(t)
                if l: l()
        
       +        if not self.manual_upgrades:
       +            if self.requires_split():
       +                raise BaseException("This wallet has multiple accounts and must be split")
       +            if self.requires_upgrade():
       +                self.upgrade()
       +
            def is_encrypted(self):
                try:
                    return base64.b64decode(self.raw)[0:4] == b'BIE1'
       t@@ -155,8 +165,6 @@ class WalletStorage(PrintError):
        
            @profiler
            def write(self):
       -        # this ensures that previous versions of electrum won't open the wallet
       -        self.put('seed_version', FINAL_SEED_VERSION)
                with self.lock:
                    self._write()
        
       t@@ -244,10 +252,14 @@ class WalletStorage(PrintError):
                return self.file_exists() and self.get_seed_version() != FINAL_SEED_VERSION
        
            def upgrade(self):
       +        self.print_error('upgrading wallet format')
       +
                self.convert_imported()
                self.convert_wallet_type()
                self.convert_account()
                self.convert_version_14()
       +
       +        self.put('seed_version', FINAL_SEED_VERSION)
                self.write()
        
            def convert_wallet_type(self):
       t@@ -338,6 +350,8 @@ class WalletStorage(PrintError):
        
            def convert_version_14(self):
                # convert imported wallets for 3.0
       +        if self.get_seed_version() >= 14:
       +            return
                if self.get('wallet_type') =='imported':
                    addresses = self.get('addresses')
                    if type(addresses) is list: