- import shutil
- if os.path.exists(self.lock_file):
- raise HandledException('Sorry, lock file!')
- f = open(self.lock_file, 'w+')
- f.close()
-
- # always back up most recent to .bak
- bakpath = f'{self.db_file}.bak'
- shutil.copy(self.db_file, bakpath)
-
- # collect modification times of numbered .bak files
- bak_prefix = f'{bakpath}.'
- backup_dates = []
- i = 0
- bak_as = f'{bak_prefix}{i}'
- while os.path.exists(bak_as):
- mod_time = os.path.getmtime(bak_as)
- backup_dates += [str(datetime.datetime.fromtimestamp(mod_time))]
- i += 1
- bak_as = f'{bak_prefix}{i}'
-
- # collect what numbered .bak files to save:
- # shrink datetime string right to left character by character,
- # on each step add the oldest file whose mtime still fits the pattern
- # (privilege older files to keep existing longer)
- to_save = []
- datetime_len = 19
- now = str(datetime.datetime.now())[:datetime_len]
- while datetime_len > 2:
- # assume backup_dates starts with oldest dates
- for i, date in enumerate(backup_dates):
- if date[:datetime_len] == now:
- if i not in to_save:
- to_save += [i]
- break
- datetime_len -= 1
- now = now[:datetime_len]
-
- # remove redundant backup files
- j = 0
- for i in to_save:
- if i != j:
- source = f'{bak_prefix}{i}'
- target = f'{bak_prefix}{j}'
- shutil.move(source, target)
- j += 1
- for i in range(j, len(backup_dates)):
- try:
- os.remove(f'{bak_prefix}{i}')
- except FileNotFoundError:
- pass