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'
[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20250329-51-gfb7dd2e
Jon Turney via Cygwin-apps-cvs Wed, 04 Mar 2026 09:05:20 -0800
