summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.com>2020-02-07 00:24:38 +0100
committerScott Bahling <sbahling@suse.com>2020-02-07 00:24:38 +0100
commitbf747ab6a5a8d8bf9384408e8ffb299f0735c554 (patch)
tree0092c9b0dcc10e8d9f90a3f93249ff982fd292bf
parente566c85a508562a5ebc88e13e2d5571b78eef045 (diff)
downloadobsapi-bf747ab6a5a8d8bf9384408e8ffb299f0735c554.tar.gz
obsapi-bf747ab6a5a8d8bf9384408e8ffb299f0735c554.tar.xz
obsapi-bf747ab6a5a8d8bf9384408e8ffb299f0735c554.zip
Add get_package_source_version()
-rw-r--r--obsapi/core.py37
-rw-r--r--obsapi/helpers.py7
-rw-r--r--test/test_api.py23
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)