From 142a09df14aa8390972478f21de3235783e3191d Mon Sep 17 00:00:00 2001 From: Emiliano Vavassori Date: Sat, 2 Dec 2023 03:00:46 +0100 Subject: [PATCH] Code for passing also a date for daily builds. Possibly blocked by cli command. --- loaih/__init__.py | 98 ++++++++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 36 deletions(-) diff --git a/loaih/__init__.py b/loaih/__init__.py index 4c711ac..3f23772 100644 --- a/loaih/__init__.py +++ b/loaih/__init__.py @@ -1,12 +1,15 @@ #!/usr/bin/env python # encoding: utf-8 +"""Machinery for compiling new versions of AppImages.""" import urllib.request import datetime +import re from lxml import etree from packaging.version import parse as parse_version -class Definitions(): + +class Definitions(): # pylint: disable=too-few-public-methods """Definitions for the module.""" DOWNLOADPAGE = "https://www.libreoffice.org/download/download/" @@ -49,14 +52,15 @@ class Base(): # Fixing daily selector # As seen, the number of the tinderbox building the daily version can # change. We try to fulfill the void by adding a step. - tinderboxpage = etree.HTML(urllib.request.urlopen(Definitions.DAILY).read()) - tburl = tinderboxpage.xpath( - "//td/a[starts-with(text(), 'Linux-rpm_deb-x86') and contains(text(), 'TDF/')]/text()" - )[0] + tinderboxpage = etree.HTML(#pylint: disable=c-extension-no-member + urllib.request.urlopen(Definitions.DAILY).read() #pylint: disable=consider-using-with + ) + xpath = "//td/a[starts-with(text(), 'Linux-rpm_deb-x86') and contains(text(), 'TDF/')]/text()" #pylint: disable=line-too-long + tburl = str(tinderboxpage.xpath(xpath)[0]) daily_selector = f"{Definitions.DAILY}{tburl}" # Get the anchor for today's builds - raw_page = etree.HTML(urllib.request.urlopen(daily_selector).read()) + raw_page = etree.HTML(urllib.request.urlopen(daily_selector).read())# pylint: disable=c-extension-no-member,consider-using-with results = raw_page.xpath( @@ -79,26 +83,38 @@ class Base(): return [] # Rerun the page parsing, this time to find out the versions built - b = etree.HTML(urllib.request.urlopen(url).read()).xpath("//td/a[contains(text(), '_deb.tar.gz')]/text()") + fullpage = urllib.request.urlopen(url).read() #pylint: disable=consider-using-with + archive_path = "//td/a[contains(text(), '_deb.tar.gz')]/text()" + tarball = etree.HTML(fullpage).xpath(archive_path)#pylint: disable=c-extension-no-member # This should have returned the main package for a version, but can # have returned multiple ones, so let's treat it as a list - return [ x.split('_')[1] for x in b ] + return [ x.split('_')[1] for x in tarball ] @staticmethod def namedver(query): """Gets the version for a specific named version.""" - if query == 'daily' or query == 'yesterday': - # Daily needs double parsing for the same result to apply. - # We first select today's build anchor: - date = datetime.datetime.today() - if query == 'yesterday': - # Use yesterdays' date for testing purposes. - date += datetime.timedelta(days=-1) - return Base.dailyver(date) + if 'yesterday' in query: + return Base.dailyver(datetime.datetime.now() + datetime.timedelta(days=-1)) + + if query.startswith('daily'): + print("daily") + if '-' in query or '_' in query: + # Splitting the string + stringdate = re.sub(r'daily[-_:]', '', query) + + print(f"Stringdate: {stringdate}") + print(f"strptime: {datetime.datetime.strptime(stringdate, '%Y%m%d')}") + return Base.dailyver(datetime.datetime.strptime(stringdate, "%Y%m%d")) + + return Base.dailyver() # In case the query isn't for daily - return etree.HTML(urllib.request.urlopen(Definitions.SELECTORS[query]['URL']).read()).xpath(Definitions.SELECTORS[query]['xpath']) + return etree.HTML(#pylint: disable=c-extension-no-member + urllib.request.urlopen( + Definitions.SELECTORS[query]['URL'] + ).read() + ).xpath(Definitions.SELECTORS[query]['xpath']) @staticmethod def fullversion(version): @@ -144,9 +160,9 @@ class Base(): retval['x86'] = baseurl + 'x86/' else: retval['x86'] = '-' - + retval['x86_64'] = baseurl + 'x86_64/' - + return retval @staticmethod @@ -156,23 +172,31 @@ class Base(): if '.' in query: # Called with a numeric query. Pass it to RemoteBuild retval.append(RemoteBuild(query)) + elif '-' in query or '_' in query: + # daily but with date + # The date is the last part. + stringdate = re.split(r'[_-]', query)[-1] + querydate = datetime.datetime.strptime(stringdate, "%Y%m%d").date() + + dailyver = Base.dailyver(querydate) else: # Named query - a = Base.namedver(query) + dailyver = Base.namedver(query) - if not a: + if not dailyver: # a is empty return retval - if isinstance(a, list) and len(a) > 1: - retval.extend([ RemoteBuild(query, version) for version in a ]) + if isinstance(dailyver, list) and len(dailyver) > 1: + retval.extend([ RemoteBuild(query, version) for version in dailyver ]) else: retval.append(RemoteBuild(query)) return sorted(retval, key=lambda x: x.version) -class RemoteBuild(object): +class RemoteBuild(): + """Builds a version with checking remotely if it was not already built.""" def __init__(self, query, version = None): """Should simplify the single builded version.""" @@ -188,21 +212,22 @@ class RemoteBuild(object): # Let's check if a specific version was requested. if self.version == '': # In case it was not requested, we will carry on the generic - # namedver() query. - # If the results are more than one, we'll take the latest (since we are requested to provide a single build). - a = Base.namedver(self.query) - - if isinstance(a, list): - # if the number of versions is zero, return and exit - if not a: - return None + # namedver() query. + # If the results are more than one, we'll take the latest + # (since we are requested to provide a single build). + a_version = Base.namedver(self.query) - if len(a) == 1: + if isinstance(a_version, list): + # if the number of versions is zero, return and exit + if not a_version: + self.version = None + + if len(a_version) == 1: # version is a single one. - self.version = a[0] + self.version = a_version[0] else: # In this case, we will select the latest release. - self.version = sorted(a)[-1] + self.version = sorted(a_version)[-1] # If the version has already a version, as requested by user, # continue using that version @@ -213,10 +238,11 @@ class RemoteBuild(object): if len(str(self.version).split('.')) < 4: # If not 4 dotted, let's search for the 4 dotted version self.version = Base.fullversion(self.version) - + self.basedirurl = Base.urlfromqueryandver(self.query, self.version) def todict(self): + """Returns a dictionary of versions.""" return { 'query': self.query, 'version': self.version,