Initial jinja2 porting work

This commit is contained in:
Mike McLean 2025-03-01 22:39:47 -05:00 committed by Tomas Kopecek
parent dbb60e91f3
commit dee1127ce8
59 changed files with 3129 additions and 2797 deletions

View file

@ -62,6 +62,7 @@ except ImportError:
import dnf
import Cheetah.Template
import jinja2
import librepo
import requests
import rpm
@ -2104,6 +2105,7 @@ 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')
@ -2286,13 +2288,8 @@ class WrapperRPMTask(BaseBuildTask):
# get the source before chown, git > 2.35.2 would refuse to that later
source = scm.get_source()
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
engine, spec_template = self.find_template(specdir)
if not spec_template:
raise koji.BuildError('no spec file template found at URL: %s' % spec_url)
@ -2313,13 +2310,12 @@ 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')
specfile = spec_template[:-5]
with open(specfile, 'wb') as specfd:
specfd.write(contents)
if engine == 'cheetah':
specfile = self.handle_cheetah(spec_template, values)
elif engine == 'jinja':
specfile = self.handle_jinja(spec_template, values)
uploadpath = self.getUploadDir()
self.session.uploadWrapper(specfile, uploadpath)
@ -2475,6 +2471,51 @@ 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):