URI: 
       tassert datadir available - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit c8bed8791a4134b3f38721a84ccf71e047e1615c
   DIR parent cbf1b5d9d5670fc84fbe47d6d20eddda24ea20f5
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Sun, 29 Apr 2018 18:25:10 +0200
       
       assert datadir available
       
       Diffstat:
         M lib/blockchain.py                   |      27 +++++++++++++++++----------
         M lib/interface.py                    |       2 ++
         M lib/simple_config.py                |       6 ++----
         M lib/util.py                         |      21 +++++++++++++++++++++
       
       4 files changed, 42 insertions(+), 14 deletions(-)
       ---
   DIR diff --git a/lib/blockchain.py b/lib/blockchain.py
       t@@ -200,8 +200,10 @@ class Blockchain(util.PrintError):
                parent_id = self.parent_id
                checkpoint = self.checkpoint
                parent = self.parent()
       +        self.assert_headers_file_available(self.path())
                with open(self.path(), 'rb') as f:
                    my_data = f.read()
       +        self.assert_headers_file_available(parent.path())
                with open(parent.path(), 'rb') as f:
                    f.seek((checkpoint - parent.checkpoint)*80)
                    parent_data = f.read(parent_branch_size*80)
       t@@ -224,9 +226,18 @@ class Blockchain(util.PrintError):
                blockchains[self.checkpoint] = self
                blockchains[parent.checkpoint] = parent
        
       +    def assert_headers_file_available(self, path):
       +        if os.path.exists(path):
       +            return
       +        elif not os.path.exists(util.get_headers_dir(self.config)):
       +            raise FileNotFoundError('Electrum headers_dir does not exist. Was it deleted while running?')
       +        else:
       +            raise FileNotFoundError('Cannot find headers file but headers_dir is there. Should be at {}'.format(path))
       +
            def write(self, data, offset, truncate=True):
                filename = self.path()
                with self.lock:
       +            self.assert_headers_file_available(filename)
                    with open(filename, 'rb+') as f:
                        if truncate and offset != self._size*80:
                            f.seek(offset)
       t@@ -255,16 +266,12 @@ class Blockchain(util.PrintError):
                    return
                delta = height - self.checkpoint
                name = self.path()
       -        if os.path.exists(name):
       -            with open(name, 'rb') as f:
       -                f.seek(delta * 80)
       -                h = f.read(80)
       -                if len(h) < 80:
       -                    raise Exception('Expected to read a full header. This was only {} bytes'.format(len(h)))
       -        elif not os.path.exists(util.get_headers_dir(self.config)):
       -            raise Exception('Electrum datadir does not exist. Was it deleted while running?')
       -        else:
       -            raise Exception('Cannot find headers file but datadir is there. Should be at {}'.format(name))
       +        self.assert_headers_file_available(name)
       +        with open(name, 'rb') as f:
       +            f.seek(delta * 80)
       +            h = f.read(80)
       +            if len(h) < 80:
       +                raise Exception('Expected to read a full header. This was only {} bytes'.format(len(h)))
                if h == bytes([0])*80:
                    return None
                return deserialize_header(h, height)
   DIR diff --git a/lib/interface.py b/lib/interface.py
       t@@ -172,6 +172,7 @@ class TcpConnection(threading.Thread, util.PrintError):
                        # workaround android bug
                        cert = re.sub("([^\n])-----END CERTIFICATE-----","\\1\n-----END CERTIFICATE-----",cert)
                        temporary_path = cert_path + '.temp'
       +                util.assert_datadir_available(self.config_path)
                        with open(temporary_path, "w", encoding='utf-8') as f:
                            f.write(cert)
                            f.flush()
       t@@ -201,6 +202,7 @@ class TcpConnection(threading.Thread, util.PrintError):
                                os.unlink(rej)
                            os.rename(temporary_path, rej)
                        else:
       +                    util.assert_datadir_available(self.config_path)
                            with open(cert_path, encoding='utf-8') as f:
                                cert = f.read()
                            try:
   DIR diff --git a/lib/simple_config.py b/lib/simple_config.py
       t@@ -6,6 +6,7 @@ import stat
        
        from copy import deepcopy
        
       +from . import util
        from .util import (user_dir, print_error, PrintError,
                           NoDynamicFeeEstimates, format_fee_satoshis)
        from .i18n import _
       t@@ -236,10 +237,7 @@ class SimpleConfig(PrintError):
                    return path
        
                # default path
       -        if not os.path.exists(self.path):
       -            raise FileNotFoundError(
       -                _('Electrum datadir does not exist. Was it deleted while running?') + '\n' +
       -                _('Should be at {}').format(self.path))
       +        util.assert_datadir_available(self.path)
                dirpath = os.path.join(self.path, "wallets")
                if not os.path.exists(dirpath):
                    if os.path.islink(dirpath):
   DIR diff --git a/lib/util.py b/lib/util.py
       t@@ -326,10 +326,31 @@ def android_check_data_dir():
                shutil.move(old_electrum_dir, data_dir)
            return data_dir
        
       +
        def get_headers_dir(config):
            return android_headers_dir() if 'ANDROID_DATA' in os.environ else config.path
        
        
       +def assert_datadir_available(config_path):
       +    path = config_path
       +    if os.path.exists(path):
       +        return
       +    else:
       +        raise FileNotFoundError(
       +            'Electrum datadir does not exist. Was it deleted while running?' + '\n' +
       +            'Should be at {}'.format(path))
       +
       +
       +def assert_file_in_datadir_available(path, config_path):
       +    if os.path.exists(path):
       +        return
       +    else:
       +        assert_datadir_available(config_path)
       +        raise FileNotFoundError(
       +            'Cannot find file but datadir is there.' + '\n' +
       +            'Should be at {}'.format(path))
       +
       +
        def assert_bytes(*args):
            """
            porting helper, assert args type