From 944d105571acb3fafc8dbeb277bd5015beac05c6 Mon Sep 17 00:00:00 2001 From: Yuming Zhu Date: Fri, 28 Feb 2020 02:20:43 +0800 Subject: [PATCH] hub: editTagExternalRepo is able to set merge_mode fixes: #1857 --- docs/schema-upgrade-1.20-1.21.sql | 4 ++++ docs/schema.sql | 2 +- hub/kojihub.py | 25 +++++++++++++++++++++---- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/docs/schema-upgrade-1.20-1.21.sql b/docs/schema-upgrade-1.20-1.21.sql index 5e09f715..0cce0ddf 100644 --- a/docs/schema-upgrade-1.20-1.21.sql +++ b/docs/schema-upgrade-1.20-1.21.sql @@ -13,4 +13,8 @@ CREATE OR REPLACE FUNCTION get_event() RETURNS INTEGER AS ' SELECT currval(''events_id_seq'')::INTEGER; ' LANGUAGE SQL; +-- merge_mode can not be null +UPDATE tag_external_repos SET merge_mode = 'koji' WHERE merge_mode is NULL; +ALTER TABLE tag_external_repos ALTER COLUMN merge_mode SET NOT NULL; + COMMIT; diff --git a/docs/schema.sql b/docs/schema.sql index 52676464..dc0d38f6 100644 --- a/docs/schema.sql +++ b/docs/schema.sql @@ -484,7 +484,7 @@ create table tag_external_repos ( tag_id INTEGER NOT NULL REFERENCES tag(id), external_repo_id INTEGER NOT NULL REFERENCES external_repo(id), priority INTEGER NOT NULL, - merge_mode TEXT DEFAULT 'koji', + merge_mode TEXT NOT NULL DEFAULT 'koji', -- versioned - see earlier description of versioning create_event INTEGER NOT NULL REFERENCES events(id) DEFAULT get_event(), revoke_event INTEGER REFERENCES events(id), diff --git a/hub/kojihub.py b/hub/kojihub.py index 7946e997..25a47f66 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -3678,6 +3678,9 @@ def add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode='koji'): context.session.assertPerm('tag') + # sanity check for None value, which may happen if DB schema isn't updated to 1.21+ + if merge_mode is None: + merge_mode = 'koji' if merge_mode not in koji.REPO_MERGE_MODES: raise koji.GenericError('Invalid merge mode: %s' % merge_mode) @@ -3721,9 +3724,12 @@ def remove_external_repo_from_tag(tag_info, repo_info): update.execute() -def edit_tag_external_repo(tag_info, repo_info, priority): +def edit_tag_external_repo(tag_info, repo_info, priority=None, merge_mode=None): """Edit a tag<->external repo association - This allows you to update the priority without removing/adding the repo.""" + This allows you to update the priority and merge_mode without removing/adding the repo. + + Note that None value of priority and merge_mode means no change on it + """ context.session.assertPerm('tag') @@ -3738,9 +3744,20 @@ def edit_tag_external_repo(tag_info, repo_info, priority): (repo['name'], tag['name'])) tag_repo = tag_repos[0] - if priority != tag_repo['priority']: + data = {} + for k in ('priority', 'merge_mode'): + val = locals().get(k) + # None value means no change + if val is not None and val != tag_repo[k]: + data[k] = val + if not data: + return False + else: + for k in ('priority', 'merge_mode'): + data.setdefault(k, tag_repo[k]) remove_external_repo_from_tag(tag_id, repo_id) - add_external_repo_to_tag(tag_id, repo_id, priority) + add_external_repo_to_tag(tag_id, repo_id, **data) + return True def get_tag_external_repos(tag_info=None, repo_info=None, event=None):