From 544d805b5018f3c12ef4bf551112ac636e43eae7 Mon Sep 17 00:00:00 2001 From: Emiliano Vavassori Date: Thu, 31 Mar 2022 01:50:15 +0200 Subject: [PATCH] =?UTF-8?q?Commit=20con=20funzionalit=C3=A0=20di=20firma?= =?UTF-8?q?=20complete.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- loaih/__init__.py | 59 +++++++++++++++++++++++++--------------- scripts/loaih-build | 66 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 89 insertions(+), 36 deletions(-) diff --git a/loaih/__init__.py b/loaih/__init__.py index 12b9154..1c64989 100644 --- a/loaih/__init__.py +++ b/loaih/__init__.py @@ -20,11 +20,14 @@ class Build(object): self.offline_help = False self.portable = False self.updatable = True + self.sign = False self.storage_path = '/srv/http/appimage.sys42.eu' self.download_path = '/var/tmp/downloads' + + # Specific build version self.appversion = '' - self.appimagefilename = {} self.genappversion = '' + self.appimagefilename = {} self.genappimagefilename = {} # Getting versions and so on @@ -45,6 +48,26 @@ class Build(object): self.relative_path = [] self.full_path = '' + def version_strings(self): + """Build version strings based on the information received.""" + # Building expected AppImageName + self.languagepart = "." + if ',' in self.language: + self.languagepart += self.language.replace(',', '-') + else: + self.languagepart += self.language + + self.helppart = '.help' if self.offline_help else '' + + # If the build was called by queried name, build from latest release available but build with the most generic name + self.appversion = self.version + self.languagepart + self.helppart + myver = str.join('.', self.version.split('.')[0:2]) + self.genappversion = myver + self.languagepart + self.helppart + for arch in ARCHSTD: + self.appimagefilename[arch] = self.appname + '-' + self.appversion + f'-{arch}.AppImage' + self.genappimagefilename[arch] = self.appname + '-' + self.genappversion + f'-{arch}.AppImage' + + def check(self, storage_path): """Checking if the requested AppImage has been already built.""" # Mandate to the private function to calculate the full_path available @@ -62,22 +85,8 @@ class Build(object): # to build an updatable version. self.updatable = False - # Building expected AppImageName - self.languagepart = "." - if ',' in self.language: - self.languagepart += self.language.replace(',', '-') - else: - self.languagepart += self.language - - self.helppart = '.help' if self.offline_help else '' - - # If the build was called by queried name, build from latest release available but build with the most generic name - myver = str.join('.', self.version.split('.')[0:2]) - self.genappversion = myver + self.languagepart + self.helppart - self.appversion = self.version + self.languagepart + self.helppart - for arch in ARCHSTD: - self.genappimagefilename[arch] = self.appname + '-' + self.genappversion + f'-{arch}.AppImage' - self.appimagefilename[arch] = self.appname + '-' + self.appversion + f'-{arch}.AppImage' + # Call the build for queries + self.version_strings() for arch in self.arch: # For generalized builds, we need to check if there are .ver file @@ -193,7 +202,8 @@ class Build(object): os.chmod('appimagetool', 0o755) # Build the requested version. - if self.queried_name: + if self.queried_name and not self.portable: + # If it is portable, do not generate a generalized version self.__unpackbuild__(arch, True) self.__unpackbuild__(arch) @@ -274,22 +284,27 @@ class Build(object): # updatable version. # zsync name was generated already + # Dealing with extra options + buildopts = [] + if self.sign: + buildopts.append('--sign') + # If asked to do a generalized build: if generalize: - subprocess.run("VERSION={version} ./appimagetool -u 'zsync|{zsync}' -v ./{appname}.AppDir/".format(version = self.genappversion, zsync = self.genappimagefilename[arch] + '.zsync', appname = self.appname), shell=True) + subprocess.run("VERSION={version} ./appimagetool {buildopts} -u 'zsync|{zsync}' -v ./{appname}.AppDir/".format(version = self.genappversion, buildopts = str.join(' ', buildopts), zsync = self.genappimagefilename[arch] + '.zsync', appname = self.appname), shell=True) # Build version file management with open(self.genappimagefilename[arch] + '.ver', 'w') as v: v.write(self.version) else: - subprocess.run("VERSION={version} ./appimagetool -u 'zsync|{zsync}' -v ./{appname}.AppDir/".format(version = self.appversion, zsync = self.appimagefilename[arch] + '.zsync', appname = self.appname), shell=True) + subprocess.run("VERSION={version} ./appimagetool {buildopts} -u 'zsync|{zsync}' -v ./{appname}.AppDir/".format(version = self.appversion, buildopts = str.join(' ', buildopts), zsync = self.appimagefilename[arch] + '.zsync', appname = self.appname), shell=True) else: if generalize: - subprocess.run("VERSION={version} ./appimagetool -v ./{appname}.AppDir/".format(version = self.genappversion, appname = self.appname), shell=True) + subprocess.run("VERSION={version} ./appimagetool {buildopts} -v ./{appname}.AppDir/".format(version = self.genappversion, buildopts = str.join(' ', buildopts), appname = self.appname), shell=True) with open(self.genappimagefilename[arch] + '.ver', 'w') as v: v.write(self.version) else: - subprocess.run("VERSION={version} ./appimagetool -v ./{appname}.AppDir/".format(version = self.appversion, appname = self.appname), shell=True) + subprocess.run("VERSION={version} ./appimagetool {buildopts} -v ./{appname}.AppDir/".format(version = self.appversion, buildopts = str.join(' ', buildopts), appname = self.appname), shell=True) print("Built AppImage version {version}".format(version = self.appversion)) diff --git a/scripts/loaih-build b/scripts/loaih-build index 8139578..76de886 100644 --- a/scripts/loaih-build +++ b/scripts/loaih-build @@ -2,6 +2,7 @@ # encoding: utf-8 import click +import yaml import loaih @click.command() @@ -12,7 +13,7 @@ import loaih @click.option('-o/-O', '--offline-help/--no-offline-help', 'offline', default = False, help="Include or not the offline help for the chosen languages. Default: no offline help") @click.option('-p/-P', '--portable/--no-portable', 'portable', default = False, help="Create a portable version of the AppImage or not. Default: no portable") @click.option('-r', '--repo-path', 'repo_path', default = '/srv/http/appimage.sys42.eu', type=str, help="Path to the final storage of the AppImage. Default: /srv/http/appimage.sys42.eu") -@click.option('-s/-S', '--sign/--no-sign', 'sign', default=False, help="Whether to sign the build. Default: no-sign") +@click.option('-s/-S', '--sign/--no-sign', 'sign', default=False, help="Wether to sign the build. Default: no-sign") @click.option('-u/-U', '--updatable/--no-updatable', 'updatable', default = True, help="Create an updatable version of the AppImage or not. Default: updatable") @click.argument('query') def build(arch, language, offline, portable, updatable, download_path, repo_path, check, sign, query): @@ -24,23 +25,60 @@ def build(arch, language, offline, portable, updatable, download_path, repo_path else: arches = [ arch.lower() ] - obj = loaih.Build(query, arches) + if query.endswith('.yml') or query.endswith('.yaml'): + # This is a buildfile. So we have to load the file and pass the build options ourselves. + config = {} + with open(query, 'r') as file: + config = yaml.safe_load(file) - obj.language = language - obj.offline_help = offline - obj.portable = portable - obj.updatable = updatable + # With the config file, we ignore all the command line options and set + # generic default. + for build in config['builds']: + # Loop a run for each build. + obj = loaih.Build(build['query'], arches) + + obj.language = build['language'] + obj.offline_help = build['offline_help'] + obj.portable = build['portable'] + obj.updatable = True + + if 'sign' in config['data'] and config['data']['sign']: + obj.sign = True + + if 'force' in config['data'] and config['data']['force']: + obj.storage_path = config['data']['repo'] + obj.version_strings() + else: + obj.check(config['data']['repo']) + + obj.download(config['data']['download']) + obj.build() + obj.checksums() + obj.publish() + del obj - if check: - obj.check(repo_path) else: - obj.storage_path = repo_path + obj = loaih.Build(query, arches) - obj.download(download_path) - obj.build() - obj.checksums() - obj.publish() - del obj + obj.language = language + obj.offline_help = offline + obj.portable = portable + obj.updatable = updatable + + if sign: + obj.sign = True + + if check: + obj.check(repo_path) + else: + obj.storage_path = repo_path + obj.version_strings() + + obj.download(download_path) + obj.build() + obj.checksums() + obj.publish() + del obj if __name__ == '__main__': build()