[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20181020-16-g9d099cf
jturney@sourceware.org
jturney@sourceware.org
Sun May 26 19:19:00 GMT 2019
https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=9d099cf0816fd73758593c958d9aff804b534b2b
commit 9d099cf0816fd73758593c958d9aff804b534b2b
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Sun May 26 12:03:19 2019 +0100
Write package metadata summary
Write a summary of package metadata in json format.
Diff:
---
calm/calm.py | 10 ++++++++++
calm/package.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/calm/calm.py b/calm/calm.py
index 3b7ea79..76ffd39 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -56,6 +56,7 @@ from collections import defaultdict
from contextlib import ExitStack
import argparse
import logging
+import lzma
import os
import shutil
import signal
@@ -452,6 +453,15 @@ def do_output(args, state):
logging.debug("removing %s, unchanged %s" % (tmpfile.name, inifile))
os.remove(tmpfile.name)
+ # write packages.json
+ jsonfile = os.path.join(args.htdocs, 'packages.json.xz')
+ with tempfile.NamedTemporaryFile(mode='wb', delete=False) as tmpfile:
+ logging.debug('writing %s' % (tmpfile.name))
+ with lzma.open(tmpfile, 'wt') as lzf:
+ package.write_repo_json(args, state.packages, lzf)
+ logging.info("moving %s to %s" % (tmpfile.name, jsonfile))
+ shutil.move(tmpfile.name, jsonfile)
+
#
# daemonization loop
diff --git a/calm/package.py b/calm/package.py
index c90d955..5710185 100755
--- a/calm/package.py
+++ b/calm/package.py
@@ -29,6 +29,7 @@ from collections import defaultdict
import copy
import difflib
import hashlib
+import json
import logging
import os
import pprint
@@ -1024,6 +1025,59 @@ def upper_first_character(s):
#
+# write a json summary of packages
+#
+def write_repo_json(args, packages, f):
+ package_list = set()
+ for arch in packages:
+ package_list.update(packages[arch])
+
+ mlist = maintainers.Maintainer.read(args, None)
+ pkg_maintainers = maintainers.Maintainer.invert(mlist)
+
+ pl = []
+ for pn in sorted(package_list):
+ po = None
+ arches = []
+ for arch in common_constants.ARCHES:
+ if pn in packages[arch]:
+ po = packages[arch][pn]
+ arches.append(arch)
+
+ bv = po.best_version
+
+ if po.version_hints[bv].get('external-source', None):
+ continue
+
+ versions = {}
+ for vr in sorted(po.version_hints.keys(), key=lambda v: SetupVersion(v)):
+ key = 'test' if 'test' in po.version_hints[vr] else 'stable'
+ versions[key] = versions.get(key, []) + [vr]
+
+ d = {
+ 'name': pn,
+ 'versions': versions,
+ 'summary': po.version_hints[bv].get('sdesc', '').strip('"'),
+ 'categories': po.version_hints[bv].get('category', '').split(),
+ 'subpackages': [{'name': sp} for sp in po.is_used_by],
+ 'arches': arches,
+ }
+
+ if pkg_maintainers[pn] and ('ORPHANED' not in pkg_maintainers[pn]):
+ d['maintainers'] = pkg_maintainers[pn]
+
+ pl.append(d)
+
+ j = {
+ 'repository_name': args.release,
+ 'timestamp': int(time.time()),
+ 'num_packages': len(pl),
+ 'packages': pl,
+ }
+ json.dump(j, f)
+
+
+#
# merge sets of packages
#
# for each package which exist in both a and b:
More information about the Cygwin-apps-cvs
mailing list