2025.04.17 01:55:37 (desktop)

This commit is contained in:
Christian Moser 2025-04-17 01:55:37 +02:00
parent b0fe0909ef
commit eb198d7ce7
Failed to extract signature
4 changed files with 36 additions and 6 deletions

View File

@ -32,6 +32,7 @@ import time
from ..game import Game,SavegameType,VALID_SAVEGAME_TYPES,SAVEGAME_TYPE_ICONS from ..game import Game,SavegameType,VALID_SAVEGAME_TYPES,SAVEGAME_TYPE_ICONS
from ..settings import settings from ..settings import settings
from ..utility import sanitize_path,sanitize_windows_path from ..utility import sanitize_path,sanitize_windows_path
from ..error import NotAnArchiveError
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -85,6 +86,9 @@ class Archiver(GObject):
game=game.key,filename=filename)) game=game.key,filename=filename))
return self.emit('backup',game,filename) return self.emit('backup',game,filename)
def restore(self,filename:str):
self.emit('restore',filename)
def generate_new_backup_filename(self,game:Game)->str: def generate_new_backup_filename(self,game:Game)->str:
dt = datetime.datetime.now() dt = datetime.datetime.now()
@ -138,7 +142,7 @@ class ArchiverManager(GObject):
@staticmethod @staticmethod
def get_global(): def get_global()->"ArchiverManager":
if ArchiverManager.__global_archiver_manager is None: if ArchiverManager.__global_archiver_manager is None:
ArchiverManager.__global_archiver_manager = ArchiverManager() ArchiverManager.__global_archiver_manager = ArchiverManager()
@ -307,14 +311,35 @@ class ArchiverManager(GObject):
flags=SignalFlags.RUN_FIRST) flags=SignalFlags.RUN_FIRST)
def do_backup(self,archiver,game,filename): def do_backup(self,archiver,game,filename):
return True return True
def restore(self,filename:str):
archiver = self.get_archiver_for_file(filename)
return self.emit('restore',archiver,filename)
@Signal(name="restore",return_type=bool,arg_types=(Archiver,str),
flags=SignalFlags.RUN_LAST)
def do_restore(self,archiver:Archiver,filename:str):
archiver.restore(filename)
return True
def is_archive(self,filename)->bool: def is_archive(self,filename:str)->bool:
if self.standard_archiver.is_archive(filename): if self.standard_archiver.is_archive(filename):
return True return True
for i in self.archivers.values(): for i in self.archivers.values():
if i.is_archive(filename): if i.is_archive(filename):
return True return True
return False return False
def get_archiver_for_file(self,filename:str)->Archiver:
if self.standard_archiver.is_archive(filename):
return self.standard_archiver
for archiver in self.archivers.values():
if archiver.is_archive(filename):
return archiver
raise NotAnArchiveError(f"\"{filename}\" seems not to be a valid archive!")
def get_live_backups(self,game:Game): def get_live_backups(self,game:Game):
ret = [] ret = []

View File

@ -63,7 +63,7 @@ class ZipfileArchiver(Archiver):
raise RuntimeError("\"{filename}\" is not a valid sgbackup zipfile archive!") raise RuntimeError("\"{filename}\" is not a valid sgbackup zipfile archive!")
with zipfile.ZipFile(filename,"r") as zf: with zipfile.ZipFile(filename,"r") as zf:
zip_game = Game.new_from_dict(json.loads(zf.read('game.conf').decode("utf-8"))) zip_game = Game.new_from_dict(json.loads(zf.read('gameconf.json').decode("utf-8")))
try: try:
game = GameManager.get_global().games[zip_game.key] game = GameManager.get_global().games[zip_game.key]
except: except:
@ -71,8 +71,9 @@ class ZipfileArchiver(Archiver):
if not os.path.isdir(game.savegame_root): if not os.path.isdir(game.savegame_root):
os.makedirs(game.savegame_root) os.makedirs(game.savegame_root)
extract_files = [i for i in zf.filelist if i.startswith(zip_game.savegame_dir + "/")] print("\n".join([i.filename for i in zf.filelist]))
extract_files = [i for i in zf.filelist if i.filename.startswith(zip_game.savegame_dir + "/")]
for file in extract_files: for file in extract_files:
zf.extract(file,game.savegame_root) zf.extract(file,game.savegame_root)

3
sgbackup/error.py Normal file
View File

@ -0,0 +1,3 @@
class NotAnArchiveError(LookupError):
pass

View File

@ -1196,7 +1196,8 @@ class BackupView(Gtk.Box):
def _on_restore_button_clicked(self,button,data:BackupViewData): def _on_restore_button_clicked(self,button,data:BackupViewData):
pass am = ArchiverManager.get_global()
am.restore(data.filename)
def _on_delete_button_clicked(self,button,data:BackupViewData): def _on_delete_button_clicked(self,button,data:BackupViewData):
am = ArchiverManager.get_global() am = ArchiverManager.get_global()