diff --git a/builder/kojid b/builder/kojid index 0e5eb22c..b79f1db6 100755 --- a/builder/kojid +++ b/builder/kojid @@ -62,7 +62,6 @@ except ImportError: import dnf import Cheetah.Template -import jinja2 import librepo import requests import rpm @@ -2105,7 +2104,6 @@ class WrapperRPMTask(BaseBuildTask): def handler(self, spec_url, build_target, build, task, opts=None): if not opts: opts = {} - self.opts = opts if not (build or task): raise koji.BuildError('build and/or task must be specified') @@ -2288,8 +2286,13 @@ class WrapperRPMTask(BaseBuildTask): # get the source before chown, git > 2.35.2 would refuse to that later source = scm.get_source() - - engine, spec_template = self.find_template(specdir) + spec_template = None + for path, dir, files in os.walk(specdir): + files.sort() + for filename in files: + if filename.endswith('.spec.tmpl'): + spec_template = os.path.join(path, filename) + break if not spec_template: raise koji.BuildError('no spec file template found at URL: %s' % spec_url) @@ -2310,12 +2313,13 @@ class WrapperRPMTask(BaseBuildTask): # change directory to the specdir to the template can reference files there os.chdir(specdir) + contents = Cheetah.Template.Template(file=spec_template, + searchList=[values]).respond() + contents = contents.encode('utf-8') - if engine == 'cheetah': - specfile = self.handle_cheetah(spec_template, values) - elif engine == 'jinja': - specfile = self.handle_jinja(spec_template, values) - + specfile = spec_template[:-5] + with open(specfile, 'wb') as specfd: + specfd.write(contents) uploadpath = self.getUploadDir() self.session.uploadWrapper(specfile, uploadpath) @@ -2471,51 +2475,6 @@ class WrapperRPMTask(BaseBuildTask): return results - def find_template(self, specdir): - # historically, spec templates were cheetah templates - # now we support jinja as well - spec_template = None - engine = None - for dirpath, dirnames, filenames in os.walk(specdir): - for filename in sorted(filenames): - if filename.endswith('.spec.tmpl'): - spec_template = os.path.join(dirpath, filename) - engine = 'cheetah' - break - if self.opts.get('jinja') and filename.endswith(('.spec.jinja', '.spec.j2')): - spec_template = os.path.join(dirpath, filename) - engine = 'jinja' - break - return engine, spec_template - - def handle_cheetah(self, spec_template, values): - """Generate specfile from cheetah template""" - contents = Cheetah.Template.Template(file=spec_template, - searchList=[values]).respond() - contents = contents.encode('utf-8') - - # strip .tmpl - specfile = spec_template[:-5] - with open(specfile, 'wb') as specfd: - specfd.write(contents) - return specfile - - def handle_jinja(self, spec_template, values): - """Generate specfile from jinja template""" - env = jinja2.Environment( - loader=jinja2.FileSystemLoader('.'), - autoescape=False # not html - ) - path = os.path.relpath(spec_template) - template = env.get_template(path) - contents = template.render(**values) - - # strip .j2 or .jinja ext - specfile = os.path.splitext(spec_template)[0] - with open(specfile, 'wt') as specfd: - specfd.write(contents) - return specfile - class ChainMavenTask(MultiPlatformTask): diff --git a/tests/test_builder/test_wrapperRPM.py b/tests/test_builder/test_wrapperRPM.py deleted file mode 100644 index d727e060..00000000 --- a/tests/test_builder/test_wrapperRPM.py +++ /dev/null @@ -1,158 +0,0 @@ -from __future__ import absolute_import -try: - from unittest import mock -except ImportError: - import mock -import os -import rpm -import shutil -import tempfile -import threading -import unittest -import koji -import koji.tasks -from .loadkojid import kojid -from six.moves import range -from functools import partial - - -mylock = threading.Lock() - - -class TestWrapperRPM(unittest.TestCase): - - def setUp(self): - self.tempdir = tempfile.mkdtemp() - self.session = mock.MagicMock() - self.options = mock.MagicMock() - self.options.copy_old_repodata = False - self.options.createrepo_update = True - self.topdir = self.tempdir + '/topdir' - self.options.topdir = self.topdir - self.pathinfo = koji.PathInfo(self.topdir) - mock.patch('koji.pathinfo', new=self.pathinfo).start() - - # set up task handler - task_id = 99 - method = 'wrapperRPM' - self.spec_url = 'SPEC_URL' - self.target = {'id': 123, 'name': 'TARGET', 'build_tag': 456} - self.build = {'id': 12345, 'state': 1, 'name': '_name', 'version': '_version', - 'release': '_release'} - self.task = None - self.opts = {} - params = [self.spec_url, self.target, self.build, self.task, self.opts] - self.handler = kojid.WrapperRPMTask(task_id, method, params, self.session, - self.options, self.tempdir + '/work') - - self.handler.find_arch = mock.MagicMock() - self.handler.chownTree = mock.MagicMock() - self.handler.localPath = self.my_localPath - - # mock some more things - self.wait = mock.MagicMock() - self.handler.wait = self.wait - self.session.getExternalRepoList.return_value = [] - self.SCM = mock.patch.object(kojid, 'SCM').start() - self.SCM.return_value.assert_allowed = mock.MagicMock() - self.SCM.return_value.checkout.side_effect = self.my_checkout - self.BuildRoot = mock.patch.object(kojid, 'BuildRoot').start() - self.BuildRoot().resultdir.return_value = self.tempdir + '/result' - mock.patch('pwd.getpwnam').start() - mock.patch('grp.getgrnam').start() - - # default to a maven build - self.session.getMavenBuild.return_value = {'build_id': 12345, 'artifact_id': 'ARTIFACT'} - self.session.getWinBuild.return_value = None - self.session.getImageBuild.return_value = None - - self.session.listArchives.return_value = [{'id': 999, 'filename': 'test.pom', - 'group_id': 'GROUP', 'artifact_id': 'ARTIFACT', - 'version': 'VERSION', 'name': 'NAME'}] - # This handler relies on chdir - mylock.acquire() - self.savecwd = os.getcwd() - - def tearDown(self): - # clean up the chdir - os.chdir(self.savecwd) - mylock.release() - mock.patch.stopall() - shutil.rmtree(self.tempdir) - - def my_checkout(self, *a, **kw): - return self.my_checkout2(['foo.spec.tmpl'], *a, **kw) - - def my_checkout2(self, relpaths, *a, **kw): - scmdir = self.tempdir + '/checkout' - koji.ensuredir(scmdir) - for relpath in relpaths: - fn = koji.util.joinpath(scmdir, relpath) - with open(fn, 'wt') as fp: - fp.write(f'Hello World\n{relpath}\n') - return scmdir - - def my_localPath(self, relpath): - path = koji.util.joinpath(self.tempdir, relpath) - koji.ensuredir(os.path.dirname(path)) - with open(path, 'wt') as fp: - fp.write('Hola Mundo\n') - return path - - def write_srpm(self): - fn = self.tempdir + '/result/foo.src.rpm' - koji.ensuredir(os.path.dirname(fn)) - with open(fn, 'wt') as fp: - fp.write('Bonjour le monde\n') - - def my_build(self, *a, **kw): - self.write_srpm() - fn = self.tempdir + '/result/foo.noarch.rpm' - koji.ensuredir(os.path.dirname(fn)) - with open(fn, 'wt') as fp: - fp.write('Ahoj světe\n') - - def test_basic(self): - # self.session.getTag.return_value = {'id': 'TAGID', 'name': 'TAG'} - self.write_srpm() - # rewrite the srpm when build is called - self.BuildRoot().build.side_effect = self.my_build - - # this handler relies on os.chdir - result = self.handler.run() - - self.assertEqual(result['srpm'], 'foo.src.rpm') - self.assertEqual(result['rpms'], ['foo.noarch.rpm']) - - - def test_basic_jinja(self): - # self.session.getTag.return_value = {'id': 'TAGID', 'name': 'TAG'} - self.write_srpm() - # rewrite the srpm when build is called - self.BuildRoot().build.side_effect = self.my_build - # use a jinja template - self.SCM.return_value.checkout.side_effect = partial(self.my_checkout2, ['foo.spec.j2']) - - # this handler relies on os.chdir - self.opts['jinja'] = True - result = self.handler.run() - - self.assertEqual(result['srpm'], 'foo.src.rpm') - self.assertEqual(result['rpms'], ['foo.noarch.rpm']) - - def test_jinja_requires_opt(self): - # self.session.getTag.return_value = {'id': 'TAGID', 'name': 'TAG'} - self.write_srpm() - # rewrite the srpm when build is called - self.BuildRoot().build.side_effect = self.my_build - # use a jinja template - self.SCM.return_value.checkout.side_effect = partial(self.my_checkout2, ['foo.spec.j2']) - - # this handler relies on os.chdir - with self.assertRaises(koji.BuildError) as ex: - result = self.handler.run() - - self.assertIn('no spec file template found', str(ex.exception)) - - -# the end