[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20181020-16-g9d099cf

jturney-9JcytcrH/[email protected]
Newsgroups gmane.os.cygwin.cvs.apps
Message-ID <[email protected]>


https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=9d099cf0816fd73758593c958d9aff804b534b2b

commit 9d099cf0816fd73758593c958d9aff804b534b2b
Author: Jon Turney <[email protected]>
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:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.