MiddleArch/middlearch/package.py

105 lines
3.6 KiB
Python
Raw Permalink Normal View History

2021-08-31 00:11:27 +02:00
import hashlib, logging, os, re
import jinja2 as j2
import os.path as path
import requests as r
import yaml
2022-01-12 01:07:56 +01:00
from .git import get_tag_from_git
2021-08-31 00:11:27 +02:00
class Package(object):
def __init__(self, name, **params):
self.name = name
self.repo = params.get("repo")
self.tag = params.get("tag") or get_tag_from_git(self.repo)
self.force = params.get("force", False)
self.render = params.get("render", True)
self.maintainers = params.get("maintainers", {})
self.contributors = params.get("contributors", {})
self.build = False
2022-01-12 21:46:59 +01:00
self.ignore = params.get("ignore", False)
2021-08-31 00:11:27 +02:00
logging.debug(self)
2022-01-12 01:07:56 +01:00
@property
def template(self):
return self.name + ".j2"
2021-08-31 00:11:27 +02:00
def __repr__(self):
return f"{self.name} [repo: {self.repo}, tag: {self.tag}, force: {self.force}]"
2022-01-12 01:07:56 +01:00
def load(config, repository):
with open(path.join(config.dir, "packages.yaml")) as file:
2021-08-31 00:11:27 +02:00
p_list = yaml.load(file, Loader=yaml.SafeLoader)
packages = []
for p in p_list:
package = Package(**p)
2022-01-12 01:07:56 +01:00
package.pkgbuild = path.join(config.dir, f"pkgbuilds/{package.name}.j2")
2021-08-31 00:11:27 +02:00
packages.append(package)
2022-01-12 01:07:56 +01:00
current_version, current_rev = repository.get_package_version(package.name)
2021-08-31 00:11:27 +02:00
2022-01-12 01:07:56 +01:00
if package.tag > current_version:
package.rel = 1
2021-08-31 00:11:27 +02:00
package.build = True
elif package.force:
2022-01-12 01:07:56 +01:00
package.rel = current_rev + 1
2021-08-31 00:11:27 +02:00
package.build = True
2022-01-12 01:07:56 +01:00
else:
package.rel = current_rev
if package.build:
logging.info(f"{package.name} will be updated ({current_version}-{current_rev}{package.tag}-{package.rel})")
2021-08-31 00:11:27 +02:00
else:
logging.info(f"{package.name} will be skipped")
logging.info(f"{len(packages)} packages loaded")
return packages
2022-01-12 01:07:56 +01:00
def get_source_hash(self, config):
regex = re.compile("^source=.+(https?://.+\.tar\.[a-z]+)", re.MULTILINE)
with open(path.join(config.dir, "pkgbuilds", self.template)) as file:
content = file.read()
try:
url = regex.search(content).group(1)
except:
logging.warning(f"cannot find valid source for {self.name} (is it a git version?)")
return "SKIP"
url = url.replace("${pkgver}", self.tag)
url = url.replace("${pkgname}", self.name)
try:
archive = r.get(url, timeout=10)
except Exception as e:
logging.warning(f"cannot retreive {url}")
logging.debug(e)
return "SKIP"
hash = hashlib.sha256(archive.content).hexdigest()
return hash
2021-08-31 00:11:27 +02:00
2022-01-12 01:07:56 +01:00
def render_pkgbuild(self, config):
2021-08-31 00:11:27 +02:00
env = j2.Environment(
2022-01-12 01:07:56 +01:00
loader=j2.FileSystemLoader(path.join(config.dir, "pkgbuilds")),
2021-08-31 00:11:27 +02:00
autoescape=j2.select_autoescape([])
)
2022-01-12 01:07:56 +01:00
template = env.get_template(self.template)
hash = self.get_source_hash(config)
2021-08-31 00:11:27 +02:00
sysenv = j2.Environment(
2022-01-12 01:07:56 +01:00
loader=j2.FileSystemLoader('middlearch'),
2021-08-31 00:11:27 +02:00
autoescape=j2.select_autoescape([])
)
maintainers_template = sysenv.get_template("maintainers.j2")
2022-01-12 01:07:56 +01:00
dest_dir = path.join(config.get('output'), self.name)
dest_file = path.join(dest_dir, "PKGBUILD")
2021-08-31 00:11:27 +02:00
os.makedirs(dest_dir, exist_ok=True)
2022-01-12 01:07:56 +01:00
with open(dest_file, "w") as file:
2021-08-31 00:11:27 +02:00
file.write(maintainers_template.render(
maintainers=self.maintainers,
contributors=self.contributors
))
2022-01-12 01:07:56 +01:00
file.write(template.render(name=self.name, tag=self.tag, rel=self.rel, hash=hash))