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 ..settings import settings
from ..utility import sanitize_path,sanitize_windows_path
from ..error import NotAnArchiveError
import logging
logger = logging.getLogger(__name__)
@ -85,6 +86,9 @@ class Archiver(GObject):
game=game.key,filename=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:
dt = datetime.datetime.now()
@ -138,7 +142,7 @@ class ArchiverManager(GObject):
@staticmethod
def get_global():
def get_global()->"ArchiverManager":
if ArchiverManager.__global_archiver_manager is None:
ArchiverManager.__global_archiver_manager = ArchiverManager()
@ -308,7 +312,17 @@ class ArchiverManager(GObject):
def do_backup(self,archiver,game,filename):
return True
def is_archive(self,filename)->bool:
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:str)->bool:
if self.standard_archiver.is_archive(filename):
return True
for i in self.archivers.values():
@ -316,6 +330,17 @@ class ArchiverManager(GObject):
return True
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):
ret = []
for sgtype in VALID_SAVEGAME_TYPES:

View File

@ -63,7 +63,7 @@ class ZipfileArchiver(Archiver):
raise RuntimeError("\"{filename}\" is not a valid sgbackup zipfile archive!")
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:
game = GameManager.get_global().games[zip_game.key]
except:
@ -72,7 +72,8 @@ class ZipfileArchiver(Archiver):
if not os.path.isdir(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:
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):
pass
am = ArchiverManager.get_global()
am.restore(data.filename)
def _on_delete_button_clicked(self,button,data:BackupViewData):
am = ArchiverManager.get_global()