distrepo will not skip rpm stat by default

There is also CLI option which can override this behaviour if needed.

Related: https://pagure.io/koji/issue/3829
This commit is contained in:
Tomas Kopecek 2023-06-01 15:37:54 +02:00
parent dc3dfc990d
commit ad0566d7cc
4 changed files with 45 additions and 4 deletions

View file

@ -5886,6 +5886,9 @@ class createDistRepoTask(BaseTaskHandler):
def handler(self, tag, repo_id, arch, keys, opts):
# arch is the arch of the repo, not the task
createrepo_skip_stat = opts.get('createrepo_skip_stat')
if createrepo_skip_stat:
raise koji.ParameterError("createrepo_skip_stat could be only None/False")
self.rinfo = self.session.repoInfo(repo_id, strict=True)
if self.rinfo['state'] != koji.REPO_INIT:
raise koji.GenericError("Repo %(id)s not in INIT state (got %(state)s)" % self.rinfo)
@ -5936,7 +5939,8 @@ class createDistRepoTask(BaseTaskHandler):
oldrepodata = os.path.join(oldrepodir, arch, 'repodata')
self.do_createrepo(self.repodir, '%s/pkglist' % self.repodir,
groupdata, oldpkgs=oldpkgs, oldrepodata=oldrepodata,
zck=opts.get('zck'), zck_dict_dir=opts.get('zck_dict_dir'))
zck=opts.get('zck'), zck_dict_dir=opts.get('zck_dict_dir'),
createrepo_skip_stat=createrepo_skip_stat)
for subrepo in self.subrepos:
if oldrepo:
oldrepodata = os.path.join(oldrepodir, arch, subrepo, 'repodata')
@ -5998,11 +6002,18 @@ class createDistRepoTask(BaseTaskHandler):
self.session.uploadWrapper(fn, self.uploadpath)
def do_createrepo(self, repodir, pkglist, groupdata, oldpkgs=None,
logname=None, oldrepodata=None, zck=False, zck_dict_dir=None):
logname=None, oldrepodata=None, zck=False, zck_dict_dir=None,
createrepo_skip_stat=None):
"""Run createrepo
This is derived from CreaterepoTask.create_local_repo, but adapted to
our requirements here
:param bool|None createrepo_skip_stat: Override default set in kojid.conf. Note, that
in True variant could resulting repo contain
unexpected rpms.
"""
koji.ensuredir(repodir)
if self.options.use_createrepo_c:
@ -6028,7 +6039,11 @@ class createDistRepoTask(BaseTaskHandler):
# to rewrite it (if we have external repos to merge)
os.unlink(oldorigins)
cmd.append('--update')
if self.options.createrepo_skip_stat:
if createrepo_skip_stat is not None:
skip_stat = createrepo_skip_stat
else:
skip_stat = self.options.distrepo_skip_stat
if skip_stat:
cmd.append('--skip-stat')
if oldpkgs:
# generate delta-rpms
@ -6457,6 +6472,7 @@ def get_options():
'use_createrepo_c': True,
'createrepo_skip_stat': True,
'createrepo_update': True,
'distrepo_skip_stat': False,
'mock_bootstrap_image': False,
'pkgurl': None,
'allowed_scms': '',
@ -6492,7 +6508,8 @@ def get_options():
'createrepo_update', 'use_fast_upload', 'support_rpm_source_layout',
'build_arch_can_fail', 'no_ssl_verify', 'log_timestamps',
'allow_noverifyssl', 'allowed_scms_use_config',
'allowed_scms_use_policy', 'allow_password_in_scm_url']:
'allowed_scms_use_policy', 'allow_password_in_scm_url',
'distrepo_skip_stat']:
defaults[name] = config.getboolean('kojid', name)
elif name in ['plugin', 'plugins']:
defaults['plugin'] = value.split()

View file

@ -60,6 +60,19 @@ topurl=http://hub.example.com/kojifiles
; use createrepo_c rather than createrepo
; use_createrepo_c=True
; for faster repo regeneration reuse last repodata for given repo
; createrepo_update=True
; for createrepo tasks believe that rpms were not changed and
; we don't even need to stat them again. Turn off if some rewrites are expected.
; createrepo_skip_stat=True
; same as createrepo_skip_stat but for distrepo tasks. Here is the expectation
; different as distrepo can be run with different signing keys. So, tasks can refer
; to different binary versions of rpms. Turn on if you're sure that the task will
; be always run in same way. Not recommended
; distrepo_skip_stat=False
; A space-separated list of tuples from which kojid is allowed to checkout.
; The format of those tuples is:
;

View file

@ -7335,6 +7335,11 @@ def handle_dist_repo(options, session, args):
'(on builder)')
parser.add_option("--write-signed-rpms", action='store_true', default=False,
help='Write a signed rpms for given tag')
parser.add_option("--skip-stat", action='store_true', default=None,
help="Skip rpm stat during createrepo (override default builder setting)")
parser.add_option("--no-skip-stat", action='store_false', default=None,
help="Don't skip rpm stat during createrepo "
"(override default builder setting)")
task_opts, args = parser.parse_args(args)
if len(args) < 1:
parser.error('You must provide a tag to generate the repo from')
@ -7425,6 +7430,8 @@ def handle_dist_repo(options, session, args):
'zck_dict_dir': task_opts.zck_dict_dir,
'write_signed_rpms': task_opts.write_signed_rpms,
}
if task_opts.skip_stat is not None:
opts['createrepo_skip_stat'] = task_opts.skip_stat
task_id = session.distRepo(tag, keys, **opts)
print("Creating dist repo for tag " + tag)
if task_opts.wait or (task_opts.wait is None and not _running_in_bg()):

View file

@ -353,6 +353,10 @@ Options:
Directory containing compression dictionaries for use
by zchunk (on builder)
--write-signed-rpms Write a signed rpms for given tag
--skip-stat Skip rpm stat during createrepo (override default
builder setting)
--no-skip-stat Don't skip rpm stat during createrepo (override
default builder setting)
""" % self.progname)