[calm - Cygwin server-side packaging maintenance script] branch master, updated. 20190530-32-gf92ad1d

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


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

commit f92ad1d5c292ed54e7a62f5c52280efab8267f37
Author: Jon Turney <[email protected]>
Date:   Wed Jun 19 18:26:23 2019 +0100

    Omit maintainer in package summary page if we don't have any details
    
    Also improve the package/maintainer validation we do, to better detect
    non-obsolete, maintainer-less packages.
    
    Also make some unnecessarily absolute URLs relative.

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

commit 7b5e7c5f9a9e981d9165a0486c1407ad9e9b6a09
Author: Jon Turney <[email protected]>
Date:   Mon Jun 17 20:01:35 2019 +0100

    Linkify hyperlinks in ldesc in package summary page
    
    Also move where we do html escaping, so it doesn't interact with
    formatting of line-breaks in ldesc

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

commit 65fee8305bcab558831f89750c1690298a210895
Author: Jon Turney <[email protected]>
Date:   Mon Jun 17 11:43:34 2019 +0100

    Clarify messages which can appear as a consequence of another error
    
    Clarify messages which can appear as a consequence of another error in a
    different package. (We don't distinguish between missing and errored
    packages, so this is the best we can do, at the moment.)

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

commit 9d3908e05391a205ebcdb923d2ffdf9fa8687f50
Author: Jon Turney <[email protected]>
Date:   Sun Jun 16 23:39:05 2019 +0100

    Round file size up in package summary
    
    Round the file size up in package summary (so tiny, but non-empty
    packages are reported as 1kB, while empty packages are still reported as
    0kB)

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

commit 3a2efe206ea6879cdf0dfac252a9f1f70d6e9638
Author: Jon Turney <[email protected]>
Date:   Sun Jun 16 23:18:24 2019 +0100

    Add alphabetic shortcuts to package list

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

commit 5a0661fd16b9af1663ab6b8676df0b35616604ae
Author: Jon Turney <[email protected]>
Date:   Mon Jun 10 19:58:03 2019 +0100

    Drop some accomodations for sdesc:-less packages
    
    Also use sdesc, rather than package name, in place of an absent ldesc in
    package summary

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

commit 4a35a245b35b5817c772eda941b45d06ffacb01f
Author: Jon Turney <[email protected]>
Date:   Sun Jun 9 21:13:35 2019 +0100

    Don't allow hint file to consist of just 'skip:'
    
    Historically, this was allowed for a source-only package, but source
    packages not having a sdesc: is now inconvenient.
    
    For uploads, this should be no great hardship, as we already suggest
    cygport >= 0.23.0 for pvr.hint generation.
    
    'calm-tool fix-skip-only-hint' can be used on an existing relarea.

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

commit c1d428b24f352cbb1f92ceae9b279bcffe128e50
Author: Jon Turney <[email protected]>
Date:   Tue Jun 11 17:57:22 2019 +0100

    packages.inc doesn't need execute permissions

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

commit 46a115f52f38ae46f0e32b6956a55a5b5c2e91bd
Author: Jon Turney <[email protected]>
Date:   Tue Jun 11 13:26:19 2019 +0100

    Factor out os.makedirs wrapper


Diff:
---
 calm/calm.py                                       |    6 +-
 calm/dedupsrc.py                                   |    6 +-
 calm/hint.py                                       |    8 ++-
 calm/movelist.py                                   |   11 +--
 calm/package.py                                    |   19 +++--
 calm/past_mistakes.py                              |   11 +++
 calm/pkg2html.py                                   |   77 ++++++++++++--------
 calm/utils.py                                      |   13 ++++
 test/testdata/htdocs.expected/packages.inc         |   35 ++++++---
 test/testdata/htdocs.expected/summary/arc.html     |    4 +-
 .../htdocs.expected/summary/base-cygwin.html       |    8 +-
 test/testdata/htdocs.expected/summary/corrupt.html |    6 +-
 .../htdocs.expected/summary/cygwin-debuginfo.html  |   10 ++--
 .../htdocs.expected/summary/cygwin-devel.html      |   10 ++--
 test/testdata/htdocs.expected/summary/cygwin.html  |   16 ++--
 .../testdata/htdocs.expected/summary/keychain.html |    8 +-
 .../htdocs.expected/summary/libdns_sd-devel.html   |    6 +-
 .../htdocs.expected/summary/libdns_sd1.html        |    6 +-
 .../htdocs.expected/summary/mDNSResponder.html     |    8 +-
 test/testdata/htdocs.expected/summary/obs-a.html   |   10 ++--
 test/testdata/htdocs.expected/summary/obs-b.html   |   10 ++--
 test/testdata/htdocs.expected/summary/openssh.html |    8 +-
 .../summary/per-version-replacement-hint-only.html |    8 +-
 .../htdocs.expected/summary/per-version.html       |   12 ++--
 .../htdocs.expected/summary/perl-Net-SMTP-SSL.html |   10 ++--
 test/testdata/htdocs.expected/summary/rpm-doc.html |   10 +--
 .../htdocs.expected/summary/staleversion.html      |   28 ++++----
 test/testdata/htdocs.expected/summary/test-c.html  |   10 ++--
 test/testdata/htdocs.expected/summary/test-d.html  |   10 ++--
 test/testdata/htdocs.expected/summary/test-e.html  |   10 ++--
 .../htdocs.expected/summary/testpackage.html       |    4 +-
 31 files changed, 221 insertions(+), 177 deletions(-)

diff --git a/calm/calm.py b/calm/calm.py
index 0ff63ec..28e15e3 100755
--- a/calm/calm.py
+++ b/calm/calm.py
@@ -75,6 +75,7 @@ from . import pkg2html
 from . import queue
 from . import setup_exe
 from . import uploads
+from . import utils
 
 
 #
@@ -619,10 +620,7 @@ def mail_logs(enabled, toaddrs, subject, thresholdLevel, retainLevel=None):
 
 def logging_setup(args):
     # set up logging to a file
-    try:
-        os.makedirs(args.logdir, exist_ok=True)
-    except FileExistsError:
-        pass
+    utils.makedirs(args.logdir)
     rfh = logging.handlers.TimedRotatingFileHandler(os.path.join(args.logdir, 'calm.log'), backupCount=48, when='midnight')
     rfh.setFormatter(logging.Formatter('%(asctime)s - %(levelname)-8s - %(message)s'))
     rfh.setLevel(logging.DEBUG)
diff --git a/calm/dedupsrc.py b/calm/dedupsrc.py
index d8a8e84..4bf48ea 100644
--- a/calm/dedupsrc.py
+++ b/calm/dedupsrc.py
@@ -35,6 +35,7 @@ import sys
 
 from . import common_constants
 from . import hint
+from . import utils
 
 binary_only_hints = ['requires', 'depends', 'obsoletes', 'external-source']
 
@@ -142,10 +143,7 @@ def dedup(archive, relarea):
         return 1
 
     # ensure target directory exists
-    try:
-        os.makedirs(os.path.join(relarea, 'src', path, p + '-src'))
-    except FileExistsError:
-        pass
+    utils.makedirs(os.path.join(relarea, 'src', path, p + '-src'))
 
     # write .hint file for new -src package
     src_hints = copy.copy(hints['x86'])
diff --git a/calm/hint.py b/calm/hint.py
index c340b94..5b050a7 100755
--- a/calm/hint.py
+++ b/calm/hint.py
@@ -276,10 +276,12 @@ def hint_file_parse(fn, kind):
                 else:
                     errors.append("unknown construct '%s' at line %d" % (item, i))
 
-            # for the pvr kind, if 'skip' isn't present, 'category' and
-            # 'sdesc' must be
+            if ('skip' in hints) and (len(hints) == 1):
+                errors.append("hint only contains skip: key, please update to cygport >= 0.22.0")
+
+            # for the pvr kind, 'category' and 'sdesc' must be present
             # XXX: genini also requires 'requires' but that seems wrong
-            if 'skip' not in hints and kind == pvr:
+            if kind == pvr:
                 mandatory = ['category', 'sdesc']
                 for k in mandatory:
                     if k not in hints:
diff --git a/calm/movelist.py b/calm/movelist.py
index 8fb682a..bf6268e 100644
--- a/calm/movelist.py
+++ b/calm/movelist.py
@@ -25,6 +25,7 @@ import logging
 import os
 
 from collections import defaultdict
+from . import utils
 
 
 #
@@ -54,10 +55,7 @@ class MoveList(object):
         for p in sorted(self.movelist):
             logging.debug("mkdir %s" % os.path.join(todir, p))
             if not args.dryrun:
-                try:
-                    os.makedirs(os.path.join(todir, p), exist_ok=True)
-                except FileExistsError:
-                    pass
+                utils.makedirs(os.path.join(todir, p))
             logging.debug("move from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
             for f in sorted(self.movelist[p]):
                 if os.path.exists(os.path.join(fromdir, p, f)):
@@ -98,10 +96,7 @@ class MoveList(object):
         for p in sorted(self.movelist):
             logging.debug("mkdir %s" % os.path.join(todir, p))
             if not args.dryrun:
-                try:
-                    os.makedirs(os.path.join(todir, p), exist_ok=True)
-                except FileExistsError:
-                    pass
+                utils.makedirs(os.path.join(todir, p))
             logging.debug("copy from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
             for f in sorted(self.movelist[p]):
                 if os.path.exists(os.path.join(fromdir, p, f)):
diff --git a/calm/package.py b/calm/package.py
index 7e7bb6a..008d01c 100755
--- a/calm/package.py
+++ b/calm/package.py
@@ -448,7 +448,7 @@ def validate_packages(args, packages):
                         # disable-check option says that's ok)
                         if r not in packages:
                             if okmissing not in getattr(args, 'disable_check', []):
-                                logging.error("package '%s' version '%s' %s nonexistent package '%s'" % (p, v, c, r))
+                                logging.error("package '%s' version '%s' %s nonexistent or errored package '%s'" % (p, v, c, r))
                                 error = True
                             continue
 
@@ -461,7 +461,7 @@ def validate_packages(args, packages):
             if 'external-source' in hints:
                 e = hints['external-source']
                 if e not in packages:
-                    logging.error("package '%s' version '%s' refers to nonexistent external-source '%s'" % (p, v, e))
+                    logging.error("package '%s' version '%s' refers to nonexistent or errored external-source '%s'" % (p, v, e))
                     error = True
 
         packages[p].vermap = defaultdict(defaultdict)
@@ -807,15 +807,20 @@ def validate_package_maintainers(args, packages):
 
     # validate that all packages are in the package list
     for p in sorted(packages):
-        # ignore skip packages
-        if packages[p].skip:
-            continue
         # ignore obsolete packages
         if any(['_obsolete' in packages[p].version_hints[vr].get('category', '') for vr in packages[p].version_hints]):
             continue
+        # validate that the package is in a path which starts with something in the package list
         if not is_in_package_list(packages[p].pkgpath, all_packages):
-            logging.error("package '%s' is not in the package list" % (p))
+            logging.error("package '%s' on path '%s', which doesn't start with a package in the package list" % (p, packages[p].pkgpath))
             error = True
+        # validate that the source package has a maintainer
+        bv = packages[p].best_version
+        es = packages[p].version_hints[bv].get('external-source', p)
+        if es not in all_packages and p not in all_packages:
+            if bv not in past_mistakes.maint_anomalies.get(p, []):
+                logging.error("package '%s' is not obsolete, but has no maintainer" % (p))
+                error = True
 
     return error
 
@@ -1051,7 +1056,7 @@ def write_repo_json(args, packages, f):
         d = {
             'name': pn,
             'versions': versions,
-            'summary': po.version_hints[bv].get('sdesc', '').strip('"'),
+            'summary': po.version_hints[bv]['sdesc'].strip('"'),
             'subpackages': [{'name': sp, 'categories': package(sp).version_hints[package(sp).best_version].get('category', '').split()} for sp in po.is_used_by],
             'arches': arches,
         }
diff --git a/calm/past_mistakes.py b/calm/past_mistakes.py
index 9a04f3d..31bcb0d 100644
--- a/calm/past_mistakes.py
+++ b/calm/past_mistakes.py
@@ -169,3 +169,14 @@ mtime_anomalies = [
     'subversion-ruby',
     'subversion-tools',
 ]
+
+# packages with maintainer anomalies
+maint_anomalies = {
+    'libelf0': ['0.8.13-2'],  # libelf is called libelf0 in x86 arch
+    'libelf0-devel': ['0.8.13-2'],
+    'ksnapshot-debuginfo': ['15.04.3-1'],  # should be obsoleted by spectacle(-debuginfo)
+    'man-debuginfo': ['1.6g-2'],  # should be obsoleted by man-db(-debuginfo)
+    'procps-debuginfo': ['3.2.8-5'],  # should be obsoleted by procps-ng(-debuginfo)
+    'python-debuginfo': ['2.7.12-1'],  # should be obsoleted by python2(-debuginfo)
+    'transfig-debuginfo': ['3.2.5e-2'],  # should be obsoleted by xfig(-debuginfo)
+}
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index a74f913..e5c3c06 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -44,8 +44,10 @@ import glob
 import html
 import itertools
 import logging
+import math
 import os
 import re
+import string
 import sys
 import tarfile
 import textwrap
@@ -61,46 +63,39 @@ from . import utils
 #
 # get sdesc for a package
 #
-# some source-only packages don't have an sdesc, since they consist of just
-# 'skip':', in which case we try to make a reasonable one
-#
-
 def sdesc(packages, p, bv):
-    if 'sdesc' in packages[p].version_hints[bv]:
-        header = packages[p].version_hints[bv]['sdesc']
-    else:
-        header = p
-
-    return header.strip('"')
+    header = packages[p].version_hints[bv]['sdesc']
+    header = header.strip('"')
+    return html.escape(header, quote=False)
 
 
+#
 # 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 sdesc(packages, p, bv)
 
     header = header.strip('"')
+    # escape html entities
+    header = html.escape(header, quote=False)
     header = header.replace('\n\n', '\n<br>\n')
     # try to recognize things which look like bullet points
     header = re.sub(r'\n(\s*[*-]\s)', r'<br>\n\1', header)
+    # linkify things which look like hyperlinks
+    header = re.sub(r'http(s|)://[^\s\)]*', r'<a href="\g<0>">\g<0></a>', header)
 
     return header
 
 
+#
 # 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 ensure_dir_exists(args, path):
     if not args.dryrun:
-        try:
-            os.makedirs(path, exist_ok=True)
-        except FileExistsError:
-            pass
+        utils.makedirs(path)
         os.chmod(path, 0o755)
 
 
@@ -177,8 +172,8 @@ def update_package_listings(args, packages):
                     <!--#include virtual="/top.html" -->
                     <h1>Package: %s</h1>''' % (title, p)), file=f)
 
-                    print('<span class="detail">summary</span>: %s<br><br>' % html.escape(sdesc(arch_packages, p, bv), quote=False), file=f)
-                    print('<span class="detail">description</span>: %s<br><br>' % html.escape(ldesc(arch_packages, p, bv), quote=False), file=f)
+                    print('<span class="detail">summary</span>: %s<br><br>' % sdesc(arch_packages, p, bv), file=f)
+                    print('<span class="detail">description</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']:
@@ -197,11 +192,13 @@ def update_package_listings(args, packages):
                         m = 'ORPHANED'
                     else:
                         m = ', '.join(sorted(pkg_maintainers[es]))
-                    print('<span class="detail">maintainer(s)</span>: %s ' % m, 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)
+
+                    if m:
+                        print('<span class="detail">maintainer(s)</span>: %s ' % m, file=f)
+                        print(textwrap.dedent('''\
+                        <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>'''), file=f)
+                        print('<br><br>', file=f)
 
                     print('<ul>', file=f)
                     for arch in sorted(packages):
@@ -216,7 +213,7 @@ def update_package_listings(args, packages):
                                 if category not in p.vermap[v]:
                                     return
                                 t = p.vermap[v][category]
-                                size = round(p.tar(v, category).size / 1024)
+                                size = int(math.ceil(p.tar(v, category).size / 1024))
                                 name = v if category == 'install' else v + ' (source)'
                                 target = "%s-%s" % (pn, v) + ('' if category == 'install' else '-src')
                                 test = 'test' if 'test' in p.version_hints[v] else 'stable'
@@ -247,10 +244,22 @@ def update_package_listings(args, packages):
     logging.debug('writing %s' % packages_inc)
     if not args.dryrun:
         with open(packages_inc, 'w') as index:
-            os.fchmod(index.fileno(), 0o755)
+            os.fchmod(index.fileno(), 0o644)
+
+            jumplist = set()
+            for p in package_list:
+                c = p[0].lower()
+                if c in string.ascii_lowercase:
+                    jumplist.add(c)
+
+            print('<p class="center">', file=index)
+            print(' - \n'.join(['<a href="#%s">%s</a>' % (c, c) for c in sorted(jumplist)]), file=index)
+            print('</p>', file=index)
+
             print('<table class="pkglist">', file=index)
 
             first = ' class="pkgname"'
+            jump = ''
             for p in sorted(package_list, key=package.sort_key):
                 if p.endswith('-debuginfo'):
                     continue
@@ -267,8 +276,14 @@ def update_package_listings(args, packages):
                 bv = arch_packages[p].best_version
                 header = sdesc(arch_packages, p, bv)
 
-                print('<tr><td%s><a href="summary/%s.html">%s</a></td><td>%s</td></tr>' %
-                      (first, p, p, html.escape(header, quote=False)),
+                anchor = ''
+                if jump != p[0].lower():
+                    jump = p[0].lower()
+                    if jump in jumplist:
+                        anchor = ' id="%s"' % (jump)
+
+                print('<tr%s><td%s><a href="summary/%s.html">%s</a></td><td>%s</td></tr>' %
+                      (anchor, first, p, p, header),
                       file=index)
                 first = ''
 
@@ -360,8 +375,6 @@ def write_arch_listing(args, packages, arch):
                         if fver.endswith('-src'):
                             header = header + " (source code)"
 
-                        header = html.escape(header, quote=False)
-
                         print(textwrap.dedent('''\
                                                  <!DOCTYPE html>
                                                  <html>
diff --git a/calm/utils.py b/calm/utils.py
index 7c33ac7..d6d6e1c 100644
--- a/calm/utils.py
+++ b/calm/utils.py
@@ -38,3 +38,16 @@ def touch(fn, times=None):
             os.utime(fn, times)
     except PermissionError:
         logging.error("couldn't update mtime for %s" % (fn))
+
+
+#
+# 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 makedirs(name):
+    try:
+        os.makedirs(name, exist_ok=True)
+    except FileExistsError:
+        pass
diff --git a/test/testdata/htdocs.expected/packages.inc b/test/testdata/htdocs.expected/packages.inc
index 0ed68aa..25a317f 100755
--- a/test/testdata/htdocs.expected/packages.inc
+++ b/test/testdata/htdocs.expected/packages.inc
@@ -1,22 +1,35 @@
+<p class="center">
+<a href="#a">a</a> - 
+<a href="#b">b</a> - 
+<a href="#c">c</a> - 
+<a href="#k">k</a> - 
+<a href="#l">l</a> - 
+<a href="#m">m</a> - 
+<a href="#o">o</a> - 
+<a href="#p">p</a> - 
+<a href="#r">r</a> - 
+<a href="#s">s</a> - 
+<a href="#t">t</a>
+</p>
 <table class="pkglist">
-<tr><td class="pkgname"><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 id="a"><td class="pkgname"><a href="summary/arc.html">arc</a></td><td>The ARC archive utility</td></tr>
+<tr id="b"><td><a href="summary/base-cygwin.html">base-cygwin</a></td><td>Initial base installation helper script</td></tr>
+<tr id="c"><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-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 id="k"><td><a href="summary/keychain.html">keychain</a></td><td>Key manager for OpenSSH</td></tr>
+<tr id="l"><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 id="m"><td><a href="summary/mDNSResponder.html">mDNSResponder</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr id="o"><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 id="p"><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 id="r"><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 id="s"><td><a href="summary/staleversion.html">staleversion</a></td><td>Test package for stale version removal</td></tr>
+<tr id="t"><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>
diff --git a/test/testdata/htdocs.expected/summary/arc.html b/test/testdata/htdocs.expected/summary/arc.html
index 2d988b8..009b8f5 100644
--- a/test/testdata/htdocs.expected/summary/arc.html
+++ b/test/testdata/htdocs.expected/summary/arc.html
@@ -20,8 +20,8 @@ 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
diff --git a/test/testdata/htdocs.expected/summary/base-cygwin.html b/test/testdata/htdocs.expected/summary/base-cygwin.html
index a0d814d..0ce7e9e 100644
--- a/test/testdata/htdocs.expected/summary/base-cygwin.html
+++ b/test/testdata/htdocs.expected/summary/base-cygwin.html
@@ -15,15 +15,15 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>3.6-1</td><td class="right">1 kB</td><td>[<a href="../x86/base-cygwin/base-cygwin-3.6-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>3.8-1</td><td class="right">1 kB</td><td>[<a href="../x86/base-cygwin/base-cygwin-3.8-1">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/corrupt.html b/test/testdata/htdocs.expected/summary/corrupt.html
index 0b91c3a..d7016dc 100644
--- a/test/testdata/htdocs.expected/summary/corrupt.html
+++ b/test/testdata/htdocs.expected/summary/corrupt.html
@@ -15,14 +15,14 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</td></tr>
+<tr><td>2.0.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/corrupt/corrupt-2.0.0-1">list of files</a>]</td><td>stable</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><td>stable</td></tr>
 </table><br>
 </ul>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
index bf4d895..0d613d6 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
@@ -17,16 +17,16 @@ cygwin package with gdb.<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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</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><td>test</td></tr>
+<tr><td>2.2.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.2.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.3.0-0.3</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3">list of files</a>]</td><td>test</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-devel.html b/test/testdata/htdocs.expected/summary/cygwin-devel.html
index 1a443b8..2435a15 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-devel.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-devel.html
@@ -15,16 +15,16 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</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><td>test</td></tr>
+<tr><td>2.2.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin-devel/cygwin-devel-2.2.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.2.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin-devel/cygwin-devel-2.2.1-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.3.0-0.3</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin-devel/cygwin-devel-2.3.0-0.3">list of files</a>]</td><td>test</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/cygwin.html b/test/testdata/htdocs.expected/summary/cygwin.html
index b77856b..c7c16de 100644
--- a/test/testdata/htdocs.expected/summary/cygwin.html
+++ b/test/testdata/htdocs.expected/summary/cygwin.html
@@ -16,19 +16,19 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>test</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><td>test</td></tr>
+<tr><td>2.2.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.2.0-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.0-1-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.2.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.1-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.2.1-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin/cygwin-2.2.1-1-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.3.0-0.3</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin/cygwin-2.3.0-0.3">list of files</a>]</td><td>test</td></tr>
+<tr><td>2.3.0-0.3 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/cygwin/cygwin-2.3.0-0.3-src">list of files</a>]</td><td>test</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/keychain.html b/test/testdata/htdocs.expected/summary/keychain.html
index 392083b..96f30f7 100644
--- a/test/testdata/htdocs.expected/summary/keychain.html
+++ b/test/testdata/htdocs.expected/summary/keychain.html
@@ -24,16 +24,16 @@ necessary<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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</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><td>stable</td></tr>
+<tr><td>2.6.8-1 (source)</td><td class="right">36 kB</td><td>[<a href="../x86/keychain/keychain-2.6.8-1-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>2.7.1-1</td><td class="right">32 kB</td><td>[<a href="../x86/keychain/keychain-2.7.1-1">list of files</a>]</td><td>stable</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><td>stable</td></tr>
 </table><br>
 </ul>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
index efa7fef..e28d111 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
@@ -18,14 +18,14 @@ industry standard IP protocols.<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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</td></tr>
+<tr><td>379.32.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd1.html b/test/testdata/htdocs.expected/summary/libdns_sd1.html
index 1b1e201..8fe51cd 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd1.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd1.html
@@ -17,14 +17,14 @@ 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</td></tr>
+<tr><td>379.32.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/libdns_sd1/libdns_sd1-379.32.1-1">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder.html b/test/testdata/htdocs.expected/summary/mDNSResponder.html
index 94788d1..eac93f9 100644
--- a/test/testdata/htdocs.expected/summary/mDNSResponder.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder.html
@@ -18,15 +18,15 @@ industry standard IP protocols.<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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>379.32.1-1</td><td class="right">1 kB</td><td>[<a href="../x86/mDNSResponder/mDNSResponder-379.32.1-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>379.32.1-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/mDNSResponder/mDNSResponder-379.32.1-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/obs-a.html b/test/testdata/htdocs.expected/summary/obs-a.html
index 0d32039..b3f5ac7 100644
--- a/test/testdata/htdocs.expected/summary/obs-a.html
+++ b/test/testdata/htdocs.expected/summary/obs-a.html
@@ -11,19 +11,19 @@
 <!--#include virtual="/top.html" -->
 <h1>Package: obs-a</h1>
 <span class="detail">summary</span>: obsolete package A<br><br>
-<span class="detail">description</span>: obs-a<br><br>
+<span class="detail">description</span>: obsolete package 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>1.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/obs-a/obs-a-1.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/obs-a/obs-a-1.0-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/obs-b.html b/test/testdata/htdocs.expected/summary/obs-b.html
index 3062af6..436fa94 100644
--- a/test/testdata/htdocs.expected/summary/obs-b.html
+++ b/test/testdata/htdocs.expected/summary/obs-b.html
@@ -11,19 +11,19 @@
 <!--#include virtual="/top.html" -->
 <h1>Package: obs-b</h1>
 <span class="detail">summary</span>: obsolete package B<br><br>
-<span class="detail">description</span>: obs-b<br><br>
+<span class="detail">description</span>: obsolete package 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>1.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/obs-b/obs-b-1.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/obs-b/obs-b-1.0-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/openssh.html b/test/testdata/htdocs.expected/summary/openssh.html
index a8a92be..a2f3b78 100644
--- a/test/testdata/htdocs.expected/summary/openssh.html
+++ b/test/testdata/htdocs.expected/summary/openssh.html
@@ -17,15 +17,15 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>7.2p2-1</td><td class="right">1 kB</td><td>[<a href="../x86/openssh/openssh-7.2p2-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>7.2p2-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/openssh/openssh-7.2p2-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
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 277fd3b..8ab2a7f 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,15 +16,15 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>1.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/per-version-replacement-hint-only/per-version-replacement-hint-only-1.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">1 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><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/per-version.html b/test/testdata/htdocs.expected/summary/per-version.html
index fe82cee..3fef454 100644
--- a/test/testdata/htdocs.expected/summary/per-version.html
+++ b/test/testdata/htdocs.expected/summary/per-version.html
@@ -16,17 +16,17 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</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><td>stable</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><td>stable</td></tr>
+<tr><td>4.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/per-version/per-version-4.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>4.0-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/per-version/per-version-4.0-1-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>4.8-1</td><td class="right">1 kB</td><td>[<a href="../x86/per-version/per-version-4.8-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>4.8-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/per-version/per-version-4.8-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
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 700037e..68f5b81 100644
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
@@ -16,18 +16,18 @@ 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</th></tr>
-<tr><td>1.01-1</td><td class="right">3 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.01-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.01-1</td><td class="right">4 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.01-1">list of files</a>]</td><td>stable</td></tr>
 <tr><td>1.01-1 (source)</td><td class="right">3 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.01-1-src">list of files</a>]</td><td>stable</td></tr>
-<tr><td>1.02-1</td><td class="right">3 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.02-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.02-1</td><td class="right">4 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.02-1">list of files</a>]</td><td>stable</td></tr>
 <tr><td>1.02-1 (source)</td><td class="right">3 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.02-1-src">list of files</a>]</td><td>stable</td></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><td>stable</td></tr>
+<tr><td>1.03-1</td><td class="right">4 kB</td><td>[<a href="../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1">list of files</a>]</td><td>stable</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><td>stable</td></tr>
 </table><br>
 </ul>
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc.html b/test/testdata/htdocs.expected/summary/rpm-doc.html
index d7c844f..f56be56 100644
--- a/test/testdata/htdocs.expected/summary/rpm-doc.html
+++ b/test/testdata/htdocs.expected/summary/rpm-doc.html
@@ -11,20 +11,16 @@
 <!--#include virtual="/top.html" -->
 <h1>Package: rpm-doc</h1>
 <span class="detail">summary</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<br><br>
-<span class="detail">description</span>: rpm-doc<br><br>
+<span class="detail">description</span>: Obsolete package for RPM package management system manual pages (extra text to so repr is not one line)<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><th>Status</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><td>stable</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><td>stable</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><td>stable</td></tr>
+<tr><td>4.1-2 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/rpm-doc/rpm-doc-4.1-2-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>999-1</td><td class="right">1 kB</td><td>[<a href="../x86/rpm-doc/rpm-doc-999-1">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/staleversion.html b/test/testdata/htdocs.expected/summary/staleversion.html
index a283f53..0f59ea2 100644
--- a/test/testdata/htdocs.expected/summary/staleversion.html
+++ b/test/testdata/htdocs.expected/summary/staleversion.html
@@ -15,25 +15,25 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>stable</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><td>test</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><td>test</td></tr>
+<tr><td>240-1</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-240-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>240-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-240-1-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>242-0</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-242-0">list of files</a>]</td><td>stable</td></tr>
+<tr><td>242-0 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-242-0-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>243-0</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-243-0">list of files</a>]</td><td>stable</td></tr>
+<tr><td>243-0 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-243-0-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>250-0</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-250-0">list of files</a>]</td><td>stable</td></tr>
+<tr><td>250-0 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-250-0-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>251-0</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-251-0">list of files</a>]</td><td>stable</td></tr>
+<tr><td>251-0 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-251-0-src">list of files</a>]</td><td>stable</td></tr>
+<tr><td>260-0</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-260-0">list of files</a>]</td><td>test</td></tr>
+<tr><td>260-0 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/staleversion/staleversion-260-0-src">list of files</a>]</td><td>test</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/test-c.html b/test/testdata/htdocs.expected/summary/test-c.html
index c506b97..188f4b0 100644
--- a/test/testdata/htdocs.expected/summary/test-c.html
+++ b/test/testdata/htdocs.expected/summary/test-c.html
@@ -11,21 +11,21 @@
 <!--#include virtual="/top.html" -->
 <h1>Package: test-c</h1>
 <span class="detail">summary</span>: test package C<br><br>
-<span class="detail">description</span>: test-c<br><br>
+<span class="detail">description</span>: test package 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>1.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/test-c/test-c-1.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/test-c/test-c-1.0-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/test-d.html b/test/testdata/htdocs.expected/summary/test-d.html
index fc139bf..ba3ee0e 100644
--- a/test/testdata/htdocs.expected/summary/test-d.html
+++ b/test/testdata/htdocs.expected/summary/test-d.html
@@ -11,19 +11,19 @@
 <!--#include virtual="/top.html" -->
 <h1>Package: test-d</h1>
 <span class="detail">summary</span>: test package D<br><br>
-<span class="detail">description</span>: test-d<br><br>
+<span class="detail">description</span>: test package 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>1.0.42590-1</td><td class="right">1 kB</td><td>[<a href="../x86/test-d/test-d-1.0.42590-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.0.42590-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/test-d/test-d-1.0.42590-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/test-e.html b/test/testdata/htdocs.expected/summary/test-e.html
index b97a9ba..1360f7d 100644
--- a/test/testdata/htdocs.expected/summary/test-e.html
+++ b/test/testdata/htdocs.expected/summary/test-e.html
@@ -11,20 +11,20 @@
 <!--#include virtual="/top.html" -->
 <h1>Package: test-e</h1>
 <span class="detail">summary</span>: test package E<br><br>
-<span class="detail">description</span>: test-e<br><br>
+<span class="detail">description</span>: test package 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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
 <table class="pkgtable">
 <tr><th>Version</th><th>Package Size</th><th>Files</th><th>Status</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><td>stable</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><td>stable</td></tr>
+<tr><td>1.0-1</td><td class="right">1 kB</td><td>[<a href="../x86/test-e/test-e-1.0-1">list of files</a>]</td><td>stable</td></tr>
+<tr><td>1.0-1 (source)</td><td class="right">1 kB</td><td>[<a href="../x86/test-e/test-e-1.0-1-src">list of files</a>]</td><td>stable</td></tr>
 </table><br>
 </ul>
 </div>
diff --git a/test/testdata/htdocs.expected/summary/testpackage.html b/test/testdata/htdocs.expected/summary/testpackage.html
index ca5706e..6f6daff 100644
--- a/test/testdata/htdocs.expected/summary/testpackage.html
+++ b/test/testdata/htdocs.expected/summary/testpackage.html
@@ -15,8 +15,8 @@
 <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>
+<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>
 <br><br>
 <ul>
 <li><span class="detail">x86</span></li>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.