tag_extra table in schema report tag extras in taginfo and buildconfig --- docs/schema.sql | 16 ++++++++++++++++ hub/kojihub.py | 59 ++++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/docs/schema.sql b/docs/schema.sql index aad24a9..d5ffa87 100644 --- a/docs/schema.sql +++ b/docs/schema.sql @@ -371,6 +371,22 @@ CREATE TABLE tag_config ( UNIQUE (tag_id,active) ) WITHOUT OIDS;
+CREATE TABLE tag_extra ( + tag_id INTEGER NOT NULL REFERENCES tag(id), + key TEXT NOT NULL, + value TEXT NOT NULL, -- TODO - move this to jsonb when we can +-- versioned - see desc above + create_event INTEGER NOT NULL REFERENCES events(id) DEFAULT get_event(), + revoke_event INTEGER REFERENCES events(id), + creator_id INTEGER NOT NULL REFERENCES users(id), + revoker_id INTEGER REFERENCES users(id), + active BOOLEAN DEFAULT 'true' CHECK (active), + CONSTRAINT active_revoke_sane CHECK ( + (active IS NULL AND revoke_event IS NOT NULL AND revoker_id IS NOT NULL) + OR (active IS NOT NULL AND revoke_event IS NULL AND revoker_id IS NULL)), + PRIMARY KEY (create_event, tag_id, key), + UNIQUE (tag_id, key, active) +) WITHOUT OIDS;
-- the tag_updates table provides a mechanism to indicate changes relevant to tag -- that are not reflected in a versioned table. For example: builds changing volumes, diff --git a/hub/kojihub.py b/hub/kojihub.py index 9cc8ff2..d9dec97 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -2761,14 +2761,15 @@ def get_tag(tagInfo, strict=False, event=None): a string (the tag name) or an int (the tag ID). Returns a map containing the following keys:
- - id - - name - - perm_id (may be null) - - perm (name, may be null) - - arches (may be null) - - locked - - maven_support - - maven_include_all + - id : unique id for the tag + - name : name of the tag + - perm_id : permission id (may be null) + - perm : permission name (may be null) + - arches : tag arches (string, may be null) + - locked : lock setting (boolean) + - maven_support : maven support flag (boolean) + - maven_include_all : maven include all flag (boolean) + - extra : extra tag parameters (dictionary)
If there is no tag matching the given tagInfo, and strict is False, return None. If strict is True, raise a GenericError. @@ -2807,8 +2808,28 @@ def get_tag(tagInfo, strict=False, event=None): if strict: raise koji.GenericError, "Invalid tagInfo: %r" % tagInfo return None + result['extra'] = get_tag_extra(result) + return result + + +def get_tag_extra(tagInfo, event=None): + """ Get tag extra info (no inheritance) """ + tables = ['tag_extra'] + fields = ['key', 'value'] + clauses = [eventCondition(event, table='tag_extra'), "tag_id = %(id)i"] + query = QueryProcessor(columns=fields, tables=tables, clauses=clauses, values=tagInfo, + opts={'asList': True}) + result = {} + for key, value in query.execute(): + try: + value = simplejson.loads(value) + except Exception: + # this should not happen + raise koji.GenericError("Invalid tag extra data: %s : %r", key, value) + result[key] = value return result
+ def edit_tag(tagInfo, **kwargs): """Edit information for an existing tag.
@@ -8755,17 +8776,17 @@ class RootExports(object): def getBuildConfig(self,tag,event=None): """Return build configuration associated with a tag""" taginfo = get_tag(tag,strict=True,event=event) - arches = taginfo['arches'] - if arches is None: - #follow inheritance for arches - order = readFullInheritance(taginfo['id'],event=event) - for link in order: - if link['noconfig']: - continue - arches = get_tag(link['parent_id'],strict=True,event=event)['arches'] - if arches is not None: - taginfo['arches'] = arches - break + order = readFullInheritance(taginfo['id'], event=event) + #follow inheritance for arches and extra + for link in order: + if link['noconfig']: + continue + ancestor = get_tag(link['parent_id'], strict=True, event=event) + if taginfo['arches'] is None and ancestor['arches'] is not None: + taginfo['arches'] = ancestor['arches'] + for key in ancestor['extra']: + if key not in taginfo['extra']: + taginfo['extra'][key] = ancestor['extra'][key] return taginfo
def getRepo(self,tag,state=None,event=None):