external repos can have specified arch list
Fixes: https://pagure.io/koji/issue/2538
This commit is contained in:
parent
c39f6e9afa
commit
24bd694865
7 changed files with 46 additions and 15 deletions
|
|
@ -5550,6 +5550,9 @@ class CreaterepoTask(BaseTaskHandler):
|
||||||
# generate repo url list, starting with our local premerge repo
|
# generate repo url list, starting with our local premerge repo
|
||||||
repos = ['file://' + localdir + '/']
|
repos = ['file://' + localdir + '/']
|
||||||
for repo in external_repos:
|
for repo in external_repos:
|
||||||
|
if repo['arches'] and arch not in repo['arches'].split():
|
||||||
|
# ignore external repo with non-relevant archlist
|
||||||
|
continue
|
||||||
ext_url = repo['url']
|
ext_url = repo['url']
|
||||||
# substitute $arch in the url with the arch of the repo we're generating
|
# substitute $arch in the url with the arch of the repo we're generating
|
||||||
ext_url = ext_url.replace('$arch', arch)
|
ext_url = ext_url.replace('$arch', arch)
|
||||||
|
|
|
||||||
|
|
@ -4973,8 +4973,11 @@ def anon_handle_taginfo(goptions, session, args):
|
||||||
if external_repos:
|
if external_repos:
|
||||||
print("External repos:")
|
print("External repos:")
|
||||||
for rinfo in external_repos:
|
for rinfo in external_repos:
|
||||||
|
if not rinfo['arches']:
|
||||||
|
rinfo['arches'] = 'inherited from tag'
|
||||||
|
# TODO else intersection of arches?
|
||||||
print(" %(priority)3i %(external_repo_name)s "
|
print(" %(priority)3i %(external_repo_name)s "
|
||||||
"(%(url)s, merge mode: %(merge_mode)s)" % rinfo)
|
"(%(url)s, merge mode: %(merge_mode)s), arches: %(arches)s" % rinfo)
|
||||||
print("Inheritance:")
|
print("Inheritance:")
|
||||||
for parent in session.getInheritanceData(info['id'], **event_opts):
|
for parent in session.getInheritanceData(info['id'], **event_opts):
|
||||||
parent['flags'] = format_inheritance_flags(parent)
|
parent['flags'] = format_inheritance_flags(parent)
|
||||||
|
|
@ -5520,6 +5523,8 @@ def handle_add_external_repo(goptions, session, args):
|
||||||
parser.add_option("-p", "--priority", type='int',
|
parser.add_option("-p", "--priority", type='int',
|
||||||
help=_("Set priority (when adding to tag)"))
|
help=_("Set priority (when adding to tag)"))
|
||||||
parser.add_option("-m", "--mode", help=_("Set merge mode"))
|
parser.add_option("-m", "--mode", help=_("Set merge mode"))
|
||||||
|
parser.add_option("-a", "--arches", metavar="ARCH1,ARCH2, ...",
|
||||||
|
help=_("Use only subset of arches from given repo"))
|
||||||
(options, args) = parser.parse_args(args)
|
(options, args) = parser.parse_args(args)
|
||||||
activate_session(session, goptions)
|
activate_session(session, goptions)
|
||||||
if options.mode:
|
if options.mode:
|
||||||
|
|
@ -5549,6 +5554,8 @@ def handle_add_external_repo(goptions, session, args):
|
||||||
callopts = {}
|
callopts = {}
|
||||||
if options.mode:
|
if options.mode:
|
||||||
callopts['merge_mode'] = options.mode
|
callopts['merge_mode'] = options.mode
|
||||||
|
if options.arches:
|
||||||
|
callopts['arches'] = options.arches
|
||||||
session.addExternalRepoToTag(tag, rinfo['name'], priority, **callopts)
|
session.addExternalRepoToTag(tag, rinfo['name'], priority, **callopts)
|
||||||
print("Added external repo %s to tag %s (priority %i)"
|
print("Added external repo %s to tag %s (priority %i)"
|
||||||
% (rinfo['name'], tag, priority))
|
% (rinfo['name'], tag, priority))
|
||||||
|
|
@ -5567,6 +5574,8 @@ def handle_edit_external_repo(goptions, session, args):
|
||||||
parser.add_option("-m", "--mode", metavar="MODE",
|
parser.add_option("-m", "--mode", metavar="MODE",
|
||||||
help=_("Edit the merge mode of the repo for the tag specified by --tag. "
|
help=_("Edit the merge mode of the repo for the tag specified by --tag. "
|
||||||
"Options: %s.") % ", ".join(koji.REPO_MERGE_MODES))
|
"Options: %s.") % ", ".join(koji.REPO_MERGE_MODES))
|
||||||
|
parser.add_option("-a", "--arches", metavar="ARCH1,ARCH2, ...",
|
||||||
|
help=_("Use only subset of arches from given repo"))
|
||||||
(options, args) = parser.parse_args(args)
|
(options, args) = parser.parse_args(args)
|
||||||
if len(args) != 1:
|
if len(args) != 1:
|
||||||
parser.error(_("Incorrect number of arguments"))
|
parser.error(_("Incorrect number of arguments"))
|
||||||
|
|
@ -5581,12 +5590,14 @@ def handle_edit_external_repo(goptions, session, args):
|
||||||
tag_repo_opts['priority'] = options.priority
|
tag_repo_opts['priority'] = options.priority
|
||||||
if options.mode:
|
if options.mode:
|
||||||
tag_repo_opts['merge_mode'] = options.mode
|
tag_repo_opts['merge_mode'] = options.mode
|
||||||
|
if options.arches is not None:
|
||||||
|
tag_repo_opts['arches'] = options.arches
|
||||||
if not tag_repo_opts:
|
if not tag_repo_opts:
|
||||||
parser.error(_("At least, one of priority and merge mode should be specified"))
|
parser.error(_("At least, one of priority and merge mode should be specified"))
|
||||||
tag_repo_opts['tag_info'] = options.tag
|
tag_repo_opts['tag_info'] = options.tag
|
||||||
tag_repo_opts['repo_info'] = args[0]
|
tag_repo_opts['repo_info'] = args[0]
|
||||||
else:
|
else:
|
||||||
for k in ('priority', 'mode'):
|
for k in ('priority', 'mode', 'arches'):
|
||||||
if getattr(options, k) is not None:
|
if getattr(options, k) is not None:
|
||||||
parser.error(_("If %s is specified, --tag must be specified as well") % k)
|
parser.error(_("If %s is specified, --tag must be specified as well") % k)
|
||||||
|
|
||||||
|
|
|
||||||
9
docs/schema-upgrade-1.23-1.24.sql
Normal file
9
docs/schema-upgrade-1.23-1.24.sql
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
-- upgrade script to migrate the Koji database schema
|
||||||
|
-- from version 1.23 to 1.24
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
|
||||||
|
ALTER TABLE tag_external_repos ADD COLUMN arches TEXT;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
@ -465,7 +465,7 @@ create table external_repo (
|
||||||
-- fake repo id for internal stuff (needed for unique index)
|
-- fake repo id for internal stuff (needed for unique index)
|
||||||
INSERT INTO external_repo (id, name) VALUES (0, 'INTERNAL');
|
INSERT INTO external_repo (id, name) VALUES (0, 'INTERNAL');
|
||||||
|
|
||||||
create table external_repo_config (
|
CREATE TABLE external_repo_config (
|
||||||
external_repo_id INTEGER NOT NULL REFERENCES external_repo(id),
|
external_repo_id INTEGER NOT NULL REFERENCES external_repo(id),
|
||||||
url TEXT NOT NULL,
|
url TEXT NOT NULL,
|
||||||
-- versioned - see earlier description of versioning
|
-- versioned - see earlier description of versioning
|
||||||
|
|
@ -481,11 +481,12 @@ create table external_repo_config (
|
||||||
UNIQUE (external_repo_id, active)
|
UNIQUE (external_repo_id, active)
|
||||||
) WITHOUT OIDS;
|
) WITHOUT OIDS;
|
||||||
|
|
||||||
create table tag_external_repos (
|
CREATE TABLE tag_external_repos (
|
||||||
tag_id INTEGER NOT NULL REFERENCES tag(id),
|
tag_id INTEGER NOT NULL REFERENCES tag(id),
|
||||||
external_repo_id INTEGER NOT NULL REFERENCES external_repo(id),
|
external_repo_id INTEGER NOT NULL REFERENCES external_repo(id),
|
||||||
priority INTEGER NOT NULL,
|
priority INTEGER NOT NULL,
|
||||||
merge_mode TEXT NOT NULL DEFAULT 'koji',
|
merge_mode TEXT NOT NULL DEFAULT 'koji',
|
||||||
|
arches TEXT,
|
||||||
-- versioned - see earlier description of versioning
|
-- versioned - see earlier description of versioning
|
||||||
create_event INTEGER NOT NULL REFERENCES events(id) DEFAULT get_event(),
|
create_event INTEGER NOT NULL REFERENCES events(id) DEFAULT get_event(),
|
||||||
revoke_event INTEGER REFERENCES events(id),
|
revoke_event INTEGER REFERENCES events(id),
|
||||||
|
|
|
||||||
|
|
@ -3675,7 +3675,7 @@ def delete_external_repo(info):
|
||||||
update.execute()
|
update.execute()
|
||||||
|
|
||||||
|
|
||||||
def add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode='koji'):
|
def add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode='koji', arches=None):
|
||||||
"""Add an external repo to a tag"""
|
"""Add an external repo to a tag"""
|
||||||
|
|
||||||
context.session.assertPerm('tag')
|
context.session.assertPerm('tag')
|
||||||
|
|
@ -3701,7 +3701,7 @@ def add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode='koji'):
|
||||||
|
|
||||||
insert = InsertProcessor('tag_external_repos')
|
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)
|
merge_mode=merge_mode, arches=arches)
|
||||||
insert.make_create()
|
insert.make_create()
|
||||||
insert.execute()
|
insert.execute()
|
||||||
|
|
||||||
|
|
@ -3726,7 +3726,7 @@ def remove_external_repo_from_tag(tag_info, repo_info):
|
||||||
update.execute()
|
update.execute()
|
||||||
|
|
||||||
|
|
||||||
def edit_tag_external_repo(tag_info, repo_info, priority=None, merge_mode=None):
|
def edit_tag_external_repo(tag_info, repo_info, priority=None, merge_mode=None, arches=None):
|
||||||
"""Edit a tag<->external repo association
|
"""Edit a tag<->external repo association
|
||||||
This allows you to update the priority and merge_mode without removing/adding the repo.
|
This allows you to update the priority and merge_mode without removing/adding the repo.
|
||||||
|
|
||||||
|
|
@ -3747,7 +3747,7 @@ def edit_tag_external_repo(tag_info, repo_info, priority=None, merge_mode=None):
|
||||||
tag_repo = tag_repos[0]
|
tag_repo = tag_repos[0]
|
||||||
|
|
||||||
data = {}
|
data = {}
|
||||||
for k in ('priority', 'merge_mode'):
|
for k in ('priority', 'merge_mode', 'arches'):
|
||||||
val = locals().get(k)
|
val = locals().get(k)
|
||||||
# None value means no change
|
# None value means no change
|
||||||
if val is not None and val != tag_repo[k]:
|
if val is not None and val != tag_repo[k]:
|
||||||
|
|
@ -3755,7 +3755,7 @@ def edit_tag_external_repo(tag_info, repo_info, priority=None, merge_mode=None):
|
||||||
if not data:
|
if not data:
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
for k in ('priority', 'merge_mode'):
|
for k in ('priority', 'merge_mode', 'arches'):
|
||||||
data.setdefault(k, tag_repo[k])
|
data.setdefault(k, tag_repo[k])
|
||||||
remove_external_repo_from_tag(tag_id, repo_id)
|
remove_external_repo_from_tag(tag_id, repo_id)
|
||||||
add_external_repo_to_tag(tag_id, repo_id, **data)
|
add_external_repo_to_tag(tag_id, repo_id, **data)
|
||||||
|
|
@ -3800,6 +3800,7 @@ def get_tag_external_repos(tag_info=None, repo_info=None, event=None):
|
||||||
'tag.name': 'tag_name',
|
'tag.name': 'tag_name',
|
||||||
'url': 'url',
|
'url': 'url',
|
||||||
'merge_mode': 'merge_mode',
|
'merge_mode': 'merge_mode',
|
||||||
|
'arches': 'arches',
|
||||||
}
|
}
|
||||||
columns, aliases = zip(*fields.items())
|
columns, aliases = zip(*fields.items())
|
||||||
|
|
||||||
|
|
@ -10553,7 +10554,7 @@ class RootExports(object):
|
||||||
deleteExternalRepo = staticmethod(delete_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'):
|
merge_mode='koji', arches=None):
|
||||||
"""Add an external repo to a tag.
|
"""Add an external repo to a tag.
|
||||||
|
|
||||||
:param tag_info: Tag name or ID number
|
:param tag_info: Tag name or ID number
|
||||||
|
|
@ -10564,7 +10565,8 @@ class RootExports(object):
|
||||||
the default is "koji".
|
the default is "koji".
|
||||||
"""
|
"""
|
||||||
# wrap the local method so we don't expose the event parameter
|
# wrap the local method so we don't expose the event parameter
|
||||||
add_external_repo_to_tag(tag_info, repo_info, priority, merge_mode)
|
add_external_repo_to_tag(tag_info, repo_info, priority,
|
||||||
|
merge_mode=merge_mode, arches=arches)
|
||||||
|
|
||||||
def removeExternalRepoFromTag(self, tag_info, repo_info):
|
def removeExternalRepoFromTag(self, tag_info, repo_info):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,8 @@ Options:
|
||||||
--tag.
|
--tag.
|
||||||
-m MODE, --mode=MODE Edit the merge mode of the repo for the tag specified
|
-m MODE, --mode=MODE Edit the merge mode of the repo for the tag specified
|
||||||
by --tag. Options: %s.
|
by --tag. Options: %s.
|
||||||
|
-a ARCH1,ARCH2, ..., --arches=ARCH1,ARCH2, ...
|
||||||
|
Use only subset of arches from given repo
|
||||||
""" % (self.progname, ', '.join(koji.REPO_MERGE_MODES)))
|
""" % (self.progname, ', '.join(koji.REPO_MERGE_MODES)))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,8 @@ class TestEditTagExternalRepo(unittest.TestCase):
|
||||||
self.get_tag_external_repos.return_value = [{'external_repo_id': 11,
|
self.get_tag_external_repos.return_value = [{'external_repo_id': 11,
|
||||||
'tag_id': 1,
|
'tag_id': 1,
|
||||||
'priority': 5,
|
'priority': 5,
|
||||||
'merge_mode': 'simple'}]
|
'merge_mode': 'simple',
|
||||||
|
'arches': 'x86_64 i686'}]
|
||||||
|
|
||||||
self.remove_external_repo_from_tag = mock.patch(
|
self.remove_external_repo_from_tag = mock.patch(
|
||||||
'kojihub.remove_external_repo_from_tag').start()
|
'kojihub.remove_external_repo_from_tag').start()
|
||||||
|
|
@ -33,7 +34,8 @@ class TestEditTagExternalRepo(unittest.TestCase):
|
||||||
self.get_external_repo.assert_called_once_with('ext_repo', strict=True)
|
self.get_external_repo.assert_called_once_with('ext_repo', strict=True)
|
||||||
self.get_tag_external_repos.assert_called_once_with(tag_info=1, repo_info=11)
|
self.get_tag_external_repos.assert_called_once_with(tag_info=1, repo_info=11)
|
||||||
self.remove_external_repo_from_tag.assert_called_once_with(1, 11)
|
self.remove_external_repo_from_tag.assert_called_once_with(1, 11)
|
||||||
self.add_external_repo_to_tag.assert_called_once_with(1, 11, priority=6, merge_mode='bare')
|
self.add_external_repo_to_tag.assert_called_once_with(1, 11, priority=6, merge_mode='bare',
|
||||||
|
arches='x86_64 i686')
|
||||||
self.assertTrue(rv)
|
self.assertTrue(rv)
|
||||||
|
|
||||||
def test_edit_no_tag_repo(self):
|
def test_edit_no_tag_repo(self):
|
||||||
|
|
@ -74,9 +76,10 @@ class TestEditTagExternalRepo(unittest.TestCase):
|
||||||
self.get_tag_external_repos.return_value = [{'external_repo_id': 11,
|
self.get_tag_external_repos.return_value = [{'external_repo_id': 11,
|
||||||
'tag_id': 1,
|
'tag_id': 1,
|
||||||
'priority': 5,
|
'priority': 5,
|
||||||
'merge_mode': None}]
|
'merge_mode': None,
|
||||||
|
'arches': None}]
|
||||||
rv = kojihub.edit_tag_external_repo('tag', 'ext_repo', priority=None, merge_mode='simple')
|
rv = kojihub.edit_tag_external_repo('tag', 'ext_repo', priority=None, merge_mode='simple')
|
||||||
self.remove_external_repo_from_tag.assert_called_once_with(1, 11)
|
self.remove_external_repo_from_tag.assert_called_once_with(1, 11)
|
||||||
self.add_external_repo_to_tag.assert_called_once_with(1, 11,
|
self.add_external_repo_to_tag.assert_called_once_with(1, 11, arches=None,
|
||||||
priority=5, merge_mode='simple')
|
priority=5, merge_mode='simple')
|
||||||
self.assertTrue(rv)
|
self.assertTrue(rv)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue