Refactor code to separate config gathering from spec file generation

This is a prerequisite for testing the rendering logic without invoking
the whole program. But I think it also makes it much easier to see what
is going on.

I used slightly non-standard formatting with extra whitespace because
the invocation was hard to rid otherwise.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-07-08 13:28:18 +02:00
parent a09caca7e3
commit 942b435cb3
2 changed files with 129 additions and 98 deletions

View file

@ -15,29 +15,18 @@ import shutil
import sys
import tarfile
import tempfile
import time
import subprocess
import jinja2
import requests
import tqdm
from . import Metadata, licensing, __version__
from .metadata import normalize_deps
from . import Metadata, licensing, generator
DEFAULT_EDITOR = "vi"
XDG_CACHE_HOME = os.getenv("XDG_CACHE_HOME", os.path.expanduser("~/.cache"))
CACHEDIR = os.path.join(XDG_CACHE_HOME, "rust2rpm")
API_URL = "https://crates.io/api/v1/"
DIST_GIT_URL = "https://src.fedoraproject.org/api/0/"
JINJA_ENV = jinja2.Environment(
loader=jinja2.ChoiceLoader([
jinja2.FileSystemLoader(["/"]),
jinja2.PackageLoader("rust2rpm", "templates"),
]),
extensions=["jinja2.ext.do"],
trim_blocks=True,
lstrip_blocks=True)
LICENSES = re.compile(r"""
COPYING(?:[.-].*)?|COPYRIGHT(?:[.-].*)?|
EULA(?:[.-].*)?|[Ll]icen[cs]e|[Ll]icen[cs]e.*|
@ -333,10 +322,6 @@ def make_diff_metadata(args, crate, version):
shutil.copy2(cratef, os.path.join(os.getcwd(), f"{metadata.name}-{version}.crate"))
return crate, diff, metadata, doc_files, license_files
def to_list(s):
if not s:
return []
return list(filter(None, (l.strip() for l in s.splitlines())))
def detect_rpmautospec(default_target, spec_file):
"""Guess whether %autorelease+%autochangelog should be used
@ -486,34 +471,9 @@ def main():
crate, diff, metadata, doc_files, license_files = make_diff_metadata(args, args.crate, args.version)
JINJA_ENV.globals["normalize_deps"] = normalize_deps
JINJA_ENV.globals["to_list"] = to_list
template = JINJA_ENV.get_template("main.spec")
patch_file = f"{metadata.name}-fix-metadata.diff" if diff else None
if args.patch and len(diff) > 0:
patch_file = f"{metadata.name}-fix-metadata.diff"
else:
patch_file = None
kwargs = {}
kwargs["generator_version"] = __version__
kwargs["crate"] = crate
kwargs["target"] = args.target
bins = [tgt for tgt in metadata.targets if tgt.kind == "bin"]
libs = [tgt for tgt in metadata.targets if tgt.kind in {"lib", "rlib", "proc-macro"}]
is_bin = len(bins) > 0
is_lib = len(libs) > 0
if is_bin:
kwargs["include_main"] = True
kwargs["bins"] = bins
elif is_lib:
kwargs["include_main"] = False
else:
raise ValueError("No bins and no libs")
kwargs["include_devel"] = is_lib
kwargs["pkg_name"] = pkg_name = package_name_suffixed(metadata.name, args.suffix)
pkg_name = package_name_suffixed(metadata.name, args.suffix)
spec_file = pathlib.Path(f"{pkg_name}.spec")
if args.target in {"fedora"} and args.existence_check and not os.path.exists(spec_file):
@ -524,58 +484,13 @@ def main():
print("Re-run with --no-existence-check if you still want to convert it.")
sys.exit(1)
kwargs["auto_changelog_entry"] = args.auto_changelog_entry
rpmautospec = args.rpmautospec
if rpmautospec is None:
rpmautospec = detect_rpmautospec(args.target, spec_file)
kwargs["rpmautospec"] = rpmautospec
kwargs["relative_license_paths"] = args.relative_license_paths
if args.target in {"fedora", "mageia", "opensuse"}:
kwargs["include_build_requires"] = True
kwargs["include_provides"] = False
kwargs["include_requires"] = False
elif args.target == "plain":
kwargs["include_build_requires"] = True
kwargs["include_provides"] = True
kwargs["include_requires"] = True
else:
assert False, f"Unknown target {args.target!r}"
if args.target == "mageia":
kwargs["pkg_release"] = "%mkrel 1"
kwargs["rust_group"] = "Development/Rust"
elif args.target == "opensuse":
kwargs["spec_copyright_year"] = time.strftime("%Y")
kwargs["pkg_release"] = "0"
kwargs["rust_group"] = "Development/Libraries/Rust"
elif rpmautospec:
kwargs["pkg_release"] = "%autorelease"
else:
kwargs["pkg_release"] = "1%{?dist}"
if args.rpmautospec is None:
args.rpmautospec = detect_rpmautospec(args.target, spec_file)
if args.dynamic_buildrequires is None:
args.dynamic_buildrequires = args.target == "fedora"
kwargs["generate_buildrequires"] = args.dynamic_buildrequires
if args.target in {"opensuse"}:
kwargs["date"] = time.strftime("%a %b %d %T %Z %Y")
else:
kwargs["date"] = time.strftime("%a %b %d %Y")
packager_identity = detect_packager()
if packager_identity is not None:
kwargs["packager"] = packager_identity
if metadata.license is not None:
license, comments = licensing.translate_license(args.target, metadata.license)
kwargs["license"] = license
kwargs["license_comments"] = comments
kwargs["doc_files"] = doc_files
kwargs["license_files"] = license_files
conf = configparser.ConfigParser(interpolation=configparser.ExtendedInterpolation())
confs = conf.read([".rust2rpm.conf", "_rust2rpm.conf", "rust2rpm.conf"])
@ -597,19 +512,24 @@ def main():
if args.target not in conf:
conf.add_section(args.target)
kwargs["distconf"] = conf[args.target]
conf_all_features = conf[args.target].getboolean("all-features")
kwargs["all_features"] = conf_all_features or args.all_features
if conf_all_features is False and args.all_features:
print("WARNING: Conflicting settings for enabling all features: The setting is \"false\"")
print(" in rust2rpm.conf but it was enabled with the \"--all-features\" CLI flag.")
spec_contents = template.render(
metadata=metadata,
patch_file=patch_file,
**kwargs)
spec_contents = generator.spec_file_render(
args = args,
pkg_name = pkg_name,
crate = crate,
metadata = metadata,
patch_file = patch_file,
packager_identity = packager_identity,
doc_files = doc_files,
license_files = license_files,
distconf = conf[args.target],
all_features = conf_all_features or args.all_features,
)
if args.stdout:
print(f"# {spec_file}")
print(spec_contents)

111
rust2rpm/generator.py Normal file
View file

@ -0,0 +1,111 @@
import time
import jinja2
from . import __version__, metadata, licensing
def to_list(s):
if not s:
return []
return list(filter(None, (l.strip() for l in s.splitlines())))
def spec_file_template():
env = jinja2.Environment(
loader=jinja2.ChoiceLoader([
jinja2.FileSystemLoader(['/']),
jinja2.PackageLoader('rust2rpm', 'templates'),
]),
extensions=['jinja2.ext.do'],
trim_blocks=True,
lstrip_blocks=True)
env.globals['normalize_deps'] = metadata.normalize_deps
env.globals['to_list'] = to_list
return env.get_template('main.spec')
def spec_file_render(
args,
pkg_name,
crate,
metadata,
patch_file,
packager_identity,
doc_files,
license_files,
distconf,
all_features,
):
template = spec_file_template()
bins = [tgt for tgt in metadata.targets if tgt.kind == "bin"]
libs = [tgt for tgt in metadata.targets if tgt.kind in {"lib", "rlib", "proc-macro"}]
is_bin = len(bins) > 0
is_lib = len(libs) > 0
kwargs = {
'generator_version': __version__,
'target': args.target,
'crate': crate,
'include_devel': is_lib,
'pkg_name': pkg_name,
'auto_changelog_entry': args.auto_changelog_entry,
'rpmautospec': args.rpmautospec,
'relative_license_paths': args.relative_license_paths,
'generate_buildrequires': args.dynamic_buildrequires,
'doc_files': doc_files,
'license_files': license_files,
'distconf': distconf,
'all_features': all_features,
}
if is_bin:
kwargs['include_main'] = True
kwargs['bins'] = bins
elif is_lib:
kwargs['include_main'] = False
else:
raise ValueError('No bins and no libs')
if args.target in {'fedora', 'mageia', 'opensuse'}:
kwargs['include_build_requires'] = True
kwargs['include_provides'] = False
kwargs['include_requires'] = False
elif args.target == 'plain':
kwargs['include_build_requires'] = True
kwargs['include_provides'] = True
kwargs['include_requires'] = True
else:
assert False, f'Unknown target {args.target!r}'
if args.target == 'mageia':
kwargs['pkg_release'] = '%mkrel 1'
kwargs['rust_group'] = 'Development/Rust'
elif args.target == 'opensuse':
kwargs['spec_copyright_year'] = time.strftime('%Y')
kwargs['pkg_release'] = '0'
kwargs['rust_group'] = 'Development/Libraries/Rust'
elif args.rpmautospec:
kwargs['pkg_release'] = '%autorelease'
else:
kwargs['pkg_release'] = '1%{?dist}'
if args.target in {'opensuse'}:
kwargs['date'] = time.strftime('%a %b %d %T %Z %Y')
else:
kwargs['date'] = time.strftime('%a %b %d %Y')
if packager_identity is not None:
kwargs['packager'] = packager_identity
if metadata.license is not None:
license, comments = licensing.translate_license(args.target, metadata.license)
kwargs["license"] = license
kwargs["license_comments"] = comments
spec_contents = template.render(
metadata=metadata,
patch_file=patch_file,
**kwargs)
return spec_contents