Ejemplo n.º 1
0
def osDependentPreparation():
    config = Project.Config()
    binarycreator_path = config['qtifw']['binarycreator_path']
    if os.path.exists(binarycreator_path):
        return ()
    os_name = config['os']['name']
    message = "prepare for os '{0}'".format(os_name)
    if os_name == 'osx':
        try:
            Functions.attachDmg(config['qtifw']['setup']['download_path'])
        except Exception as exception:
            BasicFunctions.printFailMessage(message, exception)
            sys.exit()
        else:
            BasicFunctions.printSuccessMessage(message)
    elif os_name == 'linux':
        try:
            Functions.setEnvVariable("QT_QPA_PLATFORM", "minimal")
            Functions.addReadPermission(config['qtifw']['setup']['exe_path'])
        except Exception as exception:
            BasicFunctions.printFailMessage(message, exception)
            sys.exit()
        else:
            BasicFunctions.printSuccessMessage(message)
    else:
        message = "* No preparation needed for os '{0}'".format(os_name)
        print(message)
Ejemplo n.º 2
0
def createInstallerSourceDir():
    message = "create installer source directory"
    try:
        config = Project.Config()
        Functions.createFile(path=config['installer']['config_xml_path'],
                             content=installerConfigXml())
        Functions.copyFile(
            source=config['installer']['config_control_script']['path'],
            destination=config['installer']['config_dir_path'])
        Functions.createFile(path=config['installer']['package_xml_path'],
                             content=installerPackageXml())
        Functions.copyFile(
            source=config['installer']['package_install_script']['path'],
            destination=config['installer']['packages_meta_path'])
        Functions.copyFile(
            source=config['app']['license']['file_path'],
            destination=config['installer']['packages_meta_path'])
        Functions.createDir(config['installer']['packages_data_path'])
        Functions.moveDir(
            source=config['app']['freezed']['path'],
            destination=config['installer']['packages_data_path'])
        Functions.moveDir(
            source=config['project']['subdirs']['examples']['path'],
            destination=config['installer']['packages_data_path'])
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 3
0
def installerConfigXml():
    message = "create config.xml content"
    try:
        config = Project.Config()
        os_name = config['os']['name']
        app_name = config['app']['name']
        if os_name == 'osx':
            target_dir = '/Applications/{0}'.format(
                app_name
            )  # macOS returns $HOME/Applications instead of /Applications for @ApplicationsDir@: https://bugreports.qt.io/browse/QTIFW-1011
        elif os_name == 'windows':
            target_dir = '@ApplicationsDir@\\{0}'.format(app_name)
        elif os_name == 'linux':
            target_dir = '@ApplicationsDir@/{0}'.format(app_name)
        else:
            BasicFunctions.printFailMessage(
                "Unsupported os '{0}'".format(os_name))
            sys.exit()
        pydict = {
            'Installer': {
                'Name':
                config['app']['name'],
                'Version':
                config['release']['version'],
                'Title':
                config['app']['name'],
                'Publisher':
                config['app']['name'],
                'ProductUrl':
                config['app']['url'],
                #'Logo': 'logo.png',
                #'WizardStyle': 'Classic',#'Aero',
                'StartMenuDir':
                config['app']['name'],
                'TargetDir':
                target_dir,
                'MaintenanceToolName':
                '{0}{1}'.format(config['app']['name'], 'Uninstaller'),
                'AllowNonAsciiCharacters':
                'true',
                'AllowSpaceInPath':
                'true',
                'InstallActionColumnVisible':
                'false',
                'ControlScript':
                config['installer']['config_control_script']['name'],
            }
        }
        raw_xml = Functions.dict2xml(pydict)
        pretty_xml = raw_xml  #xml.dom.minidom.parseString(raw_xml).toprettyxml()
        #raw_xml = html.fromstring(raw_xml)
        #raw_xml = etree.tostring(raw_xml, xml_declaration=False, encoding='unicode', pretty_print=True)#.decode()
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
        return pretty_xml
Ejemplo n.º 4
0
def moveDir(source, destination):
    message = "move dir to '{0}'".format(source, os.path.join(os.path.basename(source), destination))
    try:
        shutil.move(source, destination)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 5
0
def copyFile(source, destination):
    message = "copy file to '{0}'".format(source, os.path.join(os.path.basename(source), destination))
    try:
        shutil.copy2(source, destination, follow_symlinks=True)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 6
0
def createDir(path):
    message = "create dir '{0}'".format(path)
    try:
        os.mkdir(path)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 7
0
def addReadPermission(file):
    message = "add read permissions to '{0}'".format(file)
    try:
        BasicFunctions.run('chmod', 'a+x', file)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 8
0
def setEnvVariable(name, value):
    message = "set environment variable '{0}' to '{1}'".format(name, value)
    try:
        os.environ[name] = value
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 9
0
def attachDmg(file):
    message = "attach '{0}'".format(file)
    try:
        BasicFunctions.run('hdiutil', 'attach', file)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 10
0
def createSnapcraftDir(dir_name):
    message = "create snapcraft dir '{}'".format(dir_name)
    try:
        BasicFunctions.run('mkdir', dir_name)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 11
0
def upgradePip():
    message = "upgrade PIP"
    try:
        BasicFunctions.run('python', '-m', 'pip', 'install', '--upgrade', 'pip')
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 12
0
def install(*packages):
    for package in packages:
        message = "install '{}'".format(package)
        try:
            BasicFunctions.run('pip', 'install', package)
        except Exception as exception:
            BasicFunctions.printFailMessage(message, exception)
            sys.exit()
        else:
            BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 13
0
def extractCertificates():
    message = "extract certificates"
    try:
        BasicFunctions.run('tar', 'xvf', 'Certificates/snapCredentials.tar',
                           '-C', 'Certificates')
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 14
0
def installFromGit(owner, repo, branch, egg):
    url = "git://github.com/{0}/{1}.git@{2}#egg={3}".format(owner, repo, branch, egg)
    message = "install from '{}'".format(url)
    try:
        BasicFunctions.run('pip', 'install', '-e', url, exit_on_error=False)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        # sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 15
0
def downloadFile(url, destination):
    message = "download from '{0}'".format(url)
    try:
        file = requests.get(url, allow_redirects=True)
        open(destination, 'wb').write(file.content)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 16
0
def loadDockerImage(downloaded_image_path):
    message = "load docker image from '{}'".format(downloaded_image_path)
    try:
        #os.system('docker load < .soft/snap.tar.gz')
        os.system('gzip -dc {} | docker load'.format(downloaded_image_path))
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 17
0
def moveCertificates(dir_name):
    message = "move certificates to '{}'".format(dir_name)
    try:
        BasicFunctions.run('mv', 'Certificates/snapCredentialsEdge',
                           dir_name + '/snapcraft.cfg')
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 18
0
def installFromGit(owner, repo, branch):
    url = "https://github.com/{0}/{1}/archive/{2}.zip".format(
        owner, repo, branch)
    message = "install from '{}'".format(url)
    try:
        BasicFunctions.run('pip', 'install', url)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 19
0
def createFile(path, content):
    message = "create file '{0}'".format(path)
    try:
        dir = os.path.dirname(path)
        os.makedirs(dir, exist_ok=True)
        with open(path, "w") as file:
            file.write(content)
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 20
0
def installSilently(installer, silent_script):
    message = "install '{0}'".format(installer)
    try:
        BasicFunctions.run(
            installer,
            '--script', silent_script,
            '--no-force-installations'
            )
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 21
0
def createInstallerFile():
    message = "create installer file"
    try:
        config = Project.Config()
        BasicFunctions.run(config['qtifw']['binarycreator_path'], '--verbose',
                           '--offline-only', '-c',
                           config['installer']['config_xml_path'], '-p',
                           config['installer']['packages_dir_path'], '-t',
                           config['qtifw']['installerbase_path'],
                           config['app']['installer']['exe_path'])
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 22
0
def decryptCertificates():
    message = "decrypt certificates"
    try:
        BasicFunctions.run(
            'openssl', 'aes-256-cbc', '-K',
            BasicFunctions.environmentVariable('encrypted_d23b8f89b93f_key'),
            '-iv',
            BasicFunctions.environmentVariable('encrypted_d23b8f89b93f_iv'),
            '-in', 'Certificates/snapCredentials.tar.enc', '-out',
            'Certificates/snapCredentials.tar', '-d')
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 23
0
def installerPackageXml():
    message = "create package.xml content"
    try:
        config = Project.Config()
        pydict = {
            'Package': {
                'DisplayName':
                config['app']['name'],
                'Description':
                config['app']['description'],
                'Version':
                config['release']['version'],
                'ReleaseDate':
                datetime.datetime.strptime(config['release']['date'],
                                           "%d %b %Y").strftime("%Y-%m-%d"),
                'Default':
                'true',
                'Essential':
                'true',
                'ForcedInstallation':
                'true',
                #'RequiresAdminRights': 'true',
                'Licenses':
                '_LICENCE_STR',
                #{
                #    'License': {
                #        'name': "GNU Lesser General Public License v3.0",
                #        'file': "LICENSE"
                #    }
                ##	<License name="GNU Lesser General Public License v3.0" file="LICENSE" /> # SHOULD BE IN THIS FORMAT
                #},
                'Script':
                config['installer']['package_install_script']['name'],
            }
        }
        raw_xml = Functions.dict2xml(pydict)
        pretty_xml = raw_xml  # xml.dom.minidom.parseString(raw_xml).toprettyxml()
        #pretty_xml = xml.dom.minidom.parseString(raw_xml).toprettyxml()
        pretty_xml = pretty_xml.replace(
            '_LICENCE_STR',
            '<License name="GNU Lesser General Public License v3.0" file="LICENSE" />'
        )
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
        return pretty_xml
Ejemplo n.º 24
0
def saveDockerImage(docker_image, downloaded_image_path):
    message = "save docker image '{}'".format(docker_image)
    if os.path.exists(downloaded_image_path):
        message = "* Docker image '{0}' for snapcraft is already downloaded to '{1}'".format(
            docker_image, downloaded_image_path)
        print(message)
        return ()
    try:
        os.system('docker pull {}'.format(docker_image))
        os.system('docker save {0} | gzip > {1}'.format(
            docker_image, downloaded_image_path))
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 25
0
def createExamplesResource():
    message = "create examples resource file"
    try:
        config = Project.Config()
        project_dir_path = config['project']['dir_path']
        BasicFunctions.run(
            'pyside2-rcc',
            '{0}/App/Examples.qrc'.format(project_dir_path),
            '-o', '{0}/App/Examples.py'.format(project_dir_path),       # Write output to file rather than stdout
            '-no-compress'                                              # Disable all compression
            )
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 26
0
def freezeApp():
    message = "freeze app"
    try:
        config = Project.Config()
        os_name = config['os']['name']
        app_name = config['app']['name']
        project_name = config['project']['name']
        project_dir_path = config['project']['dir_path']
        distribution_dir_path = config['project']['subdirs']['distribution'][
            'path']
        cryspy_path = config['pyinstaller']['lib_path']['cryspy']
        easyInterface_path = config['pyinstaller']['lib_path']['easyInterface']
        icon_ext = config['app']['icon']['ext'][os_name]
        separator = config['pyinstaller']['separator'][os_name]
        BasicFunctions.run(
            'pyinstaller',
            '{0}/App/{1}.py'.format(project_dir_path, project_name),
            '--name',
            project_name,  # Name to assign to the bundled app and spec file (default: first script’s basename)
            '--noconfirm',  # Replace output directory (default: SPECPATH/dist/SPECNAME) without asking for confirmation
            '--clean',  # Clean PyInstaller cache and remove temporary files before building.
            '--windowed',  # Windows and Mac OS X: do not provide a console window for standard i/o.
            '--onedir',  # Create a one-folder bundle containing an executable (default)
            '--log-level',
            'WARN',  # LEVEL may be one of DEBUG, INFO, WARN, ERROR, CRITICAL (default: INFO).
            '--distpath',
            "{0}".format(distribution_dir_path
                         ),  # Where to put the bundled app (default: ./dist)
            '--workpath',
            os.path.join(
                distribution_dir_path, 'FreezeAppTmp'
            ),  # Where to put all the temporary work files, .log, .pyz and etc. (default: ./build)
            '--add-data',
            "{0}{1}cryspy".format(cryspy_path,
                                  separator),  # Add CrysPy library
            '--add-data',
            "{0}/App{1}.".format(
                project_dir_path,
                separator),  # Add App Pythnon and QML source files
            '--icon',
            '{0}/App/QmlImports/{1}/Resources/Icons/App.{2}'.format(
                project_dir_path, project_name, icon_ext))
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 27
0
def installQtInstallerFramework():
    config = Project.Config()
    dir_path = config['qtifw']['dir_path']
    bin_dir_path = config['qtifw']['bin_dir_path']
    if os.path.exists(bin_dir_path):
        message = "* QtInstallerFramework was already installed to {}".format(
            bin_dir_path)
        print(message)
        return ()
    message = "install QtInstallerFramework to '{}'".format(dir_path)
    try:
        Functions.installSilently(
            installer=config['qtifw']['setup']['exe_path'],
            silent_script=config['scripts']['silent_install'])
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 28
0
def downloadQtInstallerFramework():
    config = Project.Config()
    download_path = config['qtifw']['setup']['download_path']
    if os.path.exists(download_path):
        message = "* QtInstallerFramework was already downloaded to {}".format(
            download_path)
        print(message)
        return ()
    message = "download QtInstallerFramework"
    try:
        config = Project.Config()
        Functions.downloadFile(
            url=config['qtifw']['setup']['download_url'],
            destination=config['qtifw']['setup']['download_path'])
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 29
0
def runDockerImage(docker_image, project_dir_path, branch):
    message = "push release 'edge' for branch '{}'".format(branch)
    try:
        BasicFunctions.run(
            'docker',
            'run',
            '--volume',
            '{}:/easyDiffraction'.format(
                project_dir_path),  # Bind mount a volume
            '--tty',  # Allocate a pseudo-TTY
            docker_image,
            'sh',
            '-c',
            "apt update -qq && cd /easyDiffraction && snapcraft && snapcraft push *.snap --release edge"
        )
    except Exception as exception:
        BasicFunctions.printFailMessage(message, exception)
        sys.exit()
    else:
        BasicFunctions.printSuccessMessage(message)
Ejemplo n.º 30
0
def osDependentAddons():
    config = Project.Config()
    os_name = config['os']['name']
    app_name = config['app']['name']
    distribution_dir_path = config['project']['subdirs']['distribution'][
        'path']
    if os_name == 'osx':
        message = "add hidpi support ({0})".format(os_name)
        try:
            BasicFunctions.run(
                'plutil', '-insert', 'NSHighResolutionCapable', '-bool', 'YES',
                '{0}/{1}.app/Contents/Info.plist'.format(
                    distribution_dir_path, app_name))
        except Exception as exception:
            BasicFunctions.printFailMessage(message, exception)
            sys.exit()
        else:
            BasicFunctions.printSuccessMessage(message)
    elif os_name == 'linux':
        message = "copy missing EGL and GLX plugins ({0})".format(os_name)
        try:
            missing_plugins = config['pyinstaller']['missing_plugins'][os_name]
            pyside2_path = config['pyinstaller']['lib_path']['pyside2']
            app_plugins_path = os.path.join(distribution_dir_path, app_name,
                                            'PySide2', 'plugins')
            for relative_dir_path in missing_plugins:
                src_dir_name = os.path.basename(relative_dir_path)
                src_dir_path = os.path.join(pyside2_path, relative_dir_path)
                dst_dir_path = os.path.join(app_plugins_path, src_dir_name)
                print("< src:", src_dir_path)
                print("> dst:", app_plugins_path)
                dir_util.copy_tree(src_dir_path, dst_dir_path)
        except Exception as exception:
            BasicFunctions.printFailMessage(message, exception)
            sys.exit()
        else:
            BasicFunctions.printSuccessMessage(message)
    else:
        message = "* No addons needed for os '{0}'".format(os_name)
        print(message)