mirror of
https://github.com/c9moser/sgbackup.git
synced 2026-01-19 19:40:13 +00:00
2025.04.17 01:55:37 (desktop)
This commit is contained in:
parent
b0fe0909ef
commit
eb198d7ce7
@ -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 = []
|
||||||
|
|||||||
@ -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
3
sgbackup/error.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
class NotAnArchiveError(LookupError):
|
||||||
|
pass
|
||||||
@ -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()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user