Diff:
---
 calm/calm.py                                       |  8 +-
 calm/mail-inactive-maintainers.py                  |  9 ++-
 calm/pkg2html.py                                   |  8 +-
 calm/repology.py                                   | 49 +++++++----
 calm/reports.py                                    | 94 +++++++++++++++++-----
 test/testdata/htdocs.expected/summary/arc-src.html |  2 +-
 test/testdata/htdocs.expected/summary/arc.html     |  2 +-
 .../htdocs.expected/summary/base-cygwin.html       |  2 +-
 .../htdocs.expected/summary/corrupt-src.html       |  2 +-
 test/testdata/htdocs.expected/summary/corrupt.html |  2 +-
 .../htdocs.expected/summary/cygwin-debuginfo.html  |  2 +-
 .../htdocs.expected/summary/cygwin-devel.html      |  2 +-
 .../htdocs.expected/summary/cygwin-src.html        |  2 +-
 test/testdata/htdocs.expected/summary/cygwin.html  |  2 +-
 .../htdocs.expected/summary/keychain-src.html      |  2 +-
 .../testdata/htdocs.expected/summary/keychain.html |  2 +-
 .../htdocs.expected/summary/libdns_sd-devel.html   |  2 +-
 .../htdocs.expected/summary/libdns_sd1.html        |  2 +-
 .../htdocs.expected/summary/mDNSResponder-src.html |  2 +-
 .../htdocs.expected/summary/mDNSResponder.html     |  2 +-
 .../htdocs.expected/summary/openssh-src.html       |  2 +-
 test/testdata/htdocs.expected/summary/openssh.html |  2 +-
 .../per-version-replacement-hint-only-src.html     |  2 +-
 .../summary/per-version-replacement-hint-only.html |  2 +-
 .../htdocs.expected/summary/per-version-src.html   |  2 +-
 .../htdocs.expected/summary/per-version.html       |  2 +-
 .../summary/perl-Net-SMTP-SSL-src.html             |  2 +-
 .../htdocs.expected/summary/perl-Net-SMTP-SSL.html |  2 +-
 .../htdocs.expected/summary/staleversion-src.html  |  2 +-
 .../htdocs.expected/summary/staleversion.html      |  2 +-
 .../htdocs.expected/summary/testpackage-src.html   |  2 +-
 .../htdocs.expected/summary/testpackage.html       |  2 +-
 test/testdata/process_arch/htdocs.expected         | 66 +++++++++++++++
 33 files changed, 217 insertions(+), 71 deletions(-)

diff --git a/calm/calm.py b/calm/calm.py
index 600a074..c8c8a77 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -587,10 +587,6 @@ def is_passphrase_cached(args):
 #
 #
 def do_output(args, state):
-    # update packages listings
-    # XXX: perhaps we need a --[no]listing command line option to disable this 
from being run?
-    pkg2html.update_package_listings(args, state.packages)
-
     update_json = False
 
     # for each arch
@@ -693,6 +689,10 @@ def do_output(args, state):
         repology.annotate_packages(args, state.packages)
         reports.do_reports(args, state.packages)
 
+    # update packages listings
+    # XXX: perhaps we need a --[no]listing command line option to disable this 
from being run?
+    pkg2html.update_package_listings(args, state.packages)
+
     # if we are daemonized, allow force regeneration of static content in 
htdocs
     # initially (in case the generation code has changed), but update that
     # static content only as needed on subsequent loops
diff --git a/calm/mail-inactive-maintainers.py 
b/calm/mail-inactive-maintainers.py
index badc5ad..fb9a931 100644
--- a/calm/mail-inactive-maintainers.py
+++ b/calm/mail-inactive-maintainers.py
@@ -33,13 +33,13 @@ from . import pkg2html
 from . import reports
 from . import utils
 
-MAINTAINER_ACTIVITY_THRESHOLD_YEARS = 8.5
+MAINTAINER_ACTIVITY_THRESHOLD_YEARS = 3
 
 template = '''
 Hi {},
 
 As a part of keeping Cygwin secure, your package maintainer account has been
-found to be long inactive. It will soon be disabled and your packages moved to
+found to be inactive. It will soon be disabled and your packages moved to
 'ORPHANED' status.
 
 The estimated date of your last packaging activity is {} UTC.
@@ -76,6 +76,9 @@ def main(args):
     logging.info('threshold date %s', pkg2html.tsformat(threshold))
 
     for a in activity_list:
+        if not a.last_package:
+            continue
+
         last_activity = max(a.last_seen, a.last_package)
 
         if last_activity < threshold:
@@ -88,7 +91,7 @@ def main(args):
             hdr['Envelope-From'] = common_constants.ALWAYS_BCC  # we want to 
see bounces
             hdr['Reply-To'] = '[email protected]'
             hdr['Bcc'] = common_constants.ALWAYS_BCC
-            hdr['Subject'] = 'upcoming removal of cygwin package maintainer 
account for %s' % a.name
+            hdr['Subject'] = 'Upcoming removal of cygwin package maintainer 
account for %s' % a.name
             hdr['X-Calm-Inactive-Maintainer'] = '1'
 
             msg = template.format(a.name, pkg2html.tsformat(last_activity), 
'\n'.join(pkg_list))
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index a23c662..8c43c3f 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -63,6 +63,7 @@ import xtarfile
 from . import common_constants
 from . import maintainers
 from . import package
+from . import reports
 from . import utils
 from .version import SetupVersion
 
@@ -313,7 +314,7 @@ def update_package_listings(args, packages):
                         if pkg_maintainers[m_pn].is_orphaned():
                             m = 'ORPHANED'
                         else:
-                            m = ', 
'.join(sorted(pkg_maintainers[m_pn].maintainers()))
+                            m = ', '.join('<a href="../reports/%s">%s</a>' % 
(reports.filenameify(l), l) for l in 
sorted(pkg_maintainers[m_pn].maintainers()))
 
                         pkg_groups = pkg_maintainers[m_pn].groups()
 
@@ -332,6 +333,11 @@ def update_package_listings(args, packages):
                                 repo_browse_url = '/cgit/cygwin-packages/%s/' 
% pn
                                 details_table['packaging repository'] = '<a 
href="%s">%s.git</a>' % (repo_browse_url, pn)
 
+                        repology_pn = getattr(po, 'repology_project_name', 
None)
+                        if repology_pn:
+                            upstream_version = getattr(po, 'upstream_version', 
'')
+                            details_table['repology info'] = '<a 
href="https://repology.org/project/%s/information";>%s</a> (%s)' % (repology_pn, 
repology_pn, upstream_version)
+
                     if po.kind == package.Kind.binary:
                         doc_path = os.path.join(args.htdocs, 'doc', pn)
                         if os.path.exists(doc_path):
diff --git a/calm/repology.py b/calm/repology.py
index 4ecefe5..f2a6f60 100644
--- a/calm/repology.py
+++ b/calm/repology.py
@@ -52,9 +52,11 @@ use_legacy = {'qt': [LegacyData('5', []),
                                 ]
               }
 
+RepologyData = namedtuple('RepologyData', ['upstream_version', 
'repology_project_name'])
 
-def repology_fetch_versions():
-    upstream_versions = {}
+
+def repology_fetch_data():
+    repology_data = {}
     last_pn = ''
 
     while True:
@@ -80,15 +82,15 @@ def repology_fetch_versions():
         for pn in sorted(j.keys()):
             p = j[pn]
 
-            # first, pick out the version which repology has called newest, and
+            # first, pick out the version(s) which repology has called newest, 
and
             # if needed, also pick out latest version for legacy packages
-            newest_version = None
+            newest_version = []
             legacy_versions = {}
 
             for i in p:
                 v = i['version']
                 if i['status'] == 'newest':
-                    newest_version = v
+                    newest_version.append(v)
 
                 if (pn in use_legacy) and (i['status'] in ['legacy', 
'outdated']):
                     prefix = None
@@ -113,6 +115,9 @@ def repology_fetch_versions():
             if not newest_version:
                 continue
 
+            # XXX: if everything is noscheme, we can probably record that
+            # information as well.
+
             # next, assign that version to all the corresponding cygwin source
             # packages
             #
@@ -130,11 +135,12 @@ def repology_fetch_versions():
                                 prefix = ld.version
 
                         if prefix and prefix in legacy_versions:
-                            upstream_versions[source_pn] = 
legacy_versions[prefix]
-                            continue
+                            upstream_version = legacy_versions[prefix]
+                    else:
+                        # otherwise, just use the newest version(s)
+                        upstream_version = newest_version
 
-                    # otherwise, just use the newest version
-                    upstream_versions[source_pn] = newest_version
+                    repology_data[source_pn] = RepologyData(upstream_version, 
pn)
 
         if pn == last_pn:
             break
@@ -144,7 +150,21 @@ def repology_fetch_versions():
         # rate-limit individual API calls to once per second
         time.sleep(1)
 
-    return upstream_versions
+    return repology_data
+
+
+# when repology reports multiple 'newest' versions due to altver, pick the one
+# which splits into the same number of numeric and alphabetic sequences
+def seqmatch(bv, uv):
+    if len(uv) <= 1:
+        return uv[0]
+
+    seq_count = len(SetupVersion(bv)._V)
+    for v in uv:
+        if len(SetupVersion(bv)._V) == seq_count:
+            return v
+
+    return uv[0]
 
 
 def annotate_packages(args, packages):
@@ -156,14 +176,15 @@ def annotate_packages(args, packages):
         logging.info("not consulting %s due to ratelimit" % (REPOLOGY_API_URL))
     else:
         logging.info("consulting %s" % (REPOLOGY_API_URL))
-        uv = repology_fetch_versions()
-        if uv:
-            last_data = uv
+        repology_data = repology_fetch_data()
+        if repology_data:
+            last_data = repology_data
 
     for pn in last_data:
         spn = pn + '-src'
         for arch in packages:
             if spn in packages[arch]:
-                packages[arch][spn].upstream_version = last_data[pn]
+                packages[arch][spn].upstream_version = 
seqmatch(packages[arch][spn].best_version, last_data[pn].upstream_version)
+                packages[arch][spn].repology_project_name = 
last_data[pn].repology_project_name
 
     last_check = time.time()
diff --git a/calm/reports.py b/calm/reports.py
index cd772fe..b2480cc 100644
--- a/calm/reports.py
+++ b/calm/reports.py
@@ -60,7 +60,8 @@ def template(title, body, f):
 
 def write_report(args, title, body, fn, reportlist, not_empty=True):
     if not_empty:
-        reportlist[title] = os.path.join('reports', fn)
+        if reportlist is not None:
+            reportlist[title] = os.path.join('reports', fn)
 
     fn = os.path.join(args.htdocs, 'reports', fn)
 
@@ -72,10 +73,29 @@ def linkify(pn, po):
     return '<a href="/packages/summary/{0}.html">{1}</a>'.format(po.name, 
po.orig_name)
 
 
+def filenameify(m):
+    return 'maintainer_' + re.sub(r'[ .]', r'_', m.lower()) + '.html'
+
+
+def status(s):
+    if s < 0:
+        style = "red"
+        mark = "&#x2718;"  # cross
+    elif s == 0:
+        style = "green"
+        mark = "&#x2714;"  # tick
+    else:
+        # probably some kind of data error
+        style = "amber"
+        mark = "&#x2BD1;"  # uncertainty
+
+    return '<span class="%s">%s</span>' % (style, mark)
+
+
 #
-# produce a report of unmaintained packages
+# produce a report of packages maintained by a given maintainer (None = 
unmaintained)
 #
-def unmaintained(args, packages, reportlist):
+def maintainer_packages(args, packages, maintainer, reportlist):
     pkg_maintainers = maintainers.pkg_list(args.pkglist)
 
     um_list = []
@@ -88,9 +108,18 @@ def unmaintained(args, packages, reportlist):
         if po.kind != package.Kind.source:
             continue
 
-        if (po.orig_name not in pkg_maintainers) or (not 
pkg_maintainers[po.orig_name].is_orphaned()):
+        if po.orig_name not in pkg_maintainers:
             continue
 
+        if maintainer:
+            if maintainer not in pkg_maintainers[po.orig_name].maintainers():
+                continue
+            if pkg_maintainers[po.orig_name].is_orphaned():
+                continue
+        else:
+            if not pkg_maintainers[po.orig_name].is_orphaned():
+                continue
+
         # the highest version we have
         v = sorted(po.versions(), key=lambda v: SetupVersion(v), 
reverse=True)[0]
 
@@ -114,28 +143,40 @@ def unmaintained(args, packages, reportlist):
         up.rdepends = len(rdepends)
         up.build_rdepends = len(build_rdepends)
         up.importance = po.importance
-
-        # some packages are mature. If 'v' is still latest upstream version,
-        # then maybe we don't need to worry about this package quite as much...
-        up.unchanged = (SetupVersion(v)._V == SetupVersion(up.upstream_v)._V)
-        if up.unchanged:
-            up.upstream_v += " (unchanged)"
+        up.status = SetupVersion._compare(SetupVersion(v)._V, 
SetupVersion(up.upstream_v)._V)
 
         um_list.append(up)
 
     body = io.StringIO()
-    print('<p>Packages without a maintainer.</p>', file=body)
+
+    if maintainer:
+        print('<p>Packages maintained by %s.</p>' % maintainer, file=body)
+    else:
+        print('<p>Packages without a maintainer.</p>', file=body)
 
     print('<table class="grid sortable">', file=body)
-    print('<tr><th>last 
updated</th><th>package</th><th>version</th><th>upstream 
version</th><th>rdepends</th><th>build_rdepends</th><th>importance</th></tr>', 
file=body)
+    print('<tr><th>last 
updated</th><th>package</th><th>version</th><th>upstream 
version</th><th>status</th><th>rdepends</th><th>build_rdepends</th><th>importance</th></tr>',
 file=body)
 
-    for up in sorted(um_list, key=lambda i: (-i.importance, i.rdepends + 
i.build_rdepends, not i.unchanged, i.ts), reverse=True):
-        
print('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>'
 %
-              (pkg2html.tsformat(up.ts), linkify(up.pn, up.po), up.v, 
up.upstream_v, up.rdepends, up.build_rdepends, up.importance), file=body)
+    for up in sorted(um_list, key=lambda i: (-i.importance, i.rdepends + 
i.build_rdepends, i.status, i.ts), reverse=True):
+        
print('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>'
 %
+              (pkg2html.tsformat(up.ts), linkify(up.pn, up.po), up.v, 
up.upstream_v, status(up.status), up.rdepends, up.build_rdepends, 
up.importance), file=body)
 
     print('</table>', file=body)
 
-    write_report(args, 'Unmaintained packages', body, 'unmaintained.html', 
reportlist)
+    if maintainer:
+        def feed_url(proto):
+            name = maintainer.replace('.', '').replace(' ', '.').lower() + 
'@cygwin'
+            url = 'https://repology.org/maintainer/%s/feed-for-repo/cygwin' % 
name
+            if proto == 'atom':
+                url += '/atom'
+
+            return '<a href="%s">(%s)</a>' % (url, proto)
+
+        print("<p>Changes to this data are available in a repology feed: %s 
%s</p>" % (feed_url('html'), feed_url('atom')), file=body)
+
+        write_report(args, "%s's packages" % maintainer, body, '%s' % 
filenameify(maintainer), None, not_empty=False)
+    else:
+        write_report(args, 'Unmaintained packages', body, 'unmaintained.html', 
reportlist)
 
 
 # produce a report of deprecated packages
@@ -300,8 +341,7 @@ def maintainer_activity(args, packages):
         a.last_seen = m.last_seen
 
         # because last_seen hasn't been collected for very long, we also try to
-        # estimate by looking at packages (this isn't very good as it gets
-        # confused by co-mainainted packages)
+        # estimate last activity by looking at packages
         count = 0
         mtime = 0
         pkgs = []
@@ -318,6 +358,11 @@ def maintainer_activity(args, packages):
             if po:
                 pkgs.append(pn)
 
+                # ignore timestamp of co-maintained packages, because we don't
+                # know who is responsible for the update
+                if len(p.maintainers()) > 1:
+                    continue
+
                 for v in po.versions():
                     if po.tar(v).mtime > mtime:
                         mtime = po.tar(v).mtime
@@ -327,7 +372,6 @@ def maintainer_activity(args, packages):
         if count == 0:
             continue
 
-        a.count = count
         a.pkgs = pkgs
         a.last_package = mtime
 
@@ -352,8 +396,11 @@ def maintainer_activity_report(args, packages, reportlist):
         def pkg_details(pkgs):
             return '<details><summary>%d</summary>%s</details>' % (len(pkgs), 
', '.join(linkify(p, packages[arch][p]) for p in pkgs))
 
-        print('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>' %
-              (a.name, pkg_details(a.pkgs), pkg2html.tsformat(a.last_seen), 
pkg2html.tsformat(a.last_package)), file=body)
+        def maintainer_link(m):
+            return '<a href="%s">%s</a>' % (filenameify(m), m)
+
+        print('<tr><td>%s</td><td 
sorttable_customkey="%d">%s</td><td>%s</td><td>%s</td></tr>' %
+              (maintainer_link(a.name), len(a.pkgs), pkg_details(a.pkgs), 
pkg2html.tsformat(a.last_seen), pkg2html.tsformat(a.last_package)), file=body)
 
     print('</table>', file=body)
 
@@ -534,7 +581,7 @@ def do_reports(args, packages):
 
     pkg2html.ensure_dir_exists(args, os.path.join(args.htdocs, 'reports'))
 
-    unmaintained(args, packages, reportlist)
+    maintainer_packages(args, packages, None, reportlist)
     deprecated(args, packages, reportlist)
     unstable(args, packages, reportlist)
 
@@ -544,6 +591,9 @@ def do_reports(args, packages):
 
     maintainer_activity_report(args, packages, reportlist)
 
+    for maintainer in maintainers.maintainer_list(args):
+        maintainer_packages(args, packages, maintainer, None)
+
     fn = os.path.join(args.htdocs, 'reports_list.inc')
     with utils.open_amifc(fn) as f:
         print('<ul>', file=f)
diff --git a/test/testdata/htdocs.expected/summary/arc-src.html 
b/test/testdata/htdocs.expected/summary/arc-src.html
index 9e95ab4..d10edaa 100755
--- a/test/testdata/htdocs.expected/summary/arc-src.html
+++ b/test/testdata/htdocs.expected/summary/arc-src.html
@@ -20,7 +20,7 @@ compressing graphic images. Squeeze analysis is always done 
now, and
 the best of packing, squeezing, or crunching is used.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Archive</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="arc.html">arc</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/arc.html 
b/test/testdata/htdocs.expected/summary/arc.html
index 6d3b765..a068aba 100644
--- a/test/testdata/htdocs.expected/summary/arc.html
+++ b/test/testdata/htdocs.expected/summary/arc.html
@@ -20,7 +20,7 @@ compressing graphic images. Squeeze analysis is always done 
now, and
 the best of packing, squeezing, or crunching is used.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Archive</p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="arc-src.html">arc</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/base-cygwin.html 
b/test/testdata/htdocs.expected/summary/base-cygwin.html
index f7c8f7c..a1d69f3 100644
--- a/test/testdata/htdocs.expected/summary/base-cygwin.html
+++ b/test/testdata/htdocs.expected/summary/base-cygwin.html
@@ -17,7 +17,7 @@
 <tr><td><p><span 
class="detail">depends</span>:</p></td><td><p>cygwin-api0_291</p></td></tr>
 <tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a 
href="cygwin.html">cygwin</a>, <a 
href="per-version.html">per-version</a></p></td></tr>
 <tr><td><p><span class="detail">source 
package</span>:</p></td><td><p>base-cygwin-src</p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/corrupt-src.html 
b/test/testdata/htdocs.expected/summary/corrupt-src.html
index 8dc69c2..9a182d0 100755
--- a/test/testdata/htdocs.expected/summary/corrupt-src.html
+++ b/test/testdata/htdocs.expected/summary/corrupt-src.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>A package 
containing corrupt archives</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="corrupt.html">corrupt</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/corrupt.html 
b/test/testdata/htdocs.expected/summary/corrupt.html
index 0507405..770831c 100644
--- a/test/testdata/htdocs.expected/summary/corrupt.html
+++ b/test/testdata/htdocs.expected/summary/corrupt.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>A package 
containing corrupt archives</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="corrupt-src.html">corrupt</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html 
b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
index 594761c..db73350 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
@@ -18,7 +18,7 @@ cygwin package with gdb.</p></td></tr>
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="cygwin-debuginfo.html">cygwin-debuginfo</a></p></td></tr>
 <tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a 
href="cygwin-debuginfo.html">cygwin-debuginfo</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="cygwin-src.html">cygwin</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen, Yaakov Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-devel.html 
b/test/testdata/htdocs.expected/summary/cygwin-devel.html
index 9120025..a48f771 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-devel.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-devel.html
@@ -16,7 +16,7 @@
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
 <tr><td><p><span class="detail">build_rdepends</span>:</p></td><td><p><a 
href="test-e-src.html">test-e</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="cygwin-src.html">cygwin</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen, Yaakov Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-src.html 
b/test/testdata/htdocs.expected/summary/cygwin-src.html
index 84bb91d..ca0eac2 100755
--- a/test/testdata/htdocs.expected/summary/cygwin-src.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-src.html
@@ -16,7 +16,7 @@
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="cygwin.html">cygwin</a>, <a 
href="cygwin-debuginfo.html">cygwin-debuginfo</a>, <a 
href="cygwin-devel.html">cygwin-devel</a></p></td></tr>
 <tr><td><p><span 
class="detail">license</span>:</p></td><td><p>LGPL-3.0-or-later WITH 
LGPL-3.0-linking-exception <span class="smaller">(<a 
href="https://spdx.org/licenses/";>SPDX</a>)</span></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen, Yaakov Selkowitz
+<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">packaging repository</span>:</p></td><td><p><a 
href="/cgit/cygwin-packages/cygwin/">cygwin.git</a></p></td></tr>
diff --git a/test/testdata/htdocs.expected/summary/cygwin.html 
b/test/testdata/htdocs.expected/summary/cygwin.html
index 3b956b2..ade7cfc 100644
--- a/test/testdata/htdocs.expected/summary/cygwin.html
+++ b/test/testdata/htdocs.expected/summary/cygwin.html
@@ -17,7 +17,7 @@
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="base-cygwin.html">base-cygwin</a></p></td></tr>
 <tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a 
href="per-version.html">per-version</a>, <a 
href="per-version-replacement-hint-only.html">per-version-replacement-hint-only</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="cygwin-src.html">cygwin</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen, Yaakov Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/keychain-src.html 
b/test/testdata/htdocs.expected/summary/keychain-src.html
index 908685c..80467ee 100755
--- a/test/testdata/htdocs.expected/summary/keychain-src.html
+++ b/test/testdata/htdocs.expected/summary/keychain-src.html
@@ -23,7 +23,7 @@ ssh-agent, otherwise it loads them, prompting you for a 
password if
 necessary</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Utils</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="keychain.html">keychain</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/keychain.html 
b/test/testdata/htdocs.expected/summary/keychain.html
index 0f3134a..5fa699c 100644
--- a/test/testdata/htdocs.expected/summary/keychain.html
+++ b/test/testdata/htdocs.expected/summary/keychain.html
@@ -24,7 +24,7 @@ necessary</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Utils</p></td></tr>
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="openssh.html">openssh</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="keychain-src.html">keychain</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Jari Aalto
+<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">readme</span>:</p></td><td><p><a 
href="../doc/keychain/keychain.README">keychain.README</a></p></td></tr>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html 
b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
index 31bc9e5..9d021f9 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
@@ -18,7 +18,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="libdns_sd1.html">libdns_sd1</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="mDNSResponder-src.html">mDNSResponder</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov 
Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd1.html 
b/test/testdata/htdocs.expected/summary/libdns_sd1.html
index 74f71b2..486ea30 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd1.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd1.html
@@ -18,7 +18,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
 <tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a 
href="libdns_sd-devel.html">libdns_sd-devel</a>, <a 
href="mDNSResponder.html">mDNSResponder</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="mDNSResponder-src.html">mDNSResponder</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov 
Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder-src.html 
b/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
index 05db800..59d3816 100755
--- a/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder-src.html
@@ -17,7 +17,7 @@ automatic discovery of computers, devices, and services on IP 
networks using
 industry standard IP protocols.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="libdns_sd-devel.html">libdns_sd-devel</a>, <a 
href="libdns_sd1.html">libdns_sd1</a>, <a 
href="mDNSResponder.html">mDNSResponder</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov 
Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder.html 
b/test/testdata/htdocs.expected/summary/mDNSResponder.html
index ba4c9ec..cea5a9f 100644
--- a/test/testdata/htdocs.expected/summary/mDNSResponder.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder.html
@@ -18,7 +18,7 @@ industry standard IP protocols.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="libdns_sd1.html">libdns_sd1</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="mDNSResponder-src.html">mDNSResponder</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Yaakov 
Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/openssh-src.html 
b/test/testdata/htdocs.expected/summary/openssh-src.html
index c8eb895..c8dd26e 100755
--- a/test/testdata/htdocs.expected/summary/openssh-src.html
+++ b/test/testdata/htdocs.expected/summary/openssh-src.html
@@ -17,7 +17,7 @@
     providing encrypted communication between two machines.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="openssh.html">openssh</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/openssh.html 
b/test/testdata/htdocs.expected/summary/openssh.html
index 812ae7d..b815c04 100644
--- a/test/testdata/htdocs.expected/summary/openssh.html
+++ b/test/testdata/htdocs.expected/summary/openssh.html
@@ -18,7 +18,7 @@
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Net</p></td></tr>
 <tr><td><p><span class="detail">rdepends</span>:</p></td><td><p><a 
href="keychain.html">keychain</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="openssh-src.html">openssh</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Corinna 
Vinschen
+<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>
 </table><br>
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 078fa31..da6c490 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
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>Per-version 
hint test package</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="per-version-replacement-hint-only.html">per-version-replacement-hint-only</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
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 e9bd68a..0121bf9 100644
--- 
a/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
+++ 
b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
@@ -16,7 +16,7 @@
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="cygwin.html">cygwin</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="per-version-replacement-hint-only-src.html">per-version-replacement-hint-only</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/per-version-src.html 
b/test/testdata/htdocs.expected/summary/per-version-src.html
index f99713c..42cf350 100755
--- a/test/testdata/htdocs.expected/summary/per-version-src.html
+++ b/test/testdata/htdocs.expected/summary/per-version-src.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>Per-version 
hint test package</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="per-version.html">per-version</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/per-version.html 
b/test/testdata/htdocs.expected/summary/per-version.html
index a16b0bb..d1ead30 100644
--- a/test/testdata/htdocs.expected/summary/per-version.html
+++ b/test/testdata/htdocs.expected/summary/per-version.html
@@ -16,7 +16,7 @@
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Base</p></td></tr>
 <tr><td><p><span class="detail">depends</span>:</p></td><td><p><a 
href="base-cygwin.html">base-cygwin</a></p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="per-version-src.html">per-version</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
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 faff410..efabb55 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
@@ -16,7 +16,7 @@
 its network operations in order to support encrypted connections.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Perl</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="perl-Net-SMTP-SSL.html">perl-Net-SMTP-SSL</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey, Yaakov Selkowitz
+<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>
 </table><br>
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 2237ceb..07c5b12 100644
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
@@ -16,7 +16,7 @@
 its network operations in order to support encrypted connections.</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Perl</p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="perl-Net-SMTP-SSL-src.html">perl-Net-SMTP-SSL</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey, Yaakov Selkowitz
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/staleversion-src.html 
b/test/testdata/htdocs.expected/summary/staleversion-src.html
index 4437f2e..91a289c 100755
--- a/test/testdata/htdocs.expected/summary/staleversion-src.html
+++ b/test/testdata/htdocs.expected/summary/staleversion-src.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>Test 
package for stale version removal</p></td></tr>
 <tr><td><p><span class="detail">categories</span>:</p></td><td><p>Shells 
Base</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="staleversion.html">staleversion</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/staleversion.html 
b/test/testdata/htdocs.expected/summary/staleversion.html
index d3f31f3..56b6a6c 100644
--- a/test/testdata/htdocs.expected/summary/staleversion.html
+++ b/test/testdata/htdocs.expected/summary/staleversion.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>Test 
package for stale version removal</p></td></tr>
 <tr><td><p><span class="detail">categories</span>:</p></td><td><p>Shells 
Base</p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="staleversion-src.html">staleversion</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/testpackage-src.html 
b/test/testdata/htdocs.expected/summary/testpackage-src.html
index 1d8fd98..152870c 100755
--- a/test/testdata/htdocs.expected/summary/testpackage-src.html
+++ b/test/testdata/htdocs.expected/summary/testpackage-src.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>A test 
package (stuff &amp; other stuff)</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
 <tr><td><p><span class="detail">install package(s)</span>:</p></td><td><p><a 
href="testpackage.html">testpackage</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/htdocs.expected/summary/testpackage.html 
b/test/testdata/htdocs.expected/summary/testpackage.html
index be934c8..51bdc37 100644
--- a/test/testdata/htdocs.expected/summary/testpackage.html
+++ b/test/testdata/htdocs.expected/summary/testpackage.html
@@ -15,7 +15,7 @@
 <tr><td><p><span class="detail">description</span>:</p></td><td><p>A test 
package (stuff &amp; other stuff)</p></td></tr>
 <tr><td><p><span 
class="detail">categories</span>:</p></td><td><p>Devel</p></td></tr>
 <tr><td><p><span class="detail">source package</span>:</p></td><td><p><a 
href="testpackage-src.html">testpackage</a></p></td></tr>
-<tr><td><p><span class="detail">maintainer(s)</span>:</p></td><td><p>Blooey 
McFooey
+<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>
 </table><br>
diff --git a/test/testdata/process_arch/htdocs.expected 
b/test/testdata/process_arch/htdocs.expected
index dfe67ea..e38d005 100644
--- a/test/testdata/process_arch/htdocs.expected
+++ b/test/testdata/process_arch/htdocs.expected
@@ -2,7 +2,73 @@
  'doc': ['.htaccess'],
  'doc/keychain': ['keychain.README'],
  'reports': ['deprecated_so.html',
+             'maintainer_aaron_schneider.html',
+             'maintainer_achim_gratz.html',
              'maintainer_activity.html',
+             'maintainer_adam_dinwoodie.html',
+             'maintainer_alexey_sokolov.html',
+             'maintainer_andrew_schulman.html',
+             'maintainer_blooey_mcfooey.html',
+             'maintainer_bob_heckel.html',
+             'maintainer_charles_wilson.html',
+             'maintainer_chris_j__breisch.html',
+             'maintainer_chris_leblanc.html',
+             'maintainer_chris_sutcliffe.html',
+             'maintainer_christian_franke.html',
+             'maintainer_christian_kellermann.html',
+             'maintainer_corinna_vinschen.html',
+             'maintainer_damien_doligez.html',
+             'maintainer_daniel_boland.html',
+             'maintainer_dave_kilroy.html',
+             'maintainer_david_levine.html',
+             'maintainer_david_rothenberger.html',
+             'maintainer_david_stacey.html',
+             'maintainer_dean_scarff.html',
+             'maintainer_dr__volker_zell.html',
+             'maintainer_eric_blake.html',
+             'maintainer_erwin_waterlander.html',
+             'maintainer_federico_hernandez.html',
+             'maintainer_frank_fesevur.html',
+             'maintainer_gernot_hillier.html',
+             'maintainer_harold_l_hunt_ii.html',
+             'maintainer_jan_nijtmans.html',
+             'maintainer_jari_aalto.html',
+             'maintainer_joe_linoff.html',
+             'maintainer_joel_johnson.html',
+             'maintainer_jon_turney.html',
+             'maintainer_jonathan_c__allen.html',
+             'maintainer_jonathan_yong.html',
+             'maintainer_jorge_diaz.html',
+             'maintainer_ken_brown.html',
+             'maintainer_klaus_grue.html',
+             'maintainer_kostya_altukhov.html',
+             'maintainer_marcel_telka.html',
+             'maintainer_marco_atzeri.html',
+             'maintainer_marcos_vives_del_sol.html',
+             'maintainer_mark_hessling.html',
+             'maintainer_michael_wild.html',
+             'maintainer_mike_depaulo.html',
+             'maintainer_mikhail_usenko.html',
+             'maintainer_orphaned.html',
+             'maintainer_pavel_fedin.html',
+             'maintainer_peter_a__castro.html',
+             'maintainer_peter_rosin.html',
+             'maintainer_pierre_a__humblet.html',
+             'maintainer_reini_urban.html',
+             'maintainer_sam_robb.html',
+             'maintainer_sebastien_helleu.html',
+             'maintainer_serge_lamikhov-center.html',
+             'maintainer_steven_monai.html',
+             'maintainer_stuart_caie.html',
+             'maintainer_teun_burgers.html',
+             'maintainer_thomas_wolff.html',
+             'maintainer_tony_kelman.html',
+             'maintainer_warren_young.html',
+             'maintainer_wei-ren_chen.html',
+             'maintainer_william_a__hoffman.html',
+             'maintainer_yaakov_selkowitz.html',
+             'maintainer_yitzchak_scott-thoennes.html',
+             'maintainer_yue_ren.html',
              'perl_rebuilds.html',
              'ruby_rebuilds.html',
              'unmaintained.html',

Reply via email to