From 3273d249cd151ffff0ccff77063f8323ab9baa1c Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Sep 20 2018 16:37:26 +0000 Subject: merge mode is part of tag connection rather than inherent to repo --- diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index 0dd3226..bd961a5 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -5173,9 +5173,9 @@ def anon_handle_list_external_repos(goptions, session, args): # 2) Listing repo data for a tag (priority, name, url) # 3) Listing repo data for multiple tags (tag, priority, name, url) if format == "basic": - format = "%(name)-25s %(merge_mode)-10s %(url)s" - header1 = "%-25s %-10s URL" % ("External repo name", "Mode") - header2 = "%s %s %s" % ("-"*25, "-"*40, "-"*20) + format = "%(name)-25s %(url)s" + header1 = "%-25s %s" % ("External repo name", "URL") + header2 = "%s %s" % ("-"*25, "-"*40) elif format == "tag": format = "%(priority)-3i %(external_repo_name)-25s %(merge_mode)-10s %(url)s" header1 = "%-3s %-25s %-10s URL" % ("Pri", "External repo name", "Mode") @@ -5183,7 +5183,7 @@ def anon_handle_list_external_repos(goptions, session, args): elif format == "multitag": format = "%(tag_name)-20s %(priority)-3i %(merge_mode)-10s %(external_repo_name)s" header1 = "%-20s %-3s %-10s %s" % ("Tag", "Pri", "Mode", "External repo name") - header2 = "%s %s %s" % ("-"*20, "-"*3, "-"*25) + header2 = "%s %s %s %s" % ("-"*20, "-"*3, "-"*10, "-"*25) if not options.quiet: print(header1) print(header2) @@ -5235,6 +5235,8 @@ def handle_add_external_repo(goptions, session, args): if options.mode: if options.mode not in koji.REPO_MERGE_MODES: parser.error('Invalid mode: %s' % options.mode) + if not options.tag: + parser.error('The --mode option can only be used with --tag') if len(args) == 1: name = args[0] rinfo = session.getExternalRepo(name, strict=True) @@ -5242,10 +5244,7 @@ def handle_add_external_repo(goptions, session, args): parser.error(_("A url is required to create an external repo entry")) elif len(args) == 2: name, url = args - callopts = {} - if options.mode: - callopts['merge_mode'] = options.mode - rinfo = session.createExternalRepo(name, url, **callopts) + rinfo = session.createExternalRepo(name, url) print("Created external repo %(id)i" % rinfo) else: parser.error(_("Incorrect number of arguments")) @@ -5258,7 +5257,10 @@ def handle_add_external_repo(goptions, session, args): priority = options.priority else: priority = _pick_external_repo_priority(session, tag) - session.addExternalRepoToTag(tag, rinfo['name'], priority) + callopts = {} + if options.mode: + callopts['merge_mode'] = options.mode + session.addExternalRepoToTag(tag, rinfo['name'], priority, **callopts) print("Added external repo %s to tag %s (priority %i)" \ % (rinfo['name'], tag, priority)) diff --git a/docs/schema.sql b/docs/schema.sql index e1ace2d..4e51530 100644 --- a/docs/schema.sql +++ b/docs/schema.sql @@ -450,7 +450,6 @@ INSERT INTO external_repo (id, name) VALUES (0, 'INTERNAL'); create table external_repo_config ( external_repo_id INTEGER NOT NULL REFERENCES external_repo(id), url TEXT NOT NULL, - merge_mode TEXT 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), @@ -468,6 +467,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', -- 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 de52b88..c6d13b8 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -3252,7 +3252,7 @@ def get_external_repo_id(info, strict=False, create=False): """Get the id for a build target""" return get_id('external_repo', info, strict, create) -def create_external_repo(name, url, merge_mode='koji'): +def create_external_repo(name, url): """Create a new external repo with the given name and url. Return a map containing the id, name, and url of the new repo.""" @@ -3262,16 +3262,13 @@ def create_external_repo(name, url, merge_mode='koji'): if get_external_repos(info=name): raise koji.GenericError('An external repo named "%s" already exists' % name) - if merge_mode not in koji.REPO_MERGE_MODES: - raise koji.GenericError('Invalid merge mode: %s' % merge_mode) - id = get_external_repo_id(name, create=True) if not url.endswith('/'): # Ensure the url always ends with / url += '/' - values = {'id': id, 'name': name, 'url': url, 'merge_mode': merge_mode} + values = {'id': id, 'name': name, 'url': url} insert = InsertProcessor('external_repo_config') - insert.set(external_repo_id=id, url=url, merge_mode=merge_mode) + insert.set(external_repo_id=id, url=url) insert.make_create() insert.execute() return values @@ -3281,7 +3278,7 @@ def get_external_repos(info=None, url=None, event=None, queryOpts=None): string (name) or an integer (id). If url is not None, filter the list of repos to those matching the given url.""" - fields = ['id', 'name', 'url', 'merge_mode'] + fields = ['id', 'name', 'url'] tables = ['external_repo'] joins = ['external_repo_config ON external_repo_id = id'] clauses = [eventCondition(event)] @@ -3315,7 +3312,7 @@ def get_external_repo(info, strict=False, event=None): else: return None -def edit_external_repo(info, name=None, url=None, merge_mode=None): +def edit_external_repo(info, name=None, url=None): """Edit an existing external repo""" context.session.assertPerm('admin') @@ -3323,20 +3320,6 @@ def edit_external_repo(info, name=None, url=None, merge_mode=None): repo = get_external_repo(info, strict=True) repo_id = repo['id'] - # check repo changes - changes = {} - if url and url != repo['url']: - if not url.endswith('/'): - # Ensure the url always ends with / - url += '/' - changes['url'] = url - if merge_mode is not None: - if merge_mode not in koji.REPO_MERGE_MODES: - raise koji.GenericError('Invalid merge mode: %s' % merge_mode) - if merge_mode != repo['merge_mode']: - changes['merge_mode'] = merge_mode - - # deal with renames if name and name != repo['name']: existing_id = _singleValue("""SELECT id FROM external_repo WHERE name = %(name)s""", locals(), strict=False) @@ -3346,17 +3329,17 @@ def edit_external_repo(info, name=None, url=None, merge_mode=None): rename = """UPDATE external_repo SET name = %(name)s WHERE id = %(repo_id)i""" _dml(rename, locals()) - # apply changes - if changes: + if url and url != repo['url']: + if not url.endswith('/'): + # Ensure the url always ends with / + url += '/' + update = UpdateProcessor('external_repo_config', values=locals(), clauses=['external_repo_id = %(repo_id)i']) update.make_revoke() - data = dslice(repo, ['url', 'merge_mode']) - data['external_repo_id'] = repo['id'] - data.update(changes) insert = InsertProcessor('external_repo_config') - insert.set(**data) + insert.set(external_repo_id=repo_id, url=url) insert.make_create() update.execute() @@ -3379,11 +3362,14 @@ def delete_external_repo(info): update.make_revoke() update.execute() -def add_external_repo_to_tag(tag_info, repo_info, priority): +def add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode='koji'): """Add an external repo to a tag""" context.session.assertPerm('admin') + if merge_mode not in koji.REPO_MERGE_MODES: + raise koji.GenericError('Invalid merge mode: %s' % merge_mode) + tag = get_tag(tag_info, strict=True) tag_id = tag['id'] repo = get_external_repo(repo_info, strict=True) @@ -3398,7 +3384,8 @@ def add_external_repo_to_tag(tag_info, repo_info, priority): (tag['name'], priority)) insert = InsertProcessor('tag_external_repos') - insert.set(tag_id=tag_id, external_repo_id=repo_id, priority=priority) + insert.set(tag_id=tag_id, external_repo_id=repo_id, priority=priority, + merge_mode=merge_mode) insert.make_create() insert.execute() @@ -6749,10 +6736,10 @@ def query_history(tables=None, **kwargs): 'tag_config': ['tag_id', 'arches', 'perm_id', 'locked', 'maven_support', 'maven_include_all'], 'tag_extra': ['tag_id', 'key', 'value'], 'build_target_config': ['build_target_id', 'build_tag', 'dest_tag'], - 'external_repo_config': ['external_repo_id', 'url', 'merge_mode'], + 'external_repo_config': ['external_repo_id', 'url'], 'host_config': ['host_id', 'arches', 'capacity', 'description', 'comment', 'enabled'], 'host_channels': ['host_id', 'channel_id'], - 'tag_external_repos': ['tag_id', 'external_repo_id', 'priority'], + 'tag_external_repos': ['tag_id', 'external_repo_id', 'priority', 'merge_mode'], 'tag_listing': ['build_id', 'tag_id'], 'tag_packages': ['package_id', 'tag_id', 'owner', 'blocked', 'extra_arches'], 'group_config': ['group_id', 'tag_id', 'blocked', 'exported', 'display_name', 'is_default', 'uservisible', @@ -9202,10 +9189,11 @@ class RootExports(object): editExternalRepo = staticmethod(edit_external_repo) deleteExternalRepo = staticmethod(delete_external_repo) - def addExternalRepoToTag(self, tag_info, repo_info, priority): + def addExternalRepoToTag(self, tag_info, repo_info, priority, + merge_mode='koji'): """Add an external repo to a tag""" # wrap the local method so we don't expose the event parameter - add_external_repo_to_tag(tag_info, repo_info, priority) + add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode) def removeExternalRepoFromTag(self, tag_info, repo_info): """Remove an external repo from a tag"""