Exemple #1
0
def patch_exe(path_to_exe: str or Path,
              version: str,
              app_name: str,
              wkdir: str or Path,
              build_: str):
    path_to_exe = Path(path_to_exe)
    wkdir = Path(wkdir)

    logger.info('patch exe: start')
    app_name = app_name

    if not path_to_exe.exists():
        raise FileNotFoundError(path_to_exe)
    if not wkdir.exists():
        raise FileNotFoundError(wkdir)

    logger.debug('short name: {}'.format(app_name))
    logger.debug('version: {}'.format(version))
    logger.debug('patching: {}'.format(path_to_exe.abspath()))

    cmd = [
        'verpatch',
        path_to_exe,
        '/high',
        version,
        '/va',
        '/pv', version,
        '/s', 'product', app_name,
        '/s', 'copyright', '2017 etcher',
        '/s', 'company', 'etcher',
        '/s', 'build', str(build_),
        '/s', 'PrivateBuild', str(build_),
        '/langid', '1033',
    ]
    run_piped_process(cmd, logger_=logger, cwd=wkdir)
Exemple #2
0
 def browse_for_single_miz(self):
     init_dir = get_saved_games_path()
     p = BrowseDialog.get_existing_file(self, 'Select MIZ file', _filter=['*.miz'], init_dir=init_dir.abspath())
     if p:
         p = Path(p)
         self.single_miz.setText(p.abspath())
         Config().single_miz_last = p.abspath()
Exemple #3
0
 def single_miz_path(self) -> Path or None:
     t = self.single_miz.text()
     if len(t) > 3:
         p = Path(t)
         if p.exists() and p.isfile() and p.ext == '.miz':
             return p
     return None
Exemple #4
0
def build(env):
    logger.info('reading GitVersion output')
    version = loads(subprocess.check_output(['gitversion'], cwd='.').decode().rstrip())
    logger.debug('gitversion says: {}'.format(version))
    logger.info('compiling packed executable')
    run_piped_process([
        os.path.join(env, 'python.exe'),
        '-m', 'PyInstaller',
        '--noconfirm',
        '--onefile',
        '--clean',
        '--icon', './src/ui/app.ico',
        '--workpath', './build',
        '--paths', os.path.join(env, r'Lib\site-packages\PyQt5\Qt\bin'),
        '--log-level=WARN',
        '--add-data', '{};{}'.format(certifi.where(), '.'),
        '--name', global_.APP_SHORT_NAME,
        '--distpath', './dist',
        '--windowed',
        './src/main.py',
    ], logger_=logger, cwd='.')
    logger.info('patching exe resources')
    patch_exe(
        path_to_exe=Path('./dist/EMFT.exe'),
        version=version.get('SemVer'),
        app_name=global_.APP_SHORT_NAME,
        wkdir=Path('.'),
        build_=version.get('InformationalVersion'),
    )

    logger.info('all done')
Exemple #5
0
 def auto_src_browse(self):
     if self.auto_src_path:
         init_dir = self.auto_src_path.dirname()
     else:
         init_dir = get_saved_games_path()
     p = BrowseDialog.get_directory(self, 'Select source directory', init_dir=init_dir.abspath())
     if p:
         p = Path(p)
         self.auto_src_le.setText(p.abspath())
         Config().auto_source_folder = p.abspath()
         self.scan()
Exemple #6
0
def check_cert():
    logger.info('certificate: checking')
    import certifi
    import os

    from utils.custom_path import Path
    cacert = Path(certifi.where())
    # noinspection SpellCheckingInspection
    if not cacert.crc32() == 'D069EE01':
        raise ImportError('cacert.pem file is corrupted: {}'.format(
            cacert.crc32()))
    logger.debug('setting up local cacert file to: {}'.format(str(cacert)))
    os.environ['REQUESTS_CA_BUNDLE'] = str(cacert)
    logger.info('certificate: checked')
Exemple #7
0
def build_requirements(env):
    requirements = subprocess.Popen(
        [os.path.join(env, 'scripts/pip.exe'), 'freeze'],
        stdout=subprocess.PIPE
    ).stdout.read().decode('utf8')
    requirements = requirements.rstrip()
    requirements = requirements.replace('\r\n', '\n')
    requirements = requirements.replace(r'PyInstaller==3.3.dev0+gb78bfe5',
                                        r'git+https://github.com/132nd-etcher/pyinstaller.git#egg=PyInstaller')
    requirements = re.sub(r'SLTP==\d+.\d+.\d+.*\n', r'', requirements)
    requirements = re.sub(r'utils==\d+.\d+.\d+.*\n', r'', requirements)
    Path('requirements.txt').write_text(requirements)
    own_requirements = [
        'git+https://github.com/132nd-etcher/sltp.git#egg=sltp',
        'git+https://github.com/132nd-etcher/utils.git#egg=utils'
    ]
    Path('own_requirements.txt').write_text('\n'.join(own_requirements))
Exemple #8
0
    def _download(self):

        def proceed_with_download():

            downloader.download(
                url=dl_url,
                local_file=local_file,
                progress_title='Downloading {}'.format(dl_url.split('/').pop()),
                progress_text=local_file,
                file_size=file_size
            )

        dl_url, file_size, local_file_name = appveyor.latest_version_download_url(self.selected_branch)
        local_file = Path(self.auto_src_path).joinpath(local_file_name).abspath()

        if local_file.exists():

            I.confirm(text='Local file already exists; do you want to overwrite?', follow_up=proceed_with_download)
        else:
            proceed_with_download()
Exemple #9
0
 def auto_out_browse(self):
     if self.auto_out_path:
         init_dir = self.auto_out_path.dirname()
     else:
         init_dir = Path('.')
     p = BrowseDialog.get_directory(self, 'Select output directory', init_dir=init_dir.abspath())
     if p:
         p = Path(p)
         self.auto_out_le.setText(p.abspath())
         Config().auto_output_folder = p.abspath()
Exemple #10
0
    def _scan(self):

        if self.auto_src_path:
            try:
                logger.debug('looking for latest local TRMT version')
                self._latest_trmt = natsorted(
                    [Path(f).abspath() for f in Path(self.auto_src_path).listdir('TRMT_*.miz')]).pop()
            except IndexError:
                self._latest_trmt = None
                self.local_version = None
                logger.debug('no local TRMT found')
            else:
                self.local_version = Path(self._latest_trmt).namebase.replace('TRMT_', '')
                logger.debug('latest local TRMT found: {}'.format(self.local_version))

            # noinspection PyBroadException
            try:
                logger.debug('looking for latest remote TRMT version')
                self.remote_version, self.remote_branch = appveyor.get_latest_remote_version(self.selected_branch)
            except:
                logger.debug('no remote TRMT found')
                self.remote_version = None
Exemple #11
0
    def path(self, value: str or Path):

        if isinstance(value, Path):
            pass

        elif isinstance(value, str):
            value = Path(value)

        else:
            raise TypeError('expected Path or str, got: {}'.format(
                type(value)))

        self._path = value
Exemple #12
0
 def browse_for_single_miz_output_folder(self):
     if self.single_miz_output_folder_path:
         init_dir = self.single_miz_output_folder_path.dirname()
     elif self.single_miz_path:
         init_dir = self.single_miz_path.dirname()
     else:
         init_dir = Path('.')
     p = BrowseDialog.get_directory(self, 'Select output directory', init_dir=init_dir.abspath())
     if p:
         p = Path(p)
         self.single_miz_output_folder.setText(p.abspath())
         Config().single_miz_output_folder = p.abspath()
Exemple #13
0
    def __init__(self):

        self.single_group = GroupBox()

        self.single_miz = QLineEdit()
        self.single_miz.setDisabled(True)
        if Config().single_miz_last:
            p = Path(Config().single_miz_last)
            if p.exists() and p.isfile() and p.ext == '.miz':
                self.single_miz.setText(str(p.abspath()))

        self.single_miz_browse = PushButton('Browse', self.browse_for_single_miz)
        self.single_miz_open = PushButton('Open', self.open_single_miz)

        self.single_miz_output_folder = QLineEdit()
        self.single_miz_output_folder.setDisabled(True)
        if Config().single_miz_output_folder:
            p = Path(Config().single_miz_output_folder)
            self.single_miz_output_folder.setText(str(p.abspath()))

        self.single_miz_output_folder_browse = PushButton('Browse', self.browse_for_single_miz_output_folder)
        self.single_miz_output_folder_open = PushButton('Open', self.open_single_miz_output_folder)

        self.single_miz_reorder_btn = PushButton('Reorder MIZ file', self.single_reorder)
        self.single_miz_reorder_btn.setMinimumHeight(40)
        self.single_miz_reorder_btn.setMinimumWidth(400)

        self.single_layout = VLayout([
            GridLayout(
                [
                    [(Label('Source MIZ'), dict(align='r')), self.single_miz, self.single_miz_browse,
                     self.single_miz_open],
                    [(Label('Output folder'), dict(align='r')), self.single_miz_output_folder,
                     self.single_miz_output_folder_browse,
                     self.single_miz_output_folder_open],
                ],
            ),
            self.single_miz_reorder_btn,
        ])

        self.single_group.setLayout(self.single_layout)
Exemple #14
0
def get_saved_games_path():
    if Config().saved_games_path is None:
        logger.debug('searching for base "Saved Games" folder')
        try:
            logger.debug('trying "User Shell Folders"')
            with winreg.OpenKey(A_REG,
                                r"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders") as aKey:
                # noinspection SpellCheckingInspection
                base_sg = Path(winreg.QueryValueEx(aKey, "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}")[0])
        except FileNotFoundError:
            logger.debug('failed, trying "Shell Folders"')
            try:
                with winreg.OpenKey(A_REG,
                                    r"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") as aKey:
                    # noinspection SpellCheckingInspection
                    base_sg = Path(winreg.QueryValueEx(aKey, "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}")[0])
            except FileNotFoundError:
                logger.debug('darn it, another fail, falling back to "~"')
                base_sg = Path('~').expanduser().abspath()
        Config().saved_games_path = str(base_sg.abspath())
        return base_sg
    else:
        return Path(Config().saved_games_path)
Exemple #15
0
    def __init__(self,
                 path: str or Path,
                 init_dict: OrderedDict = None,
                 auto_read=True,
                 encrypted=False):
        self.free = True
        self.encrypt = encrypted

        if init_dict is None:
            self._data = OrderedDict()

        else:

            if not isinstance(init_dict, OrderedDict):
                raise TypeError('expected a OrderedDict, got "{}"'.format(
                    type(init_dict)))

            self._data = init_dict

        self._values, self._keys, self._items = None, None, None
        self._init_views()

        if isinstance(path, Path):
            pass

        elif isinstance(path, str):
            path = Path(path)

        else:
            raise TypeError('expected a Path or a str, got: {}'.format(
                type(path)))

        self._path = path

        if auto_read:
            self.read()
Exemple #16
0
    def read_header(path):

        path = Path(path)
        data = yload(path.text(encoding='utf8'))

        return data['header']
Exemple #17
0
def find_latest_trmt(folder: Path or str):
    return natsorted(
        [Path(f).abspath() for f in Path(folder).listdir('TRMT_*.miz')]).pop()
Exemple #18
0
import os
import subprocess
import sys
from json import loads

import click
from natsort.natsort import natsorted

from utils.custom_logging import make_logger, DEBUG, INFO
from utils.custom_path import Path

__version__ = None

if hasattr(sys, 'frozen'):
    __version__ = Path(sys.executable).get_win32_file_info().file_version
elif os.environ.get('APPVEYOR'):
    __version__ = loads(
        subprocess.check_output([
            r'C:\ProgramData\chocolatey\bin\gitversion.exe'
        ]).decode().rstrip()).get('FullSemVer')
else:
    # This is a potential security breach, but I'm leaving it as is as it should only be running scripted
    __version__ = loads(
        subprocess.check_output(['gitversion'
                                 ]).decode().rstrip()).get('FullSemVer')

__guid__ = '4ae6dbb7-5b26-28c6-b797-2272f5a074f3'

__appname__ = 'TEMP'

logger = make_logger(__name__, ch_level=INFO)
Exemple #19
0
 def parse_single_result(self) -> Path or None:
     if self.exec():
         result = self.selectedFiles()[0]
         return Path(result)
     else:
         return None
Exemple #20
0
 def parse_multiple_results(self) -> typing.List[Path] or None:
     if self.exec():
         results = [Path(x) for x in self.selectedFiles()[0]]
         return results
     else:
         return None
Exemple #21
0
 def auto_src_path(self) -> Path or None:
     t = self.auto_src_le.text()
     if len(t) > 3:
         return Path(t)
     return None
Exemple #22
0
 def single_miz_output_folder_path(self) -> Path or None:
     t = self.single_miz_output_folder.text()
     if len(t) > 3:
         return Path(t)
     return None