Diff:
---
 calm/calm.py                                       |   4 +-
 calm/db.py                                         | 266 ++++++++++++++-------
 calm/maintainers.py                                |   9 +-
 calm/package.py                                    |  16 +-
 calm/past_mistakes.py                              |   2 +
 calm/pkg2html.py                                   |   3 +
 calm/uploads.py                                    |  12 +-
 requirements.txt                                   |   1 +
 test/test_calm.py                                  |  12 +-
 test/testdata/htdocs.expected/summary/arc-src.html |   1 +
 test/testdata/htdocs.expected/summary/arc.html     |   1 +
 .../htdocs.expected/summary/base-cygwin.html       |   1 +
 .../htdocs.expected/summary/corrupt-src.html       |   1 +
 test/testdata/htdocs.expected/summary/corrupt.html |   1 +
 .../htdocs.expected/summary/cygwin-debuginfo.html  |   1 +
 .../htdocs.expected/summary/cygwin-devel.html      |   1 +
 .../htdocs.expected/summary/cygwin-src.html        |   1 +
 test/testdata/htdocs.expected/summary/cygwin.html  |   1 +
 .../htdocs.expected/summary/keychain-src.html      |   1 +
 .../testdata/htdocs.expected/summary/keychain.html |   1 +
 .../htdocs.expected/summary/libdns_sd-devel.html   |   1 +
 .../htdocs.expected/summary/libdns_sd1.html        |   1 +
 .../htdocs.expected/summary/mDNSResponder-src.html |   1 +
 .../htdocs.expected/summary/mDNSResponder.html     |   1 +
 .../htdocs.expected/summary/obs-a-src.html         |   1 +
 test/testdata/htdocs.expected/summary/obs-a.html   |   1 +
 .../htdocs.expected/summary/obs-b-src.html         |   1 +
 test/testdata/htdocs.expected/summary/obs-b.html   |   1 +
 .../htdocs.expected/summary/openssh-src.html       |   1 +
 test/testdata/htdocs.expected/summary/openssh.html |   1 +
 .../per-version-replacement-hint-only-src.html     |   1 +
 .../summary/per-version-replacement-hint-only.html |   1 +
 .../htdocs.expected/summary/per-version-src.html   |   1 +
 .../htdocs.expected/summary/per-version.html       |   1 +
 .../summary/perl-Net-SMTP-SSL-src.html             |   1 +
 .../htdocs.expected/summary/perl-Net-SMTP-SSL.html |   1 +
 .../htdocs.expected/summary/rpm-doc-src.html       |   1 +
 test/testdata/htdocs.expected/summary/rpm-doc.html |   3 +-
 .../htdocs.expected/summary/staleversion-src.html  |   1 +
 .../htdocs.expected/summary/staleversion.html      |   1 +
 .../htdocs.expected/summary/test-c-src.html        |   1 +
 test/testdata/htdocs.expected/summary/test-c.html  |   1 +
 .../htdocs.expected/summary/test-d-src.html        |   1 +
 test/testdata/htdocs.expected/summary/test-d.html  |   1 +
 .../htdocs.expected/summary/test-e-src.html        |   1 +
 test/testdata/htdocs.expected/summary/test-e.html  |   1 +
 .../htdocs.expected/summary/testpackage-src.html   |   1 +
 .../htdocs.expected/summary/testpackage.html       |   1 +
 test/testdata/process_arch/packages.json.expected  |  16 ++
 49 files changed, 287 insertions(+), 95 deletions(-)

diff --git a/calm/calm.py b/calm/calm.py
index 786c34a..1223633 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -179,7 +179,7 @@ def process_maintainer_uploads(args, state, all_packages, 
m, basedir, desc, scru
 
     # check upload is authorized
     if not scan_result.error:
-        uploads.auth_check(args, m, scan_result, state.packages)
+        uploads.auth_check(args, m, scan_result, state.packages, record is 
None)
 
     if scan_result.error:
         logging.error("error while reading uploaded packages from maintainer 
%s" % (m.name))
@@ -922,7 +922,6 @@ def main():
     htdocs_default = os.path.join(common_constants.HTDOCS, 'packages')
     homedir_default = common_constants.HOMEDIR
     stagingdir_default = common_constants.STAGINGDIR
-    trustedmaint_default = common_constants.TRUSTEDMAINT
     pidfile_default = '/sourceware/cygwin-staging/lock/calm.pid'
     pkglist_default = common_constants.PKGMAINT
     relarea_default = common_constants.FTP
@@ -940,7 +939,6 @@ def main():
     parser.add_argument('--htdocs', action='store', metavar='DIR', 
help="htdocs output directory (default: " + htdocs_default + ")", 
default=htdocs_default)
     parser.add_argument('--key', action='append', metavar='KEYID', help="key 
to use to sign setup.ini", default=key_default, dest='keys')
     parser.add_argument('--logdir', action='store', metavar='DIR', help="log 
directory (default: '" + logdir_default + "')", default=logdir_default)
-    parser.add_argument('--trustedmaint', action='store', metavar='NAMES', 
help="trusted package maintainers (default: '" + trustedmaint_default + "')", 
default=trustedmaint_default)
     parser.add_argument('--pkglist', action='store', metavar='FILE', 
help="package maintainer list (default: " + pkglist_default + ")", 
default=pkglist_default)
     parser.add_argument('--release', action='store', help='value for 
setup-release key (default: cygwin)', default='cygwin')
     parser.add_argument('--releasearea', action='store', metavar='DIR', 
help="release directory (default: " + relarea_default + ")", 
default=relarea_default, dest='rel_area')
diff --git a/calm/db.py b/calm/db.py
index 5adbb76..4915f2b 100644
--- a/calm/db.py
+++ b/calm/db.py
@@ -25,51 +25,119 @@
 # package db
 #
 
-
 import logging
 import os
-import sqlite3
+
+import peewee
 
 from . import package
 from . import utils
 
 
+# database instance
+_db = None
+# tests currently need to be able to adjust this default
+_uploads_allowed_default = False
+
+
+# Get or create the global database instance, and initialize tables
+def get_db(args):
+    global _db
+    if _db is None:
+        utils.makedirs(args.htdocs)
+        dbfn = os.path.join(args.htdocs, 'calm.db')
+        logging.debug("sqlite3 database %s" % (dbfn))
+        _db = peewee.SqliteDatabase(dbfn, autoconnect=False)
+
+        models = [HistoricPackageName, VaultRequest, MissingObsolete, 
AnnounceMsgid, Maintainer]
+
+        # set the database for all models
+        for model in models:
+            model.initialize(_db)
+
+        # create tables, if they don't exist
+        with _db.connection_context():
+            _db.create_tables(models)
+
+    return _db
+
+
+# Reset the global database instance
+def reset_db():
+    global _db
+    if _db is not None:
+        _db.close()
+        _db = None
+
+
+# Model definitions
+class BaseModel(peewee.Model):
+    class Meta:
+        database = peewee.SqliteDatabase(None)  # Will be set dynamically
+
+    @classmethod
+    def initialize(cls, db):
+        cls._meta.database = db
+
+
+# table which tracks all the package names we have ever seen
+class HistoricPackageName(BaseModel):
+    name = peewee.TextField(primary_key=True)
+
+    class Meta:
+        table_name = 'historic_package_names'
+
+
+# table for vault requests made via 'calm-tool vault'
+class VaultRequest(BaseModel):
+    request_by = peewee.TextField()
+    srcpackage = peewee.TextField()
+    vr = peewee.TextField()
+
+    class Meta:
+        table_name = 'vault_requests'
+        primary_key = False
+
+
+# table recording accumulated missing_obsoletes data for packages
+class MissingObsolete(BaseModel):
+    arch = peewee.TextField()
+    name = peewee.TextField()
+    replaces = peewee.TextField()
+
+    class Meta:
+        table_name = 'missing_obsolete'
+        indexes = (
+            (('name', 'arch'), True),  # Unique composite primary key
+        )
+        primary_key = peewee.CompositeKey('arch', 'name')
+
+
+# table recording reply-to message ID for package announcements
+class AnnounceMsgid(BaseModel):
+    msgid = peewee.TextField()
+    srcpackage = peewee.TextField(primary_key=True)
+
+    class Meta:
+        table_name = 'announce_msgid'
+
+
+class Maintainer(BaseModel):
+    name = peewee.TextField(primary_key=True)
+    email = peewee.TextField(null=True)
+    last_reminder = peewee.DateTimeField(null=True)
+    last_seen = peewee.DateTimeField(null=True)
+    is_trusted = peewee.BooleanField(default=False)
+    uploads_allowed = peewee.BooleanField(default=False)
+
+    class Meta:
+        table_name = 'maintainers'
+
+
+# connect to the database
 def connect(args):
-    utils.makedirs(args.htdocs)
-    dbfn = os.path.join(args.htdocs, 'calm.db')
-    logging.debug("sqlite3 database %s" % (dbfn))
-
-    conn = sqlite3.connect(dbfn, detect_types=sqlite3.PARSE_DECLTYPES)
-    conn.execute('''CREATE TABLE IF NOT EXISTS historic_package_names
-                    (name TEXT NOT NULL PRIMARY KEY
-                    )''')
-
-    conn.execute('''CREATE TABLE IF NOT EXISTS vault_requests
-                    (srcpackage TEXT NOT NULL,
-                     vr TEXT NOT NULL,
-                     request_by TEXT NOT NULL
-                    )''')
-
-    conn.execute('''CREATE TABLE IF NOT EXISTS missing_obsolete
-                    (name TEXT NOT NULL,
-                     arch TEXT NOT NULL,
-                     replaces TEXT NOT NULL,
-                     PRIMARY KEY (name, arch)
-                    )''')
-    conn.execute('''CREATE TABLE IF NOT EXISTS announce_msgid
-                    (srcpackage TEXT NOT NULL PRIMARY KEY,
-                     msgid TEXT NOT NULL
-                    )''')
-
-    # migrations
-    cursor = conn.execute("SELECT * FROM vault_requests LIMIT 1")
-    cols = [row[0] for row in cursor.description]
-    if 'request_by' not in cols:
-        cursor.execute("ALTER TABLE vault_requests ADD COLUMN request_by TEXT 
NOT NULL DEFAULT ''")
-
-    conn.commit()
-
-    return conn
+
+    return get_db(args)
 
 
 #
@@ -77,17 +145,19 @@ def connect(args):
 # ones which aren't in the set of names for current package
 #
 def update_package_names(args, packages):
+    db = connect(args)
     current_names = set(packages.keys())
 
-    with connect(args) as conn:
-        conn.row_factory = sqlite3.Row
-
-        cur = conn.execute("SELECT name FROM historic_package_names")
-        historic_names = set([row['name'] for row in cur.fetchall()])
+    with db.connection_context():
+        # get all historic names
+        historic_names = set(
+            row.name for row in HistoricPackageName.select()
+        )
 
         # add newly appearing names to current_names
-        for n in (current_names - historic_names):
-            conn.execute('INSERT INTO historic_package_names (name) VALUES 
(?)', (n,))
+        new_names = current_names - historic_names
+        for n in new_names:
+            HistoricPackageName.create(name=n)
             logging.debug("package '%s' name is added" % (n))
 
     # this is data isn't quite perfect for this purpose: it doesn't know about:
@@ -100,28 +170,29 @@ def update_package_names(args, packages):
 # vault requests made via 'calm-tool vault'
 #
 def vault_requests(args, m):
+    db = connect(args)
     requests = {}
 
-    with connect(args) as conn:
-        conn.row_factory = sqlite3.Row
-
-        cur = conn.execute("SELECT * FROM vault_requests WHERE request_by = 
?", (m,))
-        for row in cur.fetchall():
-            spkg = row['srcpackage']
+    with db.connection_context():
+        # get all requests for this user
+        for row in VaultRequest.select().where(VaultRequest.request_by == m):
+            spkg = row.srcpackage
             if spkg not in requests:
                 requests[spkg] = set()
-            requests[spkg].add(row)
-            requests[spkg].add(row['vr'])
+            requests[spkg].add(row.vr)
 
-        # remove all rows
-        cur = conn.execute("DELETE FROM vault_requests WHERE request_by = ?", 
(m,))
+        # remove all rows for this user
+        VaultRequest.delete().where(VaultRequest.request_by == m).execute()
 
     return requests
 
 
+# Add a vault request
 def vault_request_add(args, p, v, m):
-    with connect(args) as conn:
-        conn.execute('INSERT INTO vault_requests (srcpackage, vr, request_by) 
VALUES (?,?, ?)', (p, v, m))
+    db = connect(args)
+
+    with db.connection_context():
+        VaultRequest.create(srcpackage=p, vr=v, request_by=m)
 
 
 #
@@ -131,41 +202,72 @@ def vault_request_add(args, p, v, m):
 # N.B. missing_obsolete data only exists for historic, and should be only
 # applied to, x86_64 packages
 def update_missing_obsolete(args, packages):
+    db = connect(args)
     data = {}
-    with connect(args) as conn:
-        conn.row_factory = sqlite3.Row
-
-        # read
-        cur = conn.execute("SELECT name, replaces FROM missing_obsolete")
-        for row in cur.fetchall():
-            data[row['name']] = set(row['replaces'].split())
-
-        # update missing obsoletes data
-        missing_obsolete = package.upgrade_oldstyle_obsoletes(packages, 
data.copy())
 
-        # update
-        for n, r in missing_obsolete.items():
-            if n not in data:
-                conn.execute('INSERT INTO missing_obsolete (name, arch, 
replaces) VALUES (?, ? , ?)', (n, 'x8_64', ' '.join(r)))
+    with db.connection_context():
+        # read ...
+        for row in MissingObsolete.select():
+            data[row.name] = set(row.replaces.split())
+
+        # then update missing obsoletes data
+        missing_obsolete = package.upgrade_oldstyle_obsoletes(
+            packages, data.copy()
+        )
+
+        # write updated records
+        for name, replaces in missing_obsolete.items():
+            replaces_str = ' '.join(replaces)
+            if name not in data:
+                MissingObsolete.create(
+                    name=name,
+                    arch='x86_64',
+                    replaces=replaces_str
+                )
             else:
-                conn.execute('UPDATE missing_obsolete SET replaces = ? WHERE 
name = ? AND arch = ?', (' '.join(r), n, 'x86_64'))
+                (MissingObsolete.update(replaces=replaces_str)
+                 .where((MissingObsolete.name == name) &
+                        (MissingObsolete.arch == 'x86_64'))
+                 .execute())
 
     return missing_obsolete
 
 
 def announce_msgid_get(args, srcpackage):
-    msgid = None
-    with connect(args) as conn:
-        conn.row_factory = sqlite3.Row
+    db = connect(args)
 
-        cur = conn.execute("SELECT msgid FROM announce_msgid WHERE srcpackage 
= ?", (srcpackage,))
-        row = cur.fetchone()
-        if row:
-            msgid = row['msgid']
-
-    return msgid
+    with db.connection_context():
+        try:
+            row = AnnounceMsgid.get_by_id(srcpackage)
+            return row.msgid
+        except AnnounceMsgid.DoesNotExist:
+            return None
 
 
 def announce_msgid_set(args, srcpackage, msgid):
-    with connect(args) as conn:
-        conn.execute('INSERT INTO announce_msgid (srcpackage, msgid) VALUES 
(?, ?)', (srcpackage, msgid))
+    db = connect(args)
+
+    with db.connection_context():
+        AnnounceMsgid.create(srcpackage=srcpackage, msgid=msgid)
+
+
+def maintainer_info(args, mlist):
+    db = connect(args)
+
+    with db.connection_context():
+        for m in mlist.values():
+            if m.name == 'ORPHANED':
+                continue
+
+            mi = Maintainer.get_or_none(Maintainer.name == m.name)
+            if mi:
+                m.uploads_allowed = mi.uploads_allowed
+            else:
+                mi = Maintainer.create(name=m.name)
+                mi.uploads_allowed = _uploads_allowed_default
+
+            mi.email = ','.join(m.email)
+            mi.last_reminder = m.reminder_time
+            mi.last_seen = m.last_seen
+            mi.is_trusted = m.is_trusted
+            mi.save()
diff --git a/calm/maintainers.py b/calm/maintainers.py
index f78e8db..e6521d0 100644
--- a/calm/maintainers.py
+++ b/calm/maintainers.py
@@ -41,6 +41,8 @@ import os
 import re
 from collections import UserString
 
+from . import common_constants
+from . import db
 from . import utils
 
 
@@ -85,7 +87,8 @@ class Maintainer(object):
         self.email = email
         self.pkgs = pkgs
         self.quiet = False
-        self.has_homedir = os.path.isdir(self.homedir())
+        self.uploads_allowed = False
+        self.is_trusted = (self.name in 
common_constants.TRUSTEDMAINT.split('/'))
 
         # the mtime of this file records the timestamp
         reminder_file = os.path.join(self.homedir(), '!reminder-timestamp')
@@ -289,6 +292,9 @@ def maintainer_list(args):
     # read information from homedirs
     mlist = add_directories(mlist, args.homedir)
 
+    # read and update information in db
+    db.maintainer_info(args, mlist)
+
     # check all maintainers have an email
     for m in mlist.values():
         if m.name == 'ORPHANED':
@@ -319,6 +325,5 @@ def all_packages(pkglist):
 #
 
 if __name__ == "__main__":
-    from . import common_constants
     p = pkg_list(common_constants.PKGMAINT)
     print(p['xwininfo'].maintainers())
diff --git a/calm/package.py b/calm/package.py
index 07b0a1b..5efcb4b 100755
--- a/calm/package.py
+++ b/calm/package.py
@@ -60,7 +60,8 @@ class Kind(Enum):
 class Importance(IntEnum):
     base = 1     # has base category
     basedep = 2  # doesn't have base category, but is depended on by something 
that does
-    other = 3    # all others
+    normal = 3   # normal
+    leaf = 4     # dependency leaf
 
     def __str__(self):
         return self.name
@@ -1158,7 +1159,15 @@ def validate_packages(args, packages, 
valid_provides_extra=None, missing_obsolet
 def assign_importance(packages):
     # XXX: if we had some package popularity data, we'd use it here
     for po in packages.values():
-        po.importance = Importance.other
+        po.importance = Importance.leaf
+
+    # give packages which are dependencies or build-dependencies of another
+    # package the normal importance
+    for po in packages.values():
+        bv = po.best_version
+        es = po.version_hints[bv].get('external-source', None)
+        if po.build_rdepends or 
any(packages[p].srcpackage(packages[p].best_version) != es for p in 
po.rdepends):
+            po.importance = Importance.normal
 
     # recursively give dependencies of base packages the basedep importance
     def recursive_basedep(p):
@@ -1167,7 +1176,7 @@ def assign_importance(packages):
         requires = deplist_without_versions(requires)
         for r in requires:
             if r in packages:
-                if packages[r].importance == Importance.other:
+                if packages[r].importance >= Importance.normal:
                     packages[r].importance = Importance.basedep
                     recursive_basedep(packages[r])
 
@@ -1522,6 +1531,7 @@ def write_repo_json(args, packages, f):
             'versions': versions,
             'summary': po.version_hints[bv]['sdesc'].strip('"'),
             'arches': arches,
+            'importance': str(po.importance),
         }
 
         spl = []
diff --git a/calm/past_mistakes.py b/calm/past_mistakes.py
index 0573000..d5adc4f 100644
--- a/calm/past_mistakes.py
+++ b/calm/past_mistakes.py
@@ -177,6 +177,8 @@ nonexistent_provides = historical_provides + [
     'python36-devel',
     'python36-test',
     'python36-tkinter',
+    # python 36 modules
+    'python36-.*',
     # other
     'glade3',
     'libtidy0_99_0',
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index 2f4b658..ea9c271 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -334,6 +334,8 @@ def update_package_listings(args, packages):
 
                             details_table['repology info'] = '<a 
href="https://repology.org/project/%s/information";>%s</a> %s' % (repology_pn, 
repology_pn, upstream_version)
 
+                    details_table['importance'] = po.importance
+
                     if po.kind == package.Kind.binary:
                         doc_path = os.path.join(args.htdocs, 'doc', pn)
                         if os.path.exists(doc_path):
@@ -347,6 +349,7 @@ def update_package_listings(args, packages):
                     # output details table
                     print('<table class="pkgdetails">', file=f)
                     for d, v in details_table.items():
+                        v = str(v)
                         if not v.startswith('<p>'):
                             v = '<p>' + v + '</p>'
                         print('<tr><td><p><span 
class="detail">%s</span>:</p></td><td>%s</td></tr>' % (d, v), file=f)
diff --git a/calm/uploads.py b/calm/uploads.py
index 527495a..135629a 100644
--- a/calm/uploads.py
+++ b/calm/uploads.py
@@ -165,7 +165,7 @@ def scan(scandir, m, all_packages, args):
             continue
 
         # only process packages for which we are listed as a maintainer, or we 
are a trusted maintainer
-        if not ((superpackage in m.pkgs) or (m.name in 
args.trustedmaint.split('/'))):
+        if not ((superpackage in m.pkgs) or (m.is_trusted)):
             error = True
             logging.warning("package '%s' is not in the package list for 
maintainer '%s'" % (superpackage, m.name))
             continue
@@ -357,9 +357,15 @@ def remove(args, remove):
 # uploaded, the uploader is authorized for all the existing places (auth_paths)
 # the package exists as well...
 #
-def auth_check(args, m, scan_result, packages):
+def auth_check(args, m, scan_result, packages, direct_upload):
     # if uploader is a trusted maintainer, it's ok
-    if m.name in args.trustedmaint.split('/'):
+    if m.is_trusted:
+        return
+
+    # direct uploads must now be explicitly enabled for a maintainer
+    if packages and direct_upload and not m.uploads_allowed:
+        logging.error("direct uploads are not enabled for maintainer '%s'" % 
(m.name))
+        scan_result.error = True
         return
 
     # A package upload (perhaps at a new path (= from a different source
diff --git a/requirements.txt b/requirements.txt
index 62cc827..e81a913 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,7 @@ flake8-builtins
 flake8-import-order
 license_expression
 markdown
+peewee
 pidlockfile
 pycodestyle
 python-daemon
diff --git a/test/test_calm.py b/test/test_calm.py
index fd7dc5c..88157be 100755
--- a/test/test_calm.py
+++ b/test/test_calm.py
@@ -40,6 +40,7 @@ import types
 import unittest
 
 import calm.calm
+import calm.db as db
 import calm.hint as hint
 import calm.maintainers as maintainers
 import calm.package as package
@@ -294,6 +295,8 @@ class CalmTest(unittest.TestCase):
         args = types.SimpleNamespace()
         args.homedir = 'testdata/homes'
         args.pkglist = 'testdata/pkglist/cygwin-pkg-maint'
+        args.htdocs = 'testdata/htdocs'
+
         mlist = {}
         mlist = maintainers.maintainer_list(args)
 
@@ -506,6 +509,13 @@ class CalmTest(unittest.TestCase):
         for d in ARGDIRS:
             shutil.rmtree(getattr(args, d))
 
+    def setUp(self):
+        db._uploads_allowed_default = True
+
+    def tearDown(self):
+        # after every test, reset the implicit global state hidden in db
+        db.reset_db()
+
     @classmethod
     def setUpClass(cls):
         # testdata is located in the same directory as this file
@@ -544,7 +554,7 @@ class CalmTest(unittest.TestCase):
                    (os.path.join(relarea_arch, 'per-version', 
'per-version-4.0-1-src.tar.xz'), '2017-04-09'),
                    (os.path.join(relarea_arch, 'rpm-doc', 
'rpm-doc-4.1-2.tar.bz2'), '2016-11-02'),
                    (os.path.join(relarea_arch, 'rpm-doc', 
'rpm-doc-4.1-2-src.tar.bz2'), '2016-11-02'),
-                   (os.path.join(relarea_arch, 'rpm-doc', 
'rpm-doc-999-1.tar.bz2'), '2024-03-02'),
+                   (os.path.join(relarea_arch, 'rpm-doc', 
'rpm-doc-999-1.tar.bz2'), '2026-03-02'),
                    (os.path.join(relarea_arch, 'staleversion', 
'staleversion-240-1.tar.xz'), '2017-04-07'),
                    (os.path.join(relarea_arch, 'staleversion', 
'staleversion-240-1-src.tar.xz'), '2017-04-07'),
                    (os.path.join(relarea_arch, 'staleversion', 
'staleversion-242-0.tar.xz'), '2017-04-08'),
diff --git a/test/testdata/htdocs.expected/summary/arc-src.html 
b/test/testdata/htdocs.expected/summary/arc-src.html
index c2794d0..b981a02 100755
--- a/test/testdata/htdocs.expected/summary/arc-src.html
+++ b/test/testdata/htdocs.expected/summary/arc-src.html
@@ -23,6 +23,7 @@ the best of packing, squeezing, or crunching is 
used.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_jari_aalto.html">Jari Aalto</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/arc.html 
b/test/testdata/htdocs.expected/summary/arc.html
index a068aba..273a1fe 100755
--- a/test/testdata/htdocs.expected/summary/arc.html
+++ b/test/testdata/htdocs.expected/summary/arc.html
@@ -23,6 +23,7 @@ the best of packing, squeezing, or crunching is 
used.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_jari_aalto.html">Jari Aalto</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/base-cygwin.html 
b/test/testdata/htdocs.expected/summary/base-cygwin.html
index a1d69f3..e5f52c4 100755
--- a/test/testdata/htdocs.expected/summary/base-cygwin.html
+++ b/test/testdata/htdocs.expected/summary/base-cygwin.html
@@ -20,6 +20,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_corinna_vinschen.html">Corinna Vinschen</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/corrupt-src.html 
b/test/testdata/htdocs.expected/summary/corrupt-src.html
index 3cee76d..1e6267c 100755
--- a/test/testdata/htdocs.expected/summary/corrupt-src.html
+++ b/test/testdata/htdocs.expected/summary/corrupt-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/corrupt.html 
b/test/testdata/htdocs.expected/summary/corrupt.html
index 770831c..b785142 100755
--- a/test/testdata/htdocs.expected/summary/corrupt.html
+++ b/test/testdata/htdocs.expected/summary/corrupt.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html 
b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
index db73350..e20c7a3 100755
--- a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
@@ -21,6 +21,7 @@ cygwin package with gdb.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_corinna_vinschen.html">Corinna Vinschen</a>, <a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-devel.html 
b/test/testdata/htdocs.expected/summary/cygwin-devel.html
index a48f771..bba58f2 100755
--- a/test/testdata/htdocs.expected/summary/cygwin-devel.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-devel.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_corinna_vinschen.html">Corinna Vinschen</a>, <a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-src.html 
b/test/testdata/htdocs.expected/summary/cygwin-src.html
index 5d24971..59d3900 100755
--- a/test/testdata/htdocs.expected/summary/cygwin-src.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-src.html
@@ -20,6 +20,7 @@
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
 <tr><td><p><span class="detail">packaging repository</span>:</p></td><td><p><a 
href="/cgit/cygwin-packages/cygwin/">cygwin.git</a></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/cygwin.html 
b/test/testdata/htdocs.expected/summary/cygwin.html
index ade7cfc..229435f 100755
--- a/test/testdata/htdocs.expected/summary/cygwin.html
+++ b/test/testdata/htdocs.expected/summary/cygwin.html
@@ -20,6 +20,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_corinna_vinschen.html">Corinna Vinschen</a>, <a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/keychain-src.html 
b/test/testdata/htdocs.expected/summary/keychain-src.html
index b09df93..6da003b 100755
--- a/test/testdata/htdocs.expected/summary/keychain-src.html
+++ b/test/testdata/htdocs.expected/summary/keychain-src.html
@@ -26,6 +26,7 @@ necessary</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_jari_aalto.html">Jari Aalto</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/keychain.html 
b/test/testdata/htdocs.expected/summary/keychain.html
index 5fa699c..9887fb7 100755
--- a/test/testdata/htdocs.expected/summary/keychain.html
+++ b/test/testdata/htdocs.expected/summary/keychain.html
@@ -27,6 +27,7 @@ necessary</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_jari_aalto.html">Jari Aalto</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 <tr><td><p><span class="detail">readme</span>:</p></td><td><p><a 
href="../doc/keychain/keychain.README">keychain.README</a></p></td></tr>
 </table><br>
 <table class="pkgtable">
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html 
b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
index 9d021f9..45f272b 100755
--- a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
@@ -21,6 +21,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd1.html 
b/test/testdata/htdocs.expected/summary/libdns_sd1.html
index 486ea30..b399738 100755
--- a/test/testdata/htdocs.expected/summary/libdns_sd1.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd1.html
@@ -21,6 +21,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder-src.html 
b/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
index b4897b3..e96d83e 100755
--- a/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
@@ -20,6 +20,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder.html 
b/test/testdata/htdocs.expected/summary/mDNSResponder.html
index cea5a9f..fe34e49 100755
--- a/test/testdata/htdocs.expected/summary/mDNSResponder.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder.html
@@ -21,6 +21,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/obs-a-src.html 
b/test/testdata/htdocs.expected/summary/obs-a-src.html
index aa382ad..e3fbc40 100755
--- a/test/testdata/htdocs.expected/summary/obs-a-src.html
+++ b/test/testdata/htdocs.expected/summary/obs-a-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/obs-a.html 
b/test/testdata/htdocs.expected/summary/obs-a.html
index bce157a..ceb517f 100755
--- a/test/testdata/htdocs.expected/summary/obs-a.html
+++ b/test/testdata/htdocs.expected/summary/obs-a.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/obs-b-src.html 
b/test/testdata/htdocs.expected/summary/obs-b-src.html
index d50976c..de699b4 100755
--- a/test/testdata/htdocs.expected/summary/obs-b-src.html
+++ b/test/testdata/htdocs.expected/summary/obs-b-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/obs-b.html 
b/test/testdata/htdocs.expected/summary/obs-b.html
index 37ff9a4..6214920 100755
--- a/test/testdata/htdocs.expected/summary/obs-b.html
+++ b/test/testdata/htdocs.expected/summary/obs-b.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/openssh-src.html 
b/test/testdata/htdocs.expected/summary/openssh-src.html
index c3a25ec..f9008c1 100755
--- a/test/testdata/htdocs.expected/summary/openssh-src.html
+++ b/test/testdata/htdocs.expected/summary/openssh-src.html
@@ -20,6 +20,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_corinna_vinschen.html">Corinna Vinschen</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/openssh.html 
b/test/testdata/htdocs.expected/summary/openssh.html
index b815c04..54af4a7 100755
--- a/test/testdata/htdocs.expected/summary/openssh.html
+++ b/test/testdata/htdocs.expected/summary/openssh.html
@@ -21,6 +21,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_corinna_vinschen.html">Corinna Vinschen</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git 
a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
 
b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
index d7bed3a..85f8e49 100755
--- 
a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
+++ 
b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git 
a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html 
b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
index 0121bf9..edb9d0c 100755
--- 
a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
+++ 
b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/per-version-src.html 
b/test/testdata/htdocs.expected/summary/per-version-src.html
index e0a1dfa..dda1c72 100755
--- a/test/testdata/htdocs.expected/summary/per-version-src.html
+++ b/test/testdata/htdocs.expected/summary/per-version-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/per-version.html 
b/test/testdata/htdocs.expected/summary/per-version.html
index d1ead30..37be0a7 100755
--- a/test/testdata/htdocs.expected/summary/per-version.html
+++ b/test/testdata/htdocs.expected/summary/per-version.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html 
b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html
index 9dbb957..135f612 100755
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL-src.html
@@ -19,6 +19,7 @@ its network operations in order to support encrypted 
connections.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>, <a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html 
b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
index cada639..b774a52 100755
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
@@ -19,6 +19,7 @@ its network operations in order to support encrypted 
connections.</p></td></tr>
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>, <a 
href="../reports/maintainer_yaakov_selkowitz.html">Yaakov Selkowitz</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc-src.html 
b/test/testdata/htdocs.expected/summary/rpm-doc-src.html
index 0a66ca4..5ce9853 100755
--- a/test/testdata/htdocs.expected/summary/rpm-doc-src.html
+++ b/test/testdata/htdocs.expected/summary/rpm-doc-src.html
@@ -15,6 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>Obsolete 
package for RPM package management system manual pages (extra text to so repr 
is not one line)</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>_obsolete</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="rpm-doc.html">rpm-doc</a></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc.html 
b/test/testdata/htdocs.expected/summary/rpm-doc.html
index 49303c1..7d5f490 100755
--- a/test/testdata/htdocs.expected/summary/rpm-doc.html
+++ b/test/testdata/htdocs.expected/summary/rpm-doc.html
@@ -15,11 +15,12 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>Obsolete 
package for RPM package management system manual pages (extra text to so repr 
is not one line)</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>_obsolete</p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="rpm-doc-src.html">rpm-doc</a></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
 <tr><td>4.1-2</td><td>x86_64</td><td class="right">50 KiB</td><td>2016-11-02 
00:00</td><td>[<a href="../x86_64/rpm-doc/rpm-doc-4.1-2">list of 
files</a>]</td><td>stable</td></tr>
-<tr><td>999-1</td><td>x86_64</td><td class="right">1 KiB</td><td>2024-03-02 
00:00</td><td>[<a href="../x86_64/rpm-doc/rpm-doc-999-1">list of 
files</a>]</td><td>stable</td></tr>
+<tr><td>999-1</td><td>x86_64</td><td class="right">1 KiB</td><td>2026-03-02 
00:00</td><td>[<a href="../x86_64/rpm-doc/rpm-doc-999-1">list of 
files</a>]</td><td>stable</td></tr>
 </table><br>
 </div>
 </body>
diff --git a/test/testdata/htdocs.expected/summary/staleversion-src.html 
b/test/testdata/htdocs.expected/summary/staleversion-src.html
index 2bc7d7e..aeec34f 100755
--- a/test/testdata/htdocs.expected/summary/staleversion-src.html
+++ b/test/testdata/htdocs.expected/summary/staleversion-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/staleversion.html 
b/test/testdata/htdocs.expected/summary/staleversion.html
index 56b6a6c..dae49a4 100755
--- a/test/testdata/htdocs.expected/summary/staleversion.html
+++ b/test/testdata/htdocs.expected/summary/staleversion.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>base</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/test-c-src.html 
b/test/testdata/htdocs.expected/summary/test-c-src.html
index 33ad59c..64e28a7 100755
--- a/test/testdata/htdocs.expected/summary/test-c-src.html
+++ b/test/testdata/htdocs.expected/summary/test-c-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/test-c.html 
b/test/testdata/htdocs.expected/summary/test-c.html
index abffd34..1372056 100755
--- a/test/testdata/htdocs.expected/summary/test-c.html
+++ b/test/testdata/htdocs.expected/summary/test-c.html
@@ -20,6 +20,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/test-d-src.html 
b/test/testdata/htdocs.expected/summary/test-d-src.html
index 026e611..f70ae03 100755
--- a/test/testdata/htdocs.expected/summary/test-d-src.html
+++ b/test/testdata/htdocs.expected/summary/test-d-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/test-d.html 
b/test/testdata/htdocs.expected/summary/test-d.html
index ce10445..8d6b3f8 100755
--- a/test/testdata/htdocs.expected/summary/test-d.html
+++ b/test/testdata/htdocs.expected/summary/test-d.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/test-e-src.html 
b/test/testdata/htdocs.expected/summary/test-e-src.html
index e307615..bd312e7 100755
--- a/test/testdata/htdocs.expected/summary/test-e-src.html
+++ b/test/testdata/htdocs.expected/summary/test-e-src.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/test-e.html 
b/test/testdata/htdocs.expected/summary/test-e.html
index 7eb1b5f..f2a92f8 100755
--- a/test/testdata/htdocs.expected/summary/test-e.html
+++ b/test/testdata/htdocs.expected/summary/test-e.html
@@ -19,6 +19,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>ORPHANED
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>normal</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/testpackage-src.html 
b/test/testdata/htdocs.expected/summary/testpackage-src.html
index 90e2fe0..43f1d60 100755
--- a/test/testdata/htdocs.expected/summary/testpackage-src.html
+++ b/test/testdata/htdocs.expected/summary/testpackage-src.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/htdocs.expected/summary/testpackage.html 
b/test/testdata/htdocs.expected/summary/testpackage.html
index 51bdc37..a385e70 100755
--- a/test/testdata/htdocs.expected/summary/testpackage.html
+++ b/test/testdata/htdocs.expected/summary/testpackage.html
@@ -18,6 +18,7 @@
 <tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p><a 
href="../reports/maintainer_blooey_mcfooey.html">Blooey McFooey</a>
 <span class="smaller">(Use <a href="/lists.html#cygwin">the mailing list</a> 
to report bugs or ask questions.
 <a href="/problems.html#personal-email">Do not contact the maintainer(s) 
directly</a>.)</span></p></td></tr>
+<tr><td><p><span 
class="detail">importance</span>:</p></td><td><p>leaf</p></td></tr>
 </table><br>
 <table class="pkgtable">
 <tr><th>Version</th><th>Arch</th><th>Package 
Size</th><th>Date</th><th>Files</th><th>Status</th></tr>
diff --git a/test/testdata/process_arch/packages.json.expected 
b/test/testdata/process_arch/packages.json.expected
index 94c9208..47c3569 100644
--- a/test/testdata/process_arch/packages.json.expected
+++ b/test/testdata/process_arch/packages.json.expected
@@ -5,6 +5,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "maintainers": [\n'
  '                "Jari Aalto"\n'
  '            ],\n'
@@ -28,6 +29,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "maintainers": [\n'
  '                "Blooey McFooey"\n'
  '            ],\n'
@@ -52,6 +54,7 @@
  '                "x86_64"\n'
  '            ],\n'
  '            "build_recipe": 
"https://cygwin.com/cgit/cygwin-packages/cygwin/tree/cygwin.cygport",\n'
+ '            "importance": "base",\n'
  '            "license": "LGPL-3.0-or-later WITH 
LGPL-3.0-linking-exception",\n'
  '            "maintainers": [\n'
  '                "Corinna Vinschen",\n'
@@ -99,6 +102,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "maintainers": [\n'
  '                "Jari Aalto"\n'
  '            ],\n'
@@ -126,6 +130,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "maintainers": [\n'
  '                "Yaakov Selkowitz"\n'
  '            ],\n'
@@ -167,6 +172,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "name": "obs-a",\n'
  '            "subpackages": [\n'
  '                {\n'
@@ -187,6 +193,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "name": "obs-b",\n'
  '            "subpackages": [\n'
  '                {\n'
@@ -207,6 +214,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "normal",\n'
  '            "maintainers": [\n'
  '                "Corinna Vinschen"\n'
  '            ],\n'
@@ -230,6 +238,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "base",\n'
  '            "maintainers": [\n'
  '                "Blooey McFooey"\n'
  '            ],\n'
@@ -257,6 +266,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "base",\n'
  '            "maintainers": [\n'
  '                "Blooey McFooey"\n'
  '            ],\n'
@@ -288,6 +298,7 @@
  '                "x86_64"\n'
  '            ],\n'
  '            "homepage": 
"https://metacpan.org/release/RJBS/Net-SMTP-SSL-1.04",\n'
+ '            "importance": "leaf",\n'
  '            "maintainers": [\n'
  '                "Blooey McFooey",\n'
  '                "Yaakov Selkowitz"\n'
@@ -314,6 +325,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "base",\n'
  '            "maintainers": [\n'
  '                "Blooey McFooey"\n'
  '            ],\n'
@@ -342,6 +354,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "leaf",\n'
  '            "name": "test-c",\n'
  '            "subpackages": [\n'
  '                {\n'
@@ -370,6 +383,7 @@
  '            "arches": [\n'
  '                "x86_64"\n'
  '            ],\n'
+ '            "importance": "normal",\n'
  '            "name": "test-d",\n'
  '            "subpackages": [\n'
  '                {\n'
@@ -393,6 +407,7 @@
  '            "build-depends": [\n'
  '                "cygwin-devel"\n'
  '            ],\n'
+ '            "importance": "normal",\n'
  '            "name": "test-e",\n'
  '            "subpackages": [\n'
  '                {\n'
@@ -414,6 +429,7 @@
  '                "x86_64"\n'
  '            ],\n'
  '            "homepage": "http://homepage.url",\n'
+ '            "importance": "leaf",\n'
  '            "maintainers": [\n'
  '                "Blooey McFooey"\n'
  '            ],\n'

Reply via email to