Write files
- create spec and service files - other miscellaneous improvements Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
This commit is contained in:
parent
49d6fbbc58
commit
4e2a9e2adb
85
opam2rpm.py
85
opam2rpm.py
@ -18,21 +18,37 @@ import requests
|
|||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
import re
|
import re
|
||||||
import jinja2
|
import jinja2
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
from contextlib import contextmanager
|
||||||
|
import subprocess
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
argparser = ArgumentParser()
|
argparser = ArgumentParser()
|
||||||
argparser.add_argument('--debug', help='Print verbose output', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO)
|
argparser.add_argument('--debug', help='Print verbose output', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO)
|
||||||
argparser.add_argument('--package', help='Name of the OPAM package', required=True)
|
argparser.add_argument('--package', help='Name of the OPAM package', required=True)
|
||||||
argparser.add_argument('--prefixed', help='Create package with "ocaml-" prefix', action='store_true', default=True)
|
argparser.add_argument('--prefixed', help='Create RPM package with "ocaml-" prefix', action='store_true', default=True)
|
||||||
argparser.add_argument('--opam-web', help='URL pointing to the OPAM web interface', default='https://opam.ocaml.org/')
|
argparser.add_argument('--opam-web', help='URL pointing to the OPAM web interface', default='https://opam.ocaml.org/')
|
||||||
|
argparser.add_argument('--obs-project-dir', help='Path to a local checkout of the desired target project')
|
||||||
|
|
||||||
args = argparser.parse_args()
|
args = argparser.parse_args()
|
||||||
downstream_prefixed = args.prefixed
|
downstream_prefixed = args.prefixed
|
||||||
|
mydir = os.path.dirname(os.path.realpath(sys.argv[0]))
|
||||||
|
|
||||||
def _fail(msg):
|
def _fail(msg):
|
||||||
log.error(msg)
|
log.error(msg)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
# https://gist.github.com/howardhamilton/537e13179489d6896dd3
|
||||||
|
@contextmanager
|
||||||
|
def pushd(new_dir):
|
||||||
|
old_dir = os.getcwd()
|
||||||
|
os.chdir(new_dir)
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
os.chdir(old_dir)
|
||||||
|
|
||||||
def query_opam(package):
|
def query_opam(package):
|
||||||
url = f'{args.opam_web}/packages/{package}'
|
url = f'{args.opam_web}/packages/{package}'
|
||||||
result = requests.get(url)
|
result = requests.get(url)
|
||||||
@ -99,31 +115,80 @@ def parse_dependencies(dependencies):
|
|||||||
log.debug(f'Constructed OCAML build dependencies: {buildrequires}')
|
log.debug(f'Constructed OCAML build dependencies: {buildrequires}')
|
||||||
return buildrequires
|
return buildrequires
|
||||||
|
|
||||||
def render(name, url, license, buildrequires, prefixed, vcs_url=None):
|
def manglesrcname(name):
|
||||||
|
if name.startswith('ocaml-') and prefixed: # where is "prefixed" defined ?
|
||||||
|
return name.lstrip('ocaml-')
|
||||||
|
else:
|
||||||
|
return name
|
||||||
|
|
||||||
|
def manglepkgname(srcname, add_prefix):
|
||||||
|
if add_prefix:
|
||||||
|
pkgname = f'ocaml-{srcname}'
|
||||||
|
else:
|
||||||
|
pkgname = srcname
|
||||||
|
return pkgname
|
||||||
|
|
||||||
|
def render(name, srcname, url, license, buildrequires, prefixed, vcs_url=None):
|
||||||
if not vcs_url:
|
if not vcs_url:
|
||||||
vcs_url = url
|
vcs_url = url
|
||||||
templenv = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath='/home/georg/Work/templates'))
|
templenv = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath=f'{mydir}/templates'))
|
||||||
template_service = templenv.get_template('service')
|
template_service = templenv.get_template('service')
|
||||||
template_spec = templenv.get_template('ultimate.spec')
|
template_spec = templenv.get_template('ultimate.spec')
|
||||||
log.debug(f'Rendering {template_spec}')
|
log.debug(f'Rendering {template_spec}')
|
||||||
#if downstream_prefixing:
|
|
||||||
# name = f'ocaml-{name}'
|
|
||||||
rendered_service = template_service.render(pkgname=name, url=vcs_url)
|
rendered_service = template_service.render(pkgname=name, url=vcs_url)
|
||||||
if name.startswith('ocaml-') and prefixed:
|
rendered_spec = template_spec.render(pkgname=srcname, url=url, buildrequires=buildrequires, license=license, mode='dune', do_prefix=prefixed)
|
||||||
name = name.lstrip('ocaml-')
|
|
||||||
rendered_spec = template_spec.render(pkgname=name, url=url, buildrequires=buildrequires, license=license, mode='dune', do_prefix=prefixed)
|
|
||||||
|
|
||||||
log.debug(f'Service: {rendered_service}')
|
log.debug(f'Service: {rendered_service}')
|
||||||
log.debug(f'Spec: {rendered_spec}')
|
log.debug(f'Spec: {rendered_spec}')
|
||||||
return rendered_service, rendered_spec
|
return rendered_service, rendered_spec
|
||||||
|
|
||||||
|
def mkpac(pkgdir):
|
||||||
|
if os.path.isdir(pkgdir):
|
||||||
|
log.warning(f'Package directory {pkgdir} already exists')
|
||||||
|
else:
|
||||||
|
subprocess.run(['osc', 'mkpac', pkgdir], check=True)
|
||||||
|
|
||||||
|
def mkfile(file, data):
|
||||||
|
if os.path.isfile(file):
|
||||||
|
log.warning(f'File {file} already exists, overwriting in 10 seconds ...')
|
||||||
|
sleep(10)
|
||||||
|
with open(file, 'w') as fh:
|
||||||
|
fh.write(data)
|
||||||
|
|
||||||
|
def spec_cleaner(file):
|
||||||
|
subprocess.run(['spec-cleaner', '-i', file], check=True)
|
||||||
|
|
||||||
|
# spec-cleaner thinks "Development/Languages/OCaml" is an invalid group
|
||||||
|
with open(file, 'r') as fh:
|
||||||
|
lines = fh.readlines()
|
||||||
|
with open(file, 'w') as fh:
|
||||||
|
for line in lines:
|
||||||
|
if not 'FIXME' in line:
|
||||||
|
fh.write(line)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
opam_package = parse_opam(query_opam(args.package))
|
opam_package = parse_opam(query_opam(args.package))
|
||||||
info = opam_package.get_info()
|
info = opam_package.get_info()
|
||||||
repository_url, repository_name, is_prefixed = parse_homepage(info['Homepage'])
|
repository_url, name, is_prefixed = parse_homepage(info['Homepage'])
|
||||||
add_prefix = evaluate_prefixing(is_prefixed)
|
add_prefix = evaluate_prefixing(is_prefixed)
|
||||||
dependencies = parse_dependencies(info['Dependencies'])
|
dependencies = parse_dependencies(info['Dependencies'])
|
||||||
render(repository_name, info['Homepage'], info['License'], dependencies, add_prefix, repository_url)
|
srcname = manglesrcname(name)
|
||||||
|
pkgname = manglepkgname(name, add_prefix)
|
||||||
|
data_service, data_spec = render(name, srcname, info['Homepage'], info['License'], dependencies, add_prefix, repository_url)
|
||||||
|
prjdir = args.obs_project_dir
|
||||||
|
if prjdir:
|
||||||
|
if not os.path.isfile(f'{prjdir}/.osc/_project'):
|
||||||
|
_fail(f'Invalid project directory: {prjdir}')
|
||||||
|
specfile = f'{pkgname}.spec'
|
||||||
|
with pushd(prjdir):
|
||||||
|
mkpac(pkgname)
|
||||||
|
with pushd(pkgname):
|
||||||
|
mkfile('_service', data_service)
|
||||||
|
mkfile(specfile, data_spec)
|
||||||
|
spec_cleaner(specfile)
|
||||||
|
else:
|
||||||
|
log.warning('Will not create package, --obs-project-dir was not declared')
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(format='%(asctime)s %(levelname)s - %(funcName)s: %(message)s', datefmt='%H:%M:%S')
|
logging.basicConfig(format='%(asctime)s %(levelname)s - %(funcName)s: %(message)s', datefmt='%H:%M:%S')
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user