From bf747ab6a5a8d8bf9384408e8ffb299f0735c554 Mon Sep 17 00:00:00 2001 From: Scott Bahling Date: Fri, 7 Feb 2020 00:24:38 +0100 Subject: Add get_package_source_version() --- obsapi/core.py | 37 ++++++++++++++++++++++++++++++++++--- obsapi/helpers.py | 7 +++++++ test/test_api.py | 23 +++++++++++++++++++++++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/obsapi/core.py b/obsapi/core.py index 793949e..132c06b 100644 --- a/obsapi/core.py +++ b/obsapi/core.py @@ -25,6 +25,7 @@ EMPTYTREE = etree.fromstring(emptyxml) EMPTY = EMPTYTREE.xpath('.')[0] xml2etree = helpers.xml2etree +as_string = helpers.as_string class ObsApi(object): @@ -72,7 +73,7 @@ class ObsApi(object): if xml is None: return (Directory(None, None, None, None), []) - d = etree.fromstring(xml) + d = xml2etree(xml) directory = Directory(d.get('name'), d.get('rev'), d.get('vrev'), @@ -154,6 +155,33 @@ class ObsApi(object): return version + def get_package_source_version(self, prj, pkg, full=True): + spec_version_re = re.compile(r'Version:\s*(.+?)[\s]') + spec_release_re = re.compile(r'Release:\s*(.+?)[\s]') + spec_content = '' + spec_file = None + spec_files = self.get_spec_files(prj, pkg, filenames=True) + if len(list(spec_files)) == 1: + spec_file = spec_files.next + else: + for sf in self.get_spec_files(prj, pkg, filenames=True): + if sf.startswith(pkg): + spec_file = sf + + if not spec_file: + return '' + + spec_content = as_string(self.source.get(prj, pkg, spec_file)) + try: + version = spec_version_re.search(spec_content).group(1) + release = spec_release_re.search(spec_content).group(1) + if full: + version = '%s-%s' % (version, release) + except Exception: + version = '' + + return version + def get_build_config(self, prj, repo): return self.build.get_buildconfig(prj, repo) @@ -280,7 +308,7 @@ class ObsApi(object): etree.SubElement(meta, 'group', groupid=groupid, role=role) return self.put_meta(prj, pkg, etree.tostring(meta)) - def get_spec_files(self, prj, pkg=None): + def get_spec_files(self, prj, pkg=None, filenames=False): if pkg is not None: pkgs = [pkg] else: @@ -289,7 +317,10 @@ class ObsApi(object): d, flist = self.ls(prj, pkg) for srcfile in flist: if srcfile.name.endswith('.spec'): - yield self.source.get(prj, pkg, srcfile.name) + if filenames: + yield srcfile.name + else: + yield self.source.get(prj, pkg, srcfile.name) def __flag_to_params(self, flag): try: diff --git a/obsapi/helpers.py b/obsapi/helpers.py index 6912035..be20a31 100644 --- a/obsapi/helpers.py +++ b/obsapi/helpers.py @@ -21,3 +21,10 @@ def xml2etree(xml): return etree.parse(BytesIO(xml), parser).xpath('.')[0] except Exception as e: raise e + + +def as_string(obj): + if isinstance(obj, bytes): + return obj.decode('utf-8') + else: + return str(obj) diff --git a/test/test_api.py b/test/test_api.py index a6f74c1..405c0d6 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -364,6 +364,29 @@ def test_get_package_version(requests_mock, binarylist, binary_fileinfo): assert version == expected_version +def test_get_package_source_version(requests_mock, package_directory, spec_file_1): + matcher = re.compile('/source/.*/.*') + requests_mock.get(matcher, text=package_directory) + matcher = re.compile('/source/.*/.*/.*') + requests_mock.get(matcher, content=spec_file_1) + + specfile = spec_file_1.decode('utf-8').splitlines() + full_version = api.get_package_source_version(prj, 'package') + print(full_version) + version, release = full_version.split('-') + match_version = False + match_release = False + for line in specfile: + if line.strip().startswith('Version'): + assert version in line + match_version = True + if line.strip().startswith('Release'): + assert release in line + match_release = True + + assert match_version and match_release + + def test_get_project_flags(requests_mock, project_meta): matcher = prj_meta_re requests_mock.get(matcher, text=project_meta) -- cgit v1.2.3