public inbox for cygwin-apps-cvs@sourceware.org
help / color / mirror / Atom feed
From: jturney@sourceware.org
To: cygwin-apps-cvs@sourceware.org
Subject: [calm - Cygwin server-side packaging maintenance script] branch master, updated. 20181020-10-g911eecc
Date: Sat, 25 May 2019 11:35:00 -0000	[thread overview]
Message-ID: <20190525113519.24267.qmail@sourceware.org> (raw)




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

commit 911eeccf54754e433fd1c4e4cc45d203bd31d50a
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Nov 8 14:28:04 2017 +0000

    Generate a per-package summary HTML page

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

commit 735b2920f386a308ec120412ebd3c26c3e4d8055
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Fri May 24 12:30:36 2019 +0100

    Make orphanmaint a parameter of Maintainers.read


Diff:
---
 TODO                                               |    1 +
 calm/calm.py                                       |   10 +-
 calm/compare-arches                                |    2 +-
 calm/maintainers.py                                |   23 ++-
 calm/pkg2html.py                                   |  239 +++++++++++++++++---
 test/test_calm.py                                  |   10 +-
 test/testdata/htdocs.expected/packages.inc         |   26 ++
 test/testdata/htdocs.expected/summary/arc.html     |   34 +++
 .../htdocs.expected/summary/base-cygwin.html       |   29 +++
 test/testdata/htdocs.expected/summary/corrupt.html |   29 +++
 .../htdocs.expected/summary/cygwin-debuginfo.html  |   32 +++
 .../htdocs.expected/summary/cygwin-devel.html      |   30 +++
 test/testdata/htdocs.expected/summary/cygwin.html  |   34 +++
 .../testdata/htdocs.expected/summary/keychain.html |   40 ++++
 .../htdocs.expected/summary/libdns_sd-devel.html   |   31 +++
 .../htdocs.expected/summary/libdns_sd1.html        |   30 +++
 .../htdocs.expected/summary/mDNSResponder.html     |   32 +++
 test/testdata/htdocs.expected/summary/obs-a.html   |   29 +++
 test/testdata/htdocs.expected/summary/obs-b.html   |   29 +++
 test/testdata/htdocs.expected/summary/openssh.html |   31 +++
 .../summary/per-version-replacement-hint-only.html |   30 +++
 .../htdocs.expected/summary/per-version.html       |   32 +++
 .../htdocs.expected/summary/perl-Net-SMTP-SSL.html |   30 +++
 test/testdata/htdocs.expected/summary/rpm-doc.html |   30 +++
 .../htdocs.expected/summary/staleversion.html      |   39 ++++
 test/testdata/htdocs.expected/summary/test-c.html  |   31 +++
 test/testdata/htdocs.expected/summary/test-d.html  |   29 +++
 test/testdata/htdocs.expected/summary/test-e.html  |   30 +++
 .../htdocs.expected/summary/testpackage.html       |   29 +++
 test/testdata/htdocs.expected/x86/packages.inc     |   27 ---
 test/testdata/process_arch/htdocs.expected         |   40 +++-
 31 files changed, 988 insertions(+), 80 deletions(-)

diff --git a/TODO b/TODO
index a892159..9d1ddd1 100644
--- a/TODO
+++ b/TODO
@@ -9,3 +9,4 @@
 * something to expire old soversions
 * atomically update .ini/.sig (rename of containing directory, if we put release/ was somewhere else?)
 * report changes in override.hint like we used to for setup.hint
+* maintainers.py should only re-read cygwin-pkg-maint if it's changed
diff --git a/calm/calm.py b/calm/calm.py
index 36a865f..3b7ea79 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -129,7 +129,7 @@ def process_relarea(args):
 
 def process_uploads(args, state):
     # read maintainer list
-    mlist = maintainers.Maintainer.read(args)
+    mlist = maintainers.Maintainer.read(args, getattr(args, 'orphanmaint', None))
 
     # make the list of all packages
     all_packages = maintainers.Maintainer.all_packages(mlist)
@@ -373,11 +373,9 @@ def do_main(args, state):
 #
 
 def do_output(args, state):
-    # for each arch
-    for arch in common_constants.ARCHES:
-        # 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[arch], arch)
+    # 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)
 
     # for each arch
     for arch in common_constants.ARCHES:
diff --git a/calm/compare-arches b/calm/compare-arches
index feb31be..37e1861 100755
--- a/calm/compare-arches
+++ b/calm/compare-arches
@@ -91,7 +91,7 @@ def main(args):
         print("%s is only in arch %s" % (p, [a for a in exists if exists[a]]))
 
     # are there any packages which have a maintainer, but don't exist?
-    mlist = maintainers.Maintainer.read(args)
+    mlist = maintainers.Maintainer.read(args, getattr(args, 'orphanmaint', None))
     all_packages = maintainers.Maintainer.all_packages(mlist)
 
     for p in sorted(all_packages):
diff --git a/calm/maintainers.py b/calm/maintainers.py
index 740f61d..b9c51fd 100644
--- a/calm/maintainers.py
+++ b/calm/maintainers.py
@@ -35,6 +35,12 @@
 # - the timestamp when 'ignoring' warnings were last emitted
 #
 
+# XXX: Rather than this implementing an object which reads cygwin-pkg-maint when
+# constructed at specific places in the code, perhaps this needs to contain the
+# list (and it's inversion) and accessors, and invalidate that stored list when
+# cygwin-pkg-maint changes...
+
+from collections import defaultdict
 import itertools
 import logging
 import os
@@ -193,13 +199,26 @@ class Maintainer(object):
 
     # create maintainer list
     @staticmethod
-    def read(args):
+    def read(args, orphanmaint=None):
         mlist = {}
         mlist = Maintainer.add_directories(mlist, args.homedir)
-        mlist = Maintainer.add_packages(mlist, args.pkglist, getattr(args, 'orphanmaint', None))
+        mlist = Maintainer.add_packages(mlist, args.pkglist, orphanmaint)
 
         return mlist
 
+    # invert to a per-package list of maintainers
+    @staticmethod
+    def invert(mlist):
+        _pkgs = defaultdict(list)
+        # for each maintainer
+        for m in mlist.values():
+            # for each package
+            for p in m.pkgs:
+                # add the maintainer name
+                _pkgs[p].append(m.name)
+
+        return _pkgs
+
     @staticmethod
     def update_reminder_times(mlist):
         for m in mlist.values():
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index 6320c83..be64c6c 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -30,6 +30,7 @@
 # -- for each tar file
 # --- if a package listing HTML file doesn't already exist
 # ---- write a HTML package listing file listing the tar file contents
+# -- write a summary file, if set of versions changed
 # - write packages.inc, the list of packages
 # - remove any .htaccess or listing files for which there was no package
 # - remove any directories which are now empty
@@ -50,7 +51,9 @@ import tarfile
 import textwrap
 import time
 
+from .version import SetupVersion
 from . import common_constants
+from . import maintainers
 from . import package
 
 
@@ -61,7 +64,7 @@ from . import package
 # 'skip':', in which case we try to make a reasonable one
 #
 
-def desc(packages, p, bv):
+def sdesc(packages, p, bv):
     if 'sdesc' in packages[p].version_hints[bv]:
         header = packages[p].version_hints[bv]['sdesc']
     else:
@@ -70,17 +73,196 @@ def desc(packages, p, bv):
     return header.replace('"', '')
 
 
+# ditto for ldesc
+
+def ldesc(packages, p, bv):
+    if 'ldesc' in packages[p].version_hints[bv]:
+        header = packages[p].version_hints[bv]['ldesc']
+    else:
+        header = p
+
+    return header.replace('"', '')
+
+
+# ensure a directory exists
 #
-#
-#
+# for some versions of python, os.makedirs() can still raise FileExistsError
+# even when exists_ok=True, if the directory mode is not as expected.
 
-def update_package_listings(args, packages, arch):
-    base = os.path.join(args.htdocs, arch)
+def ensure_dir_exists(args, path):
     if not args.dryrun:
         try:
-            os.makedirs(base, exist_ok=True)
+            os.makedirs(path, exist_ok=True)
         except FileExistsError:
             pass
+        os.chmod(path, 0o755)
+
+
+#
+#
+#
+
+def update_package_listings(args, packages):
+    package_list = set()
+    update_summary = set()
+
+    for arch in packages:
+        update_summary.update(write_arch_listing(args, packages[arch], arch))
+        package_list.update(packages[arch])
+
+    summaries = os.path.join(args.htdocs, 'summary')
+    ensure_dir_exists(args, summaries)
+
+    mlist = maintainers.Maintainer.read(args, None)
+    pkg_maintainers = maintainers.Maintainer.invert(mlist)
+
+    toremove = glob.glob(os.path.join(summaries, '*'))
+
+    def linkify_package(p):
+        if p in package_list:
+            return '<a href="%s.html">%s</a>' % (p, p)
+        logging.debug('package linkification failed for %s' % p)
+        return p
+
+    for p in package_list:
+        #
+        # write package summary
+        #
+        # (these exist in a separate directory to prevent their contents being
+        # searched by the package search script)
+        #
+        summary = os.path.join(summaries, p + '.html')
+
+        # this file should exist, so remove from the toremove list
+        if summary in toremove:
+            toremove.remove(summary)
+
+        # if listing files were added or removed, or it doesn't already exist,
+        # or force, update the summary
+        if p in update_summary or not os.path.exists(summary) or args.force:
+            logging.debug('writing %s' % summary)
+            if not args.dryrun:
+                with open(summary, 'w') as f:
+
+                    arch_packages = None
+                    for arch in common_constants.ARCHES:
+                        if p in packages[arch]:
+                            arch_packages = packages[arch]
+                            break
+
+                    if not arch_packages:
+                        continue
+
+                    bv = arch_packages[p].best_version
+                    title = "Cygwin Package Summary for %s" % p
+
+                    print(textwrap.dedent('''\
+                    <!DOCTYPE html>
+                    <html>
+                    <head>
+                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+                    <link rel="stylesheet" type="text/css" href="../../style.css"/>
+                    <title>%s</title>
+                    </head>
+                    <body>
+                    <div id="main">
+                    <h1>Package: %s</h1>''' % (title, p)), file=f)
+
+                    print('<span class="detail">sdesc</span>: %s<br><br>' % sdesc(arch_packages, p, bv), file=f)
+                    print('<span class="detail">ldesc</span>: %s<br><br>' % ldesc(arch_packages, p, bv), file=f)
+                    print('<span class="detail">categories</span>: %s<br><br>' % arch_packages[p].version_hints[bv].get('category', ''), file=f)
+
+                    for key in ['depends', 'obsoletes', 'provides', 'conflicts', 'build-depends']:
+                        value = arch_packages[p].version_hints[bv].get(key, None)
+                        if value:
+                            print('<span class="detail">%s</span>: %s<br><br>' % (key, ', '.join([linkify_package(p) for p in value.split(', ')])), file=f)
+
+                    es = arch_packages[p].version_hints[bv].get('external-source', None)
+                    if es:
+                        print('<span class="detail">source</span>: %s<br><br>' % linkify_package(es), file=f)
+                    else:
+                        print('<span class="detail">binaries</span>: %s<br><br>' % ', '.join([linkify_package(p) for p in sorted(arch_packages[p].is_used_by)]), file=f)
+                        es = p
+
+                    print('<span class="detail">maintainer(s)</span>: %s ' % ', '.join(sorted(pkg_maintainers[es])), file=f)
+                    print(textwrap.dedent('''\
+                    <span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+                    <a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>'''), file=f)
+                    print('<br><br>', file=f)
+
+                    print('<ul>', file=f)
+                    for arch in packages:
+                        if p in packages[arch]:
+
+                            print('<li><span class="detail">%s</span></li>' % arch, file=f)
+
+                            print('<table class="pkgtable">', file=f)
+                            print('<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>', file=f)
+
+                            def tar_line(pn, p, category, v, arch, f):
+                                if category not in p.vermap[v]:
+                                    return
+                                t = p.vermap[v][category]
+                                size = round(p.tar(v, category).size / 1024)
+                                name = v if category == 'install' else v + ' (source)'
+                                target = "%s-%s" % (pn, v) + ('' if category == 'install' else '-src')
+                                print('<tr><td>%s</td><td class="right">%d kB</td><td>[<a href="../%s/%s/%s">list of files</a>]</td></tr>' % (name, size, arch, pn, target), file=f)
+
+                            for version in sorted(packages[arch][p].vermap.keys(), key=lambda v: SetupVersion(v)):
+                                tar_line(p, packages[arch][p], 'install', version, arch, f)
+                                tar_line(p, packages[arch][p], 'source', version, arch, f)
+
+                            print('</table><br>', file=f)
+                    print('</ul>', file=f)
+
+                    print(textwrap.dedent('''\
+                    </div>
+                    </body>
+                    </html>'''), file=f)
+
+    for r in toremove:
+        logging.debug('rm %s' % r)
+        if not args.dryrun:
+            os.unlink(r)
+
+    #
+    # write packages.inc
+    #
+
+    packages_inc = os.path.join(args.htdocs, 'packages.inc')
+    logging.debug('writing %s' % packages_inc)
+    if not args.dryrun:
+        with open(packages_inc, 'w') as index:
+            os.fchmod(index.fileno(), 0o755)
+            print(textwrap.dedent('''\
+                                     <h2 class="cartouche">Available Packages</h2>
+                                     <table class="pkglist">'''), file=index)
+
+            for p in sorted(package_list, key=package.sort_key):
+
+                arch_packages = None
+                for arch in common_constants.ARCHES:
+                    if p in packages[arch]:
+                        arch_packages = packages[arch]
+                        break
+
+                if not arch_packages:
+                    continue
+
+                bv = arch_packages[p].best_version
+                header = sdesc(arch_packages, p, bv)
+
+                print('<tr><td><a href="summary' + '/' + p + '.html">' + p + '</a></td><td>' + html.escape(header, quote=False) + '</td></tr>', file=index)
+
+            print(textwrap.dedent('''\
+                                     </table>
+                                     '''), file=index)
+
+
+def write_arch_listing(args, packages, arch):
+    update_summary = set()
+    base = os.path.join(args.htdocs, arch)
+    ensure_dir_exists(args, base)
 
     #
     # write base directory .htaccess, if needed
@@ -105,12 +287,7 @@ def update_package_listings(args, packages, arch):
     for p in packages:
 
         dir = os.path.join(base, p)
-        if not args.dryrun:
-            try:
-                os.makedirs(dir, exist_ok=True)
-            except FileExistsError:
-                pass
-            os.chmod(dir, 0o777)
+        ensure_dir_exists(args, dir)
 
         #
         # write .htaccess if needed
@@ -138,7 +315,7 @@ def update_package_listings(args, packages, arch):
         #
         # for each tarfile, write tarfile listing
         #
-
+        listings = os.listdir(dir)
         for t in itertools.chain.from_iterable([packages[p].tars[vr] for vr in packages[p].tars]):
             fver = re.sub(r'\.tar.*$', '', t)
             listing = os.path.join(dir, fver)
@@ -149,9 +326,12 @@ def update_package_listings(args, packages, arch):
                 logging.debug('writing %s' % listing)
 
                 if not args.dryrun:
+                    # versions are being added, so summary needs updating
+                    update_summary.add(p)
+
                     with open(listing, 'w') as f:
                         bv = packages[p].best_version
-                        header = p + ": " + desc(packages, p, bv)
+                        header = p + ": " + sdesc(packages, p, bv)
 
                         if fver.endswith('-src'):
                             header = header + " (source code)"
@@ -202,30 +382,13 @@ def update_package_listings(args, packages, arch):
             if listing in toremove:
                 toremove.remove(listing)
 
-    #
-    # write packages.inc
-    #
+            if fver in listings:
+                listings.remove(fver)
 
-    packages_inc = os.path.join(base, 'packages.inc')
-    logging.debug('writing %s' % packages_inc)
-    if not args.dryrun:
-        with open(packages_inc, 'w') as index:
-            os.fchmod(index.fileno(), 0o755)
-            print(textwrap.dedent('''\
-                                     <div id="%s">
-                                     <h2 class="cartouche">Available Packages for %s</h2>
-                                     <table class="pkglist">''') % (arch, arch), file=index)
-
-            for p in sorted(packages.keys(), key=package.sort_key):
-
-                bv = packages[p].best_version
-                header = desc(packages, p, bv)
-
-                print('<tr><td><a href="' + arch + '/' + p + '">' + p + '</a></td><td>' + html.escape(header, quote=False) + '</td></tr>', file=index)
-
-            print(textwrap.dedent('''\
-                                     </table>
-                                     </div>'''), file=index)
+        # some versions remain on toremove list, and will be removed, so summary
+        # needs updating
+        if listings:
+            update_summary.add(p)
 
     #
     # remove any remaining files for which there was no corresponding package
@@ -245,6 +408,8 @@ def update_package_listings(args, packages, arch):
                 logging.debug('rmdir %s' % dirpath)
                 os.rmdir(os.path.join(dirpath))
 
+    return update_summary
+
 
 if __name__ == "__main__":
     htdocs_default = os.path.join(common_constants.HTDOCS, 'packages')
diff --git a/test/test_calm.py b/test/test_calm.py
index 322d776..80b8e4e 100755
--- a/test/test_calm.py
+++ b/test/test_calm.py
@@ -151,13 +151,15 @@ class CalmTest(unittest.TestCase):
         setattr(args, 'arch', 'x86')
         setattr(args, 'htdocs', htdocs)
         setattr(args, 'rel_area', 'testdata/relarea')
+        setattr(args, 'homedir', 'testdata/homes')
         setattr(args, 'dryrun', False)
         setattr(args, 'force', True)
         setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
 
-        packages = package.read_packages(args.rel_area, args.arch)
-        package.validate_packages(args, packages)
-        pkg2html.update_package_listings(args, packages, args.arch)
+        packages = {}
+        packages[args.arch] = package.read_packages(args.rel_area, args.arch)
+        package.validate_packages(args, packages[args.arch])
+        pkg2html.update_package_listings(args, packages)
 
         # compare the output files with expected
         for (dirpath, subdirs, files) in os.walk(htdocs):
@@ -393,7 +395,7 @@ class CalmTest(unittest.TestCase):
         packages = calm.calm.process(args, state)
         self.assertTrue(packages)
 
-        pkg2html.update_package_listings(args, packages['x86'], 'x86')
+        pkg2html.update_package_listings(args, packages)
         package.write_setup_ini(args, packages['x86'], 'x86')
 
         with open(os.path.join(args.rel_area, 'setup.ini')) as inifile:
diff --git a/test/testdata/htdocs.expected/packages.inc b/test/testdata/htdocs.expected/packages.inc
new file mode 100755
index 0000000..ad4d882
--- /dev/null
+++ b/test/testdata/htdocs.expected/packages.inc
@@ -0,0 +1,26 @@
+<h2 class="cartouche">Available Packages</h2>
+<table class="pkglist">
+<tr><td><a href="summary/arc.html">arc</a></td><td>The ARC archive utility</td></tr>
+<tr><td><a href="summary/base-cygwin.html">base-cygwin</a></td><td>Initial base installation helper script</td></tr>
+<tr><td><a href="summary/corrupt.html">corrupt</a></td><td>A corrupt package</td></tr>
+<tr><td><a href="summary/cygwin.html">cygwin</a></td><td>The UNIX emulation engine</td></tr>
+<tr><td><a href="summary/cygwin-debuginfo.html">cygwin-debuginfo</a></td><td>Debug info for cygwin</td></tr>
+<tr><td><a href="summary/cygwin-devel.html">cygwin-devel</a></td><td>Core development files</td></tr>
+<tr><td><a href="summary/keychain.html">keychain</a></td><td>Key manager for OpenSSH</td></tr>
+<tr><td><a href="summary/libdns_sd-devel.html">libdns_sd-devel</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr><td><a href="summary/libdns_sd1.html">libdns_sd1</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr><td><a href="summary/mDNSResponder.html">mDNSResponder</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr><td><a href="summary/obs-a.html">obs-a</a></td><td>obsolete package A</td></tr>
+<tr><td><a href="summary/obs-b.html">obs-b</a></td><td>obsolete package B</td></tr>
+<tr><td><a href="summary/openssh.html">openssh</a></td><td>The OpenSSH server and client programs</td></tr>
+<tr><td><a href="summary/per-version.html">per-version</a></td><td>Per-version hint test package</td></tr>
+<tr><td><a href="summary/per-version-replacement-hint-only.html">per-version-replacement-hint-only</a></td><td>Per-version hint test package</td></tr>
+<tr><td><a href="summary/perl-Net-SMTP-SSL.html">perl-Net-SMTP-SSL</a></td><td>Perl distribution Net-SMTP-SSL</td></tr>
+<tr><td><a href="summary/rpm-doc.html">rpm-doc</a></td><td>Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)</td></tr>
+<tr><td><a href="summary/staleversion.html">staleversion</a></td><td>Test package for stale version removal</td></tr>
+<tr><td><a href="summary/test-c.html">test-c</a></td><td>test package C</td></tr>
+<tr><td><a href="summary/test-d.html">test-d</a></td><td>test package D</td></tr>
+<tr><td><a href="summary/test-e.html">test-e</a></td><td>test package E</td></tr>
+<tr><td><a href="summary/testpackage.html">testpackage</a></td><td>A test package (stuff &amp; other stuff)</td></tr>
+</table>
+
diff --git a/test/testdata/htdocs.expected/summary/arc.html b/test/testdata/htdocs.expected/summary/arc.html
new file mode 100644
index 0000000..6f13aef
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/arc.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for arc</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: arc</h1>
+<span class="detail">sdesc</span>: The ARC archive utility<br><br>
+<span class="detail">ldesc</span>: This program is based on the MSDOS ARC program, version 5.21, plus a
+few enhancements. ARC performs Huffman Squeezing on data. The Huffman
+Squeeze algorithm was removed from MSDOS ARC after version 5.12. It
+turns out to be more efficient than Lempel-Ziv style compression when
+compressing graphic images. Squeeze analysis is always done now, and
+the best of packing, squeezing, or crunching is used.<br><br>
+<span class="detail">categories</span>: Archive<br><br>
+<span class="detail">binaries</span>: <a href="arc.html">arc</a><br><br>
+<span class="detail">maintainer(s)</span>: Jari Aalto 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>4.32.7-10</td><td class="right">1 kB</td><td>[<a href="../x86/arc/arc-4.32.7-10">list of files</a>]</td></tr>
+<tr><td>4.32.7-10 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/arc/arc-4.32.7-10-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/base-cygwin.html b/test/testdata/htdocs.expected/summary/base-cygwin.html
new file mode 100644
index 0000000..fc6b266
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/base-cygwin.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for base-cygwin</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: base-cygwin</h1>
+<span class="detail">sdesc</span>: Initial base installation helper script<br><br>
+<span class="detail">ldesc</span>: Initial base installation helper script.<br><br>
+<span class="detail">categories</span>: Base<br><br>
+<span class="detail">binaries</span>: <br><br>
+<span class="detail">maintainer(s)</span>: Corinna Vinschen 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>3.6-1</td><td class="right">0 kB</td><td>[<a href="../x86/base-cygwin/base-cygwin-3.6-1">list of files</a>]</td></tr>
+<tr><td>3.8-1</td><td class="right">0 kB</td><td>[<a href="../x86/base-cygwin/base-cygwin-3.8-1">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/corrupt.html b/test/testdata/htdocs.expected/summary/corrupt.html
new file mode 100644
index 0000000..80316d5
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/corrupt.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for corrupt</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: corrupt</h1>
+<span class="detail">sdesc</span>: A corrupt package<br><br>
+<span class="detail">ldesc</span>: A package containing corrupt archives<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">binaries</span>: <a href="corrupt.html">corrupt</a><br><br>
+<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>2.0.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/corrupt/corrupt-2.0.0-1">list of files</a>]</td></tr>
+<tr><td>2.0.0-1 (source)</td><td class="right">354 kB</td><td>[<a href="../x86/corrupt/corrupt-2.0.0-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
new file mode 100644
index 0000000..f311971
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for cygwin-debuginfo</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: cygwin-debuginfo</h1>
+<span class="detail">sdesc</span>: Debug info for cygwin<br><br>
+<span class="detail">ldesc</span>: This package contains files necessary for debugging the
+cygwin package with gdb.<br><br>
+<span class="detail">categories</span>: Debug<br><br>
+<span class="detail">depends</span>: <a href="cygwin-debuginfo.html">cygwin-debuginfo</a><br><br>
+<span class="detail">source</span>: <a href="cygwin.html">cygwin</a><br><br>
+<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>2.2.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1">list of files</a>]</td></tr>
+<tr><td>2.2.1-1</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1">list of files</a>]</td></tr>
+<tr><td>2.3.0-0.3</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-devel.html b/test/testdata/htdocs.expected/summary/cygwin-devel.html
new file mode 100644
index 0000000..1576218
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/cygwin-devel.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for cygwin-devel</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: cygwin-devel</h1>
+<span class="detail">sdesc</span>: Core development files<br><br>
+<span class="detail">ldesc</span>: Core development files required to build Cygwin packages<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">source</span>: <a href="cygwin.html">cygwin</a><br><br>
+<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>2.2.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin-devel/cygwin-devel-2.2.0-1">list of files</a>]</td></tr>
+<tr><td>2.2.1-1</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin-devel/cygwin-devel-2.2.1-1">list of files</a>]</td></tr>
+<tr><td>2.3.0-0.3</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin-devel/cygwin-devel-2.3.0-0.3">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/cygwin.html b/test/testdata/htdocs.expected/summary/cygwin.html
new file mode 100644
index 0000000..187b9da
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/cygwin.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for cygwin</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: cygwin</h1>
+<span class="detail">sdesc</span>: The UNIX emulation engine<br><br>
+<span class="detail">ldesc</span>: The UNIX emulation engine<br><br>
+<span class="detail">categories</span>: Base<br><br>
+<span class="detail">depends</span>: <a href="base-cygwin.html">base-cygwin</a><br><br>
+<span class="detail">binaries</span>: <a href="cygwin.html">cygwin</a>, <a href="cygwin-debuginfo.html">cygwin-debuginfo</a>, <a href="cygwin-devel.html">cygwin-devel</a><br><br>
+<span class="detail">maintainer(s)</span>: Corinna Vinschen, Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>2.2.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.0-1">list of files</a>]</td></tr>
+<tr><td>2.2.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.0-1-src">list of files</a>]</td></tr>
+<tr><td>2.2.1-1</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.1-1">list of files</a>]</td></tr>
+<tr><td>2.2.1-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.1-1-src">list of files</a>]</td></tr>
+<tr><td>2.3.0-0.3</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin/cygwin-2.3.0-0.3">list of files</a>]</td></tr>
+<tr><td>2.3.0-0.3 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/cygwin/cygwin-2.3.0-0.3-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/keychain.html b/test/testdata/htdocs.expected/summary/keychain.html
new file mode 100644
index 0000000..c4e8ce7
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/keychain.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for keychain</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: keychain</h1>
+<span class="detail">sdesc</span>: Key manager for OpenSSH<br><br>
+<span class="detail">ldesc</span>: Keychain is an OpenSSH key manager, typically run from
+~/.bash_profile. When keychain is run, it checks for a running
+ssh-agent, otherwise it starts one. It saves the ssh-agent environment
+variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins
+and non-interactive shells such as cron jobs can source the file and
+make passwordless ssh connections. In addition, when keychain runs, it
+verifies that the key files specified on the command-line are known to
+ssh-agent, otherwise it loads them, prompting you for a password if
+necessary<br><br>
+<span class="detail">categories</span>: Utils<br><br>
+<span class="detail">depends</span>: <a href="openssh.html">openssh</a><br><br>
+<span class="detail">binaries</span>: <a href="keychain.html">keychain</a><br><br>
+<span class="detail">maintainer(s)</span>: Jari Aalto 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>2.6.8-1</td><td class="right">30 kB</td><td>[<a href="../x86/keychain/keychain-2.6.8-1">list of files</a>]</td></tr>
+<tr><td>2.6.8-1 (source)</td><td class="right">35 kB</td><td>[<a href="../x86/keychain/keychain-2.6.8-1-src">list of files</a>]</td></tr>
+<tr><td>2.7.1-1</td><td class="right">31 kB</td><td>[<a href="../x86/keychain/keychain-2.7.1-1">list of files</a>]</td></tr>
+<tr><td>2.7.1-1 (source)</td><td class="right">132 kB</td><td>[<a href="../x86/keychain/keychain-2.7.1-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
new file mode 100644
index 0000000..0678e5c
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for libdns_sd-devel</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: libdns_sd-devel</h1>
+<span class="detail">sdesc</span>: Bonjour Zeroconf implementation<br><br>
+<span class="detail">ldesc</span>: Bonjour, also known as zero-configuration networking, enables
+automatic discovery of computers, devices, and services on IP networks using
+industry standard IP protocols.<br><br>
+<span class="detail">categories</span>: Net<br><br>
+<span class="detail">depends</span>: <a href="libdns_sd1.html">libdns_sd1</a><br><br>
+<span class="detail">source</span>: <a href="mDNSResponder.html">mDNSResponder</a><br><br>
+<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>379.32.1-1</td><td class="right">0 kB</td><td>[<a href="../x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd1.html b/test/testdata/htdocs.expected/summary/libdns_sd1.html
new file mode 100644
index 0000000..cfe6a56
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/libdns_sd1.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for libdns_sd1</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: libdns_sd1</h1>
+<span class="detail">sdesc</span>: Bonjour Zeroconf implementation<br><br>
+<span class="detail">ldesc</span>: Bonjour, also known as zero-configuration networking, enables
+automatic discovery of computers, devices, and services on IP networks using
+industry standard IP protocols.<br><br>
+<span class="detail">categories</span>: Net<br><br>
+<span class="detail">source</span>: <a href="mDNSResponder.html">mDNSResponder</a><br><br>
+<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>379.32.1-1</td><td class="right">0 kB</td><td>[<a href="../x86/libdns_sd1/libdns_sd1-379.32.1-1">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder.html b/test/testdata/htdocs.expected/summary/mDNSResponder.html
new file mode 100644
index 0000000..746101e
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for mDNSResponder</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: mDNSResponder</h1>
+<span class="detail">sdesc</span>: Bonjour Zeroconf implementation<br><br>
+<span class="detail">ldesc</span>: Bonjour, also known as zero-configuration networking, enables
+automatic discovery of computers, devices, and services on IP networks using
+industry standard IP protocols.<br><br>
+<span class="detail">categories</span>: Net<br><br>
+<span class="detail">depends</span>: <a href="libdns_sd1.html">libdns_sd1</a><br><br>
+<span class="detail">binaries</span>: <a href="libdns_sd-devel.html">libdns_sd-devel</a>, <a href="libdns_sd1.html">libdns_sd1</a>, <a href="mDNSResponder.html">mDNSResponder</a><br><br>
+<span class="detail">maintainer(s)</span>: Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>379.32.1-1</td><td class="right">0 kB</td><td>[<a href="../x86/mDNSResponder/mDNSResponder-379.32.1-1">list of files</a>]</td></tr>
+<tr><td>379.32.1-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/mDNSResponder/mDNSResponder-379.32.1-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/obs-a.html b/test/testdata/htdocs.expected/summary/obs-a.html
new file mode 100644
index 0000000..e2591e6
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/obs-a.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for obs-a</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: obs-a</h1>
+<span class="detail">sdesc</span>: obsolete package A<br><br>
+<span class="detail">ldesc</span>: obs-a<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">binaries</span>: <a href="obs-a.html">obs-a</a><br><br>
+<span class="detail">maintainer(s)</span>: ORPHANED 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/obs-a/obs-a-1.0-1">list of files</a>]</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/obs-a/obs-a-1.0-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/obs-b.html b/test/testdata/htdocs.expected/summary/obs-b.html
new file mode 100644
index 0000000..8de2270
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/obs-b.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for obs-b</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: obs-b</h1>
+<span class="detail">sdesc</span>: obsolete package B<br><br>
+<span class="detail">ldesc</span>: obs-b<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">binaries</span>: <a href="obs-b.html">obs-b</a><br><br>
+<span class="detail">maintainer(s)</span>: ORPHANED 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/obs-b/obs-b-1.0-1">list of files</a>]</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/obs-b/obs-b-1.0-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/openssh.html b/test/testdata/htdocs.expected/summary/openssh.html
new file mode 100644
index 0000000..334d96c
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/openssh.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for openssh</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: openssh</h1>
+<span class="detail">sdesc</span>: The OpenSSH server and client programs<br><br>
+<span class="detail">ldesc</span>: OpenSSH is a program for logging into a remote machine and for
+	executing commands on a remote machine.  It can replace rlogin and rsh,
+	providing encrypted communication between two machines.<br><br>
+<span class="detail">categories</span>: Net<br><br>
+<span class="detail">binaries</span>: <a href="openssh.html">openssh</a><br><br>
+<span class="detail">maintainer(s)</span>: Corinna Vinschen 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>7.2p2-1</td><td class="right">0 kB</td><td>[<a href="../x86/openssh/openssh-7.2p2-1">list of files</a>]</td></tr>
+<tr><td>7.2p2-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/openssh/openssh-7.2p2-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
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
new file mode 100644
index 0000000..3bfc642
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/per-version-replacement-hint-only.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for per-version-replacement-hint-only</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: per-version-replacement-hint-only</h1>
+<span class="detail">sdesc</span>: Per-version hint test package<br><br>
+<span class="detail">ldesc</span>: Per-version hint test package<br><br>
+<span class="detail">categories</span>: Base<br><br>
+<span class="detail">depends</span>: <a href="cygwin.html">cygwin</a><br><br>
+<span class="detail">binaries</span>: <a href="per-version-replacement-hint-only.html">per-version-replacement-hint-only</a><br><br>
+<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/per-version-replacement-hint-only/per-version-replacement-hint-only-1.0-1">list of files</a>]</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/per-version-replacement-hint-only/per-version-replacement-hint-only-1.0-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/per-version.html b/test/testdata/htdocs.expected/summary/per-version.html
new file mode 100644
index 0000000..f179c85
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/per-version.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for per-version</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: per-version</h1>
+<span class="detail">sdesc</span>: Per-version hint test package<br><br>
+<span class="detail">ldesc</span>: Per-version hint test package<br><br>
+<span class="detail">categories</span>: Base<br><br>
+<span class="detail">depends</span>: <a href="base-cygwin.html">base-cygwin</a><br><br>
+<span class="detail">binaries</span>: <a href="per-version.html">per-version</a><br><br>
+<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>4.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/per-version/per-version-4.0-1">list of files</a>]</td></tr>
+<tr><td>4.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/per-version/per-version-4.0-1-src">list of files</a>]</td></tr>
+<tr><td>4.8-1</td><td class="right">0 kB</td><td>[<a href="../x86/per-version/per-version-4.8-1">list of files</a>]</td></tr>
+<tr><td>4.8-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/per-version/per-version-4.8-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
new file mode 100644
index 0000000..03580b7
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for perl-Net-SMTP-SSL</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: perl-Net-SMTP-SSL</h1>
+<span class="detail">sdesc</span>: Perl distribution Net-SMTP-SSL<br><br>
+<span class="detail">ldesc</span>: Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
+its network operations in order to support encrypted connections.<br><br>
+<span class="detail">categories</span>: Perl<br><br>
+<span class="detail">binaries</span>: <a href="perl-Net-SMTP-SSL.html">perl-Net-SMTP-SSL</a><br><br>
+<span class="detail">maintainer(s)</span>: Blooey McFooey, Yaakov Selkowitz 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.03-1</td><td class="right">3 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1">list of files</a>]</td></tr>
+<tr><td>1.03-1 (source)</td><td class="right">3 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc.html b/test/testdata/htdocs.expected/summary/rpm-doc.html
new file mode 100644
index 0000000..190c8f3
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/rpm-doc.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for rpm-doc</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: rpm-doc</h1>
+<span class="detail">sdesc</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<br><br>
+<span class="detail">ldesc</span>: rpm-doc<br><br>
+<span class="detail">categories</span>: _obsolete<br><br>
+<span class="detail">binaries</span>: <a href="rpm-doc.html">rpm-doc</a><br><br>
+<span class="detail">maintainer(s)</span>:  
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>4.1-2</td><td class="right">50 kB</td><td>[<a href="../x86/rpm-doc/rpm-doc-4.1-2">list of files</a>]</td></tr>
+<tr><td>4.1-2 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/rpm-doc/rpm-doc-4.1-2-src">list of files</a>]</td></tr>
+<tr><td>999-1</td><td class="right">0 kB</td><td>[<a href="../x86/rpm-doc/rpm-doc-999-1">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/staleversion.html b/test/testdata/htdocs.expected/summary/staleversion.html
new file mode 100644
index 0000000..031ab45
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/staleversion.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for staleversion</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: staleversion</h1>
+<span class="detail">sdesc</span>: Test package for stale version removal<br><br>
+<span class="detail">ldesc</span>: Test package for stale version removal<br><br>
+<span class="detail">categories</span>: Shells Base<br><br>
+<span class="detail">binaries</span>: <a href="staleversion.html">staleversion</a><br><br>
+<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>240-1</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-240-1">list of files</a>]</td></tr>
+<tr><td>240-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-240-1-src">list of files</a>]</td></tr>
+<tr><td>242-0</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-242-0">list of files</a>]</td></tr>
+<tr><td>242-0 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-242-0-src">list of files</a>]</td></tr>
+<tr><td>243-0</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-243-0">list of files</a>]</td></tr>
+<tr><td>243-0 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-243-0-src">list of files</a>]</td></tr>
+<tr><td>250-0</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-250-0">list of files</a>]</td></tr>
+<tr><td>250-0 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-250-0-src">list of files</a>]</td></tr>
+<tr><td>251-0</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-251-0">list of files</a>]</td></tr>
+<tr><td>251-0 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-251-0-src">list of files</a>]</td></tr>
+<tr><td>260-0</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-260-0">list of files</a>]</td></tr>
+<tr><td>260-0 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/staleversion/staleversion-260-0-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/test-c.html b/test/testdata/htdocs.expected/summary/test-c.html
new file mode 100644
index 0000000..cf3757c
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/test-c.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for test-c</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: test-c</h1>
+<span class="detail">sdesc</span>: test package C<br><br>
+<span class="detail">ldesc</span>: test-c<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">depends</span>: test-d (>= 1.0), <a href="test-e.html">test-e</a><br><br>
+<span class="detail">obsoletes</span>: <a href="obs-a.html">obs-a</a>, <a href="obs-b.html">obs-b</a><br><br>
+<span class="detail">binaries</span>: <a href="test-c.html">test-c</a><br><br>
+<span class="detail">maintainer(s)</span>: ORPHANED 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/test-c/test-c-1.0-1">list of files</a>]</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/test-c/test-c-1.0-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/test-d.html b/test/testdata/htdocs.expected/summary/test-d.html
new file mode 100644
index 0000000..dd13f6e
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/test-d.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for test-d</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: test-d</h1>
+<span class="detail">sdesc</span>: test package D<br><br>
+<span class="detail">ldesc</span>: test-d<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">binaries</span>: <a href="test-d.html">test-d</a><br><br>
+<span class="detail">maintainer(s)</span>: ORPHANED 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.0.42590-1</td><td class="right">0 kB</td><td>[<a href="../x86/test-d/test-d-1.0.42590-1">list of files</a>]</td></tr>
+<tr><td>1.0.42590-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/test-d/test-d-1.0.42590-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/test-e.html b/test/testdata/htdocs.expected/summary/test-e.html
new file mode 100644
index 0000000..ec57c10
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/test-e.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for test-e</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: test-e</h1>
+<span class="detail">sdesc</span>: test package E<br><br>
+<span class="detail">ldesc</span>: test-e<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">build-depends</span>: libtextcat-devel<br><br>
+<span class="detail">binaries</span>: <a href="test-e.html">test-e</a><br><br>
+<span class="detail">maintainer(s)</span>: ORPHANED 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>1.0-1</td><td class="right">0 kB</td><td>[<a href="../x86/test-e/test-e-1.0-1">list of files</a>]</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">0 kB</td><td>[<a href="../x86/test-e/test-e-1.0-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/summary/testpackage.html b/test/testdata/htdocs.expected/summary/testpackage.html
new file mode 100644
index 0000000..6410b6e
--- /dev/null
+++ b/test/testdata/htdocs.expected/summary/testpackage.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" type="text/css" href="../../style.css"/>
+<title>Cygwin Package Summary for testpackage</title>
+</head>
+<body>
+<div id="main">
+<h1>Package: testpackage</h1>
+<span class="detail">sdesc</span>: A test package (stuff & other stuff)<br><br>
+<span class="detail">ldesc</span>: A test package (stuff & other stuff)<br><br>
+<span class="detail">categories</span>: Devel<br><br>
+<span class="detail">binaries</span>: <a href="testpackage.html">testpackage</a><br><br>
+<span class="detail">maintainer(s)</span>: Blooey McFooey 
+<span class="smaller">(Use <a href="https://cygwin.com/lists.html#cygwin">the mailing list</a> to report bugs or ask questions.
+<a href="https://cygwin.com/problems.html#personal-email">Do not contact the maintainer(s) directly</a>.)</span>
+<br><br>
+<ul>
+<li><span class="detail">x86</span></li>
+<table class="pkgtable">
+<tr><th>Version</th><th>Package Size</th><th>Files</th></tr>
+<tr><td>0.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/testpackage/testpackage-0.1-1">list of files</a>]</td></tr>
+<tr><td>0.1-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/testpackage/testpackage-0.1-1-src">list of files</a>]</td></tr>
+</table><br>
+</ul>
+</div>
+</body>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/packages.inc b/test/testdata/htdocs.expected/x86/packages.inc
deleted file mode 100755
index 81bd0ec..0000000
--- a/test/testdata/htdocs.expected/x86/packages.inc
+++ /dev/null
@@ -1,27 +0,0 @@
-<div id="x86">
-<h2 class="cartouche">Available Packages for x86</h2>
-<table class="pkglist">
-<tr><td><a href="x86/arc">arc</a></td><td>The ARC archive utility</td></tr>
-<tr><td><a href="x86/base-cygwin">base-cygwin</a></td><td>Initial base installation helper script</td></tr>
-<tr><td><a href="x86/corrupt">corrupt</a></td><td>A corrupt package</td></tr>
-<tr><td><a href="x86/cygwin">cygwin</a></td><td>The UNIX emulation engine</td></tr>
-<tr><td><a href="x86/cygwin-debuginfo">cygwin-debuginfo</a></td><td>Debug info for cygwin</td></tr>
-<tr><td><a href="x86/cygwin-devel">cygwin-devel</a></td><td>Core development files</td></tr>
-<tr><td><a href="x86/keychain">keychain</a></td><td>Key manager for OpenSSH</td></tr>
-<tr><td><a href="x86/libdns_sd-devel">libdns_sd-devel</a></td><td>Bonjour Zeroconf implementation</td></tr>
-<tr><td><a href="x86/libdns_sd1">libdns_sd1</a></td><td>Bonjour Zeroconf implementation</td></tr>
-<tr><td><a href="x86/mDNSResponder">mDNSResponder</a></td><td>Bonjour Zeroconf implementation</td></tr>
-<tr><td><a href="x86/obs-a">obs-a</a></td><td>obsolete package A</td></tr>
-<tr><td><a href="x86/obs-b">obs-b</a></td><td>obsolete package B</td></tr>
-<tr><td><a href="x86/openssh">openssh</a></td><td>The OpenSSH server and client programs</td></tr>
-<tr><td><a href="x86/per-version">per-version</a></td><td>Per-version hint test package</td></tr>
-<tr><td><a href="x86/per-version-replacement-hint-only">per-version-replacement-hint-only</a></td><td>Per-version hint test package</td></tr>
-<tr><td><a href="x86/perl-Net-SMTP-SSL">perl-Net-SMTP-SSL</a></td><td>Perl distribution Net-SMTP-SSL</td></tr>
-<tr><td><a href="x86/rpm-doc">rpm-doc</a></td><td>Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)</td></tr>
-<tr><td><a href="x86/staleversion">staleversion</a></td><td>Test package for stale version removal</td></tr>
-<tr><td><a href="x86/test-c">test-c</a></td><td>test package C</td></tr>
-<tr><td><a href="x86/test-d">test-d</a></td><td>test package D</td></tr>
-<tr><td><a href="x86/test-e">test-e</a></td><td>test package E</td></tr>
-<tr><td><a href="x86/testpackage">testpackage</a></td><td>A test package (stuff &amp; other stuff)</td></tr>
-</table>
-</div>
diff --git a/test/testdata/process_arch/htdocs.expected b/test/testdata/process_arch/htdocs.expected
index b0fb21c..fb09e2d 100644
--- a/test/testdata/process_arch/htdocs.expected
+++ b/test/testdata/process_arch/htdocs.expected
@@ -1,5 +1,28 @@
-{'.': [],
- 'x86': ['.htaccess', 'packages.inc'],
+{'.': ['packages.inc'],
+ 'summary': ['arc.html',
+             'base-cygwin.html',
+             'corrupt.html',
+             'cygwin-debuginfo.html',
+             'cygwin-devel.html',
+             'cygwin.html',
+             'keychain.html',
+             'libdns_sd-devel.html',
+             'libdns_sd1.html',
+             'mDNSResponder.html',
+             'obs-a.html',
+             'obs-b.html',
+             'openssh.html',
+             'per-version-replacement-hint-only.html',
+             'per-version.html',
+             'perl-Net-SMTP-SSL.html',
+             'rpm-doc.html',
+             'staleversion.html',
+             'test-c.html',
+             'test-d.html',
+             'test-e.html',
+             'testpackage-subpackage.html',
+             'testpackage.html'],
+ 'x86': ['.htaccess'],
  'x86/arc': ['.htaccess', 'arc-4.32.7-10', 'arc-4.32.7-10-src'],
  'x86/base-cygwin': ['.htaccess', 'base-cygwin-3.6-1', 'base-cygwin-3.8-1'],
  'x86/corrupt': ['.htaccess', 'corrupt-2.0.0-1', 'corrupt-2.0.0-1-src'],
@@ -49,4 +72,15 @@
  'x86/test-d': ['.htaccess', 'test-d-1.0-1', 'test-d-1.0-1-src'],
  'x86/test-e': ['.htaccess', 'test-e-1.0-1', 'test-e-1.0-1-src'],
  'x86/testpackage': ['.htaccess', 'testpackage-1.0-1', 'testpackage-1.0-1-src'],
- 'x86/testpackage-subpackage': ['.htaccess', 'testpackage-subpackage-1.0-1']}
+ 'x86/testpackage-subpackage': ['.htaccess', 'testpackage-subpackage-1.0-1'],
+ 'x86_64': ['.htaccess'],
+ 'x86_64/obs-a': ['.htaccess', 'obs-a-1.0-1', 'obs-a-1.0-1-src'],
+ 'x86_64/obs-b': ['.htaccess', 'obs-b-1.0-1', 'obs-b-1.0-1-src'],
+ 'x86_64/perl-Net-SMTP-SSL': ['.htaccess',
+                              'perl-Net-SMTP-SSL-1.03-1',
+                              'perl-Net-SMTP-SSL-1.03-1-src',
+                              'perl-Net-SMTP-SSL-1.03-2',
+                              'perl-Net-SMTP-SSL-1.03-2-src'],
+ 'x86_64/test-c': ['.htaccess', 'test-c-1.0-1', 'test-c-1.0-1-src'],
+ 'x86_64/test-d': ['.htaccess', 'test-d-1.0-1', 'test-d-1.0-1-src'],
+ 'x86_64/test-e': ['.htaccess', 'test-e-1.0-1', 'test-e-1.0-1-src']}


                 reply	other threads:[~2019-05-25 11:35 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190525113519.24267.qmail@sourceware.org \
    --to=jturney@sourceware.org \
    --cc=cygwin-apps-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).