Skip to content

Commit 7714631

Browse files
committed
Back up user data before updating
1 parent 62864a1 commit 7714631

4 files changed

Lines changed: 36 additions & 2 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ __pycache__/
22
build/
33
dist/
44
logs/
5+
backups/

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Flashpoint Updater
1+
# Flashpoint Ultimate Updater
22

33
The updater for BlueMaxima's Flashpoint.
44

@@ -8,7 +8,7 @@ The updater for BlueMaxima's Flashpoint.
88

99
**GUI Version (Recommended)**
1010

11-
1. Download the [latest release](https://github.com/FlashpointProject/FlashpointUpdater/releases/latest).
11+
1. Download the [latest release](https://github.com/FlashpointProject/FlashpointUltimateUpdater/releases/latest).
1212
2. Unpack anywhere.
1313
3. Run FlashpointUpdaterQt.exe
1414
4. Select your Flashpoint path and target version.
@@ -48,6 +48,10 @@ This listing must obey the following structure (note the following is not valid
4848
"root": "/fp/", # relative path to where the flashpoint data resides
4949
"lzma": true, # whether LZMA compression was applied to the index file
5050
"info": "blank" # currently unused: should contain a changelog or description of some sort
51+
"backup": [ # optional: list of glob patterns to back up before performing an update
52+
"Data/flashpoint.sqlite",
53+
"FPSoftware/Important/*"
54+
]
5155
}
5256
},
5357
"anchor": {

core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ def get_anchor(self):
8585
def get_root(self, name):
8686
return urljoin(self.endpoint, self.index(name)['root'])
8787

88+
def get_backup_paths(self, name):
89+
return self.index(name).get('backup', None)
90+
8891
def autodetect_anchor(self, anchor_hash):
8992
anchor = self.get_anchor()
9093
autodetect = dict()

update_gui.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
import threading
88
import requests
99
import logging
10+
import shutil
1011
import ctypes
1112
import update
1213
import index
1314
import json
15+
import glob
16+
import time
1417
import sys
1518
import os
1619
import re
@@ -26,8 +29,31 @@ def __init__(self, reporter, root_path, server, current, target):
2629
self.current = current
2730
self.target = target
2831

32+
def create_backup(self, backup_paths):
33+
files = list()
34+
for rel_glob in backup_paths:
35+
path_glob = os.path.join(self.root_path, rel_glob)
36+
for path in glob.glob(path_glob):
37+
if not os.path.isfile(path):
38+
continue
39+
rel = os.path.relpath(path, self.root_path)
40+
files.append((path, rel))
41+
if not files:
42+
return
43+
backup = os.path.join('backups', time.strftime('%Y-%m-%d_%H-%M-%S'))
44+
self.reporter.logger.info('Backup folder: %s' % backup)
45+
for (path, rel), report in self.reporter.task_it('Backing up files...', files):
46+
report(rel)
47+
dest = os.path.join(backup, rel)
48+
os.makedirs(os.path.dirname(dest), exist_ok=True)
49+
shutil.copy(path, dest)
50+
self.reporter.logger.info('Saved: %s' % rel)
51+
2952
def run(self):
53+
backup_paths = self.server.get_backup_paths(self.current)
3054
try:
55+
if backup_paths:
56+
self.create_backup(backup_paths)
3157
current = self.server.fetch(self.current, self.reporter)
3258
target = self.server.fetch(self.target, self.reporter)
3359
update.perform_update(self.root_path, current, target, server.get_root(self.target), self.reporter)

0 commit comments

Comments
 (0)