From c96d31b30a82ea162241ff7e2b6569349f947867 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Mon, 6 Sep 2021 13:21:38 +0800 Subject: [PATCH] Upload command line --- game-backuper.py | 3 +++ game_backuper/__init__.py | 3 +++ game_backuper/backuper.py | 18 +++++++++++++++--- game_backuper/cml.py | 30 +++++++++++++++++++++++++++++- game_backuper/config.py | 7 ++++++- setup.py | 12 ++++++++++-- 6 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 game-backuper.py diff --git a/game-backuper.py b/game-backuper.py new file mode 100644 index 0000000..e880744 --- /dev/null +++ b/game-backuper.py @@ -0,0 +1,3 @@ +# You can use `pyinstaller -c game-backuper.py` to get a package version +from game_backuper import start +start() diff --git a/game_backuper/__init__.py b/game_backuper/__init__.py index 6acdf55..4fe219e 100644 --- a/game_backuper/__init__.py +++ b/game_backuper/__init__.py @@ -1,3 +1,4 @@ +__version__ = "1.0.0" from game_backuper.main import main @@ -6,4 +7,6 @@ def start(): try: sys.exit(main()) except Exception: + from traceback import print_exc + print_exc() sys.exit(-1) diff --git a/game_backuper/backuper.py b/game_backuper/backuper.py index 339c092..c8d70ba 100644 --- a/game_backuper/backuper.py +++ b/game_backuper/backuper.py @@ -5,7 +5,7 @@ from game_backuper.config import ( ConfigNormalFile, ConfigLeveldb, ) -from game_backuper.cml import Opts +from game_backuper.cml import Opts, OptAction from threading import Thread from os.path import exists, join from os import mkdir @@ -58,11 +58,23 @@ class Backuper: self.opts = opts self.tasks = [] - def run(self): - for prog in self.conf.progs: + def deal_prog(self, prog: Program): + if self.opts.action == OptAction.BACKUP: t = BackupTask(prog, self.db, self.conf) self.tasks.append(t) t.start() + + def run(self): + if self.opts.programs_list is None: + for prog in self.conf.progs: + self.deal_prog(prog) + else: + for n in self.opts.programs_list: + if n not in self.conf.progs_name: + raise ValueError(f'Can not find "{n}" in config file.') + for n in self.opts.programs_list: + prog = self.conf.progs[self.conf.progs_name.index(n)] + self.deal_prog(prog) self.wait() return 0 diff --git a/game_backuper/cml.py b/game_backuper/cml.py index ff8f162..d140e02 100644 --- a/game_backuper/cml.py +++ b/game_backuper/cml.py @@ -1,6 +1,7 @@ from getopt import getopt, GetoptError from typing import List from platform import system +from enum import IntEnum, unique if system() == "Windows": import os DEFAULT_CONFIG = f'{os.environ["APPDATA"]}\\game-backuper.yaml' @@ -8,8 +9,27 @@ else: DEFAULT_CONFIG = '/etc/game-backuper.yaml' +@unique +class OptAction(IntEnum): + BACKUP = 0 + RESTORE = 1 + + @staticmethod + def from_str(v: str) -> IntEnum: + if isinstance(v, str): + t = v.lower() + if t == 'backup': + return OptAction.BACKUP + elif t == 'restore': + return OptAction.RESTORE + else: + raise TypeError('Must be str.') + + class Opts: config_file: str = DEFAULT_CONFIG + action = OptAction.BACKUP + programs_list = None def __init__(self, cml: List[str]): try: @@ -21,6 +41,14 @@ class Opts: sys.exit(0) elif i[0] == '-c': self.config_file = i[1] + if len(r[1]) > 0: + cm = r[1] + re = OptAction.from_str(cm[0]) + if re is not None: + self.action = re + li = cm if re is None else cm[1:] + if len(li) > 0: + self.programs_list = li except GetoptError: from traceback import print_exc print_exc() @@ -28,4 +56,4 @@ class Opts: sys.exit(-1) def print_help(self): - print('''game-backuper [options] [game names]''') + print('''game-backuper [options] [backup|restore] [game names]''') diff --git a/game_backuper/config.py b/game_backuper/config.py index 87236e0..2465291 100644 --- a/game_backuper/config.py +++ b/game_backuper/config.py @@ -79,6 +79,7 @@ class Program: class Config: dest = '' progs = [] + progs_name = [] def __init__(self, fn: str): with open(fn, 'r', encoding='UTF-8') as f: @@ -99,4 +100,8 @@ class Config: p = Program(prog) if not p.check(): raise ValueError('Config error: program information error') - self.progs.append(p) + if p.name not in self.progs_name: + self.progs_name.append(p.name) + self.progs.append(p) + else: + raise ValueError(f'have same name "{p.name}" in programs.') diff --git a/setup.py b/setup.py index e01bff5..15b4dc5 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,24 @@ # flake8: noqa import sys +from game_backuper import __version__ if len(sys.argv) == 2 and sys.argv[1] == "py2exe": from distutils.core import setup import py2exe params = { "console": [{ 'script': "game_backuper/__main__.py", - "dest_base": 'game-backuper' + "dest_base": 'game-backuper', + 'version': __version__, + 'product_name': 'game-backuper', + 'product_version': __version__, + 'company_name': 'lifegpc', + 'description': 'A game backuper', }], "options": { "py2exe": { "optimize": 2, + "compressed": 1, + "excludes": ["pydoc"] } }, "zipfile": None, @@ -25,7 +33,7 @@ else: } setup( name="game-backuper", - version="1.0.0", + version=__version__, url="https://github.com/lifegpc/game-backuper", author="lifegpc", author_email="g1710431395@gmail.com",