summaryrefslogtreecommitdiff
path: root/obsapi
diff options
context:
space:
mode:
authorScott Bahling <sbahling@suse.com>2020-01-26 00:53:21 +0100
committerScott Bahling <sbahling@suse.com>2020-01-26 00:53:21 +0100
commitf728ee98064776a186a154e6c931ec3c87719b98 (patch)
tree4860d6698be2fdb8d458a5066c737bcfb06c1379 /obsapi
parent488fe5d1b1eabbf971cfacc573401e53e88274f1 (diff)
downloadobsapi-f728ee98064776a186a154e6c931ec3c87719b98.tar.gz
obsapi-f728ee98064776a186a154e6c931ec3c87719b98.tar.xz
obsapi-f728ee98064776a186a154e6c931ec3c87719b98.zip
Add RepoFlags class and api.get_repo_flags method
Diffstat (limited to 'obsapi')
-rw-r--r--obsapi/core.py4
-rw-r--r--obsapi/repoflags.py99
2 files changed, 103 insertions, 0 deletions
diff --git a/obsapi/core.py b/obsapi/core.py
index f09ce3b..8845016 100644
--- a/obsapi/core.py
+++ b/obsapi/core.py
@@ -7,6 +7,7 @@ from datetime import datetime
from obsapi.sourceapi import ObsSourceApi
from obsapi.buildapi import ObsBuildApi
from obsapi.formatter import Formatter
+from obsapi.repoflags import RepoFlags
LSItem = namedtuple('LSItem', 'name md5 size mtime')
@@ -298,6 +299,9 @@ class ObsApi(object):
return vendor
+ def get_repo_flags(self, flag_type, prj, pkg=None):
+ return RepoFlags(flag_type, self.get_meta(prj, pkg))
+
def locked(self, prj, pkg=None):
meta = self.__xml2etree(self.get_meta(prj, pkg))
if meta.find('lock') is not None:
diff --git a/obsapi/repoflags.py b/obsapi/repoflags.py
new file mode 100644
index 0000000..062f0e3
--- /dev/null
+++ b/obsapi/repoflags.py
@@ -0,0 +1,99 @@
+from lxml import etree
+from collections import namedtuple
+
+
+RepoFlag = namedtuple('RepoFlag', 'setting repo arch')
+valid_flag_types = ('build', 'publish', 'useforbuild', 'debuginfo')
+
+
+class RepoFlags():
+
+ def __init__(self, flag_type=None, xml=None):
+
+ self.flag_type = flag_type
+ self.root = None
+
+ if isinstance(xml, (str,)):
+ try:
+ self.import_xml(xml)
+ except Exception:
+ raise Exception('Failed to import xml')
+ elif isinstance(xml, etree._Element):
+ self.root = xml
+
+ if self.flag_type is None and self.root is None:
+ self.flag_type = 'build'
+
+ self.__verify()
+
+ def import_xml(self, xml):
+ try:
+ self.root = etree.fromstring(xml)
+ except Exception as e:
+ raise e
+
+ def __verify(self):
+ """ Make sure flag_type and xml data match.
+ """
+
+ # if self.flag_type set, ensure it matches the tag of the root xml
+ # element. If not matching, try to find the matching element within
+ # the xml tree and set root to that. If not found, set root to a new
+ # empty tree based on the flag_type
+ if self.flag_type is not None:
+ if self.flag_type not in valid_flag_types:
+ raise ValueError('Invalid repo flag type %s' % self.flag_type)
+ if self.root is None:
+ self.root = etree.Element(self.flag_type)
+ return
+ if self.flag_type == self.root.tag:
+ return
+
+ element = self.root.find(self.flag_type)
+ if element is not None:
+ self.root = element
+ return
+
+ # If flag_type is not set, set it to the root element tag
+ flag_type = self.root.tag
+ if flag_type in valid_flag_types:
+ return
+
+ # if root element is not a valid repo flag type, search for the
+ # first element that is a valid flag type and use it.
+ for flag_type in valid_flag_types:
+ element = self.root.find(flag_type)
+ if element is not None:
+ self.flag_type = flag_type
+ self.root = element
+ return
+
+ self.flag_type = 'build'
+ self.root = etree.Element(self.flag_type)
+
+ @property
+ def flags(self):
+ for element in self.root:
+ if element.tag not in ['enable', 'disable']:
+ continue
+ setting = element.tag
+ repo = element.get('repository', None)
+ arch = element.get('arch', None)
+ yield(RepoFlag(setting=setting, repo=repo, arch=arch))
+
+ def set(self, setting, repo=None, arch=None):
+ if setting not in ['enable', 'disable']:
+ raise ValueError('Invalid Flag Setting %s' % setting)
+
+ element = etree.Element(setting)
+ if repo:
+ element.set('repository', repo)
+ if arch:
+ element.set('arch', arch)
+ self.root.append(element)
+
+ def enable(self, repo=None, arch=None):
+ self.set('enable', repo, arch)
+
+ def disable(self, repo=None, arch=None):
+ self.set('disable', repo, arch)