diff --git a/loaih/build.py b/loaih/build.py index 0c619d5..b42c9ff 100644 --- a/loaih/build.py +++ b/loaih/build.py @@ -10,6 +10,7 @@ import re import shlex import tempfile import urllib.request +import hashlib from lxml import etree import loaih @@ -46,7 +47,7 @@ class Build(loaih.RemoteBuild): self.portable = False self.updatable = True self.sign = True - self.repo_type = 'local' + self.remoterepo = False self.remote_host = '' self.remote_path = '' self.storage_path = '/mnt/appimage' @@ -81,16 +82,7 @@ class Build(loaih.RemoteBuild): """Calculate exclusions and other variables.""" print("--- Calculate Phase ---") - - # let's check here if we are on a remote repo or local. - if self.storage_path.startswith("http"): - # Final repository is remote - self.repo_type = 'remote' - print("Repo is remote.") - else: - self.repo_type = 'local' - print("Repo is local.") - + # AppName if self.query in { 'prerelease', 'daily' }: self.appname = 'LibreOfficeDev' @@ -134,22 +126,11 @@ class Build(loaih.RemoteBuild): if self.portable: self.relative_path.append('portable') - # Fullpath might be intended two ways: - if self.repo_type == 'remote': - # Repository is remote - # we build full_path as it is absolute to the root of the - # storage_path. - self.full_path = '/' - if len(self.relative_path) >= 1: - self.full_path += str.join('/', self.relative_path) - else: - # Repository is local - # If it is remote or if it is local - fullpath_arr = self.storage_path.split('/') - # Joining relative path only if it is not null - if len(self.relative_path) > 0: - fullpath_arr.extend(self.relative_path) - self.full_path = re.sub(r"/+", '/', str.join('/', fullpath_arr)) + fullpath_arr = self.storage_path.split('/') + # Joining relative path only if it is not null + if len(self.relative_path) > 0: + fullpath_arr.extend(self.relative_path) + self.full_path = re.sub(r"/+", '/', str.join('/', fullpath_arr)) def check(self): @@ -161,17 +142,26 @@ class Build(loaih.RemoteBuild): self.calculate() for arch in self.arch: - print(f"Searching for {self.appimagefilename[arch]}") + # First, check if by metadata the repo is remote or not. - if self.repo_type == 'remote': + if self.remoterepo or 'http' in self.storage_path: + self.remoterepo = True # Remote storage. I have to query a remote site to know if it # was already built. name = self.appimagefilename[arch] - url = self.storage_path.rstrip('/') + self.full_path + '/' + if len(self.relative_path) == 0: + path_arr = [ self.storage_path, '' ] + elif len(self.relative_path) == 1: + path_arr = [ self.storage_path, self.relative_path[0], '' ] + else: + path_arr = self.relative_path + path_arr.insert(0, self.storage_path) + + path = str.join('/', path_arr) matching = [] try: - with urllib.request.urlopen(url) as response: - matching = etree.HTML(response.read()).xpath( + with urllib.request.urlopen(path) as url: + matching = etree.HTML(url.read()).xpath( f"//a[contains(@href, '{name}')]/@href" ) @@ -185,6 +175,7 @@ class Build(loaih.RemoteBuild): else: # Repo is local + print(f"Searching for {self.appimagefilename[arch]}") command = f"find {self.full_path} -name {self.appimagefilename[arch]}" res = subprocess.run(shlex.split(command), capture_output=True, @@ -198,10 +189,11 @@ class Build(loaih.RemoteBuild): if res.stdout and len(res.stdout.strip("\n")) > 0: # All good, the command was executed fine. + print(f"Build for {self.version} found.") self.built[arch] = True if self.built[arch]: - print(f"Found requested AppImage: {self.appimagefilename[arch]}.") + print(f"The requested AppImage already exists on storage for {arch}. I'll skip downloading, building and moving the results.") def download(self): @@ -213,7 +205,7 @@ class Build(loaih.RemoteBuild): for arch in self.arch: # Checking if a valid path has been provided if self.url[arch] == '-': - print(f"Cannot build for arch {arch}. Continuing with other arches.") + print(f"No build has been provided for the requested AppImage for {arch}. Continue with other options.") # Faking already built it so to skip other checks. self.built[arch] = True continue @@ -444,10 +436,17 @@ class Build(loaih.RemoteBuild): os.chdir(self.appnamedir) # Two cases here: local and remote storage_path. - if self.repo_type == 'remote': + if self.remoterepo: # Remote first. # Build destination directory - remotepath = self.remote_path.rstrip('/') + self.full_path + if len(self.relative_path) == 0: + remotepath = str.join('/', [ self.remote_path, '' ]) + elif len(self.relative_path) == 1: + remotepath = str.join('/', [ self.remote_path, self.relative_path[0], '' ]) + else: + path_arr = self.relative_path + path_arr.insert(0, self.remote_path) + remotepath = str.join('/', path_arr) try: subprocess.run( r"rsync -rlIvz --munge-links *.AppImage* " +