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

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=0c3affa71ccf8965269f2c4eaab54f7aa189ddb1

commit 0c3affa71ccf8965269f2c4eaab54f7aa189ddb1
Author: Jon Turney <[email protected]>
Date:   Tue Jun 11 11:39:45 2019 +0100

    Touch packages_list.html when packages.inc is updated
    
    Touch packages_list.html when packages.inc is updated, for the benefit
    of 'XBitHack full'
    
    Factor out touch utility function

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

commit dd2acec3d8d881e9560f3f07455f138a140248b8
Author: Jon Turney <[email protected]>
Date:   Tue Jun 11 10:21:13 2019 +0100

    Use summary/description rather than sdesc/ldesc in package summary page
    
    Also HTML escape those texts

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

commit 05fd42a2837950e66d744caf10e076311db6dd49
Author: Jon Turney <[email protected]>
Date:   Sun Jun 9 19:27:10 2019 +0100

    Add a tool for fixing skip: only hints
    
    These used to be generated by cygport for source-only packages. Try to
    fill these in with information from associated packages.

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

commit 4ec26afb45ce0f1fb2335e11c579df1f32ac3a56
Author: Jon Turney <[email protected]>
Date:   Sun Jun 9 16:07:43 2019 +0100

    Give first package name in pkglist the 'pkgname' style
    
    This can be used to give that column a fixed width in the CSS, rather
    than waiting until the entire page has loaded before it's finalized.


Diff:
---
 calm/fix-skip-only-hint.py                         |  225 ++++++++++++++++++++
 calm/maintainers.py                                |   11 +-
 calm/pkg2html.py                                   |   23 ++-
 calm/utils.py                                      |   36 +++
 test/testdata/htdocs.expected/packages.inc         |    3 +-
 test/testdata/htdocs.expected/summary/arc.html     |    4 +-
 .../htdocs.expected/summary/base-cygwin.html       |    4 +-
 test/testdata/htdocs.expected/summary/corrupt.html |    4 +-
 .../htdocs.expected/summary/cygwin-debuginfo.html  |    4 +-
 .../htdocs.expected/summary/cygwin-devel.html      |    4 +-
 test/testdata/htdocs.expected/summary/cygwin.html  |    4 +-
 .../testdata/htdocs.expected/summary/keychain.html |    4 +-
 .../htdocs.expected/summary/libdns_sd-devel.html   |    4 +-
 .../htdocs.expected/summary/libdns_sd1.html        |    4 +-
 .../htdocs.expected/summary/mDNSResponder.html     |    4 +-
 test/testdata/htdocs.expected/summary/obs-a.html   |    4 +-
 test/testdata/htdocs.expected/summary/obs-b.html   |    4 +-
 test/testdata/htdocs.expected/summary/openssh.html |    4 +-
 .../summary/per-version-replacement-hint-only.html |    4 +-
 .../htdocs.expected/summary/per-version.html       |    4 +-
 .../htdocs.expected/summary/perl-Net-SMTP-SSL.html |    4 +-
 test/testdata/htdocs.expected/summary/rpm-doc.html |    4 +-
 .../htdocs.expected/summary/staleversion.html      |    4 +-
 test/testdata/htdocs.expected/summary/test-c.html  |    4 +-
 test/testdata/htdocs.expected/summary/test-d.html  |    4 +-
 test/testdata/htdocs.expected/summary/test-e.html  |    4 +-
 .../htdocs.expected/summary/testpackage.html       |    4 +-
 27 files changed, 323 insertions(+), 63 deletions(-)

diff --git a/calm/fix-skip-only-hint.py b/calm/fix-skip-only-hint.py
new file mode 100644
index 0000000..9f3c49c
--- /dev/null
+++ b/calm/fix-skip-only-hint.py
@@ -0,0 +1,225 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019 Jon Turney
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+#
+# Fix hints for (probably source) packages consisting of just 'skip:'
+#
+# (cygport stopped generating these since 0.23.0)
+#
+
+import argparse
+import os
+import re
+import sys
+
+from . import common_constants
+from . import hint
+from .version import SetupVersion
+
+
+#
+# write a hint file
+#
+def hint_file_write(fn, hints):
+    with open(fn, 'w') as f:
+        for k, v in hints.items():
+            print("%s: %s" % (k, v), file=f)
+
+
+#
+# pick most popular item from a list
+#
+def pick(l):
+    if not l:
+        return None
+
+    h = {}
+
+    for i in l:
+        h[i] = h.get(i, 0) + 1
+
+    for i in sorted(h, key=h.get, reverse=True):
+        print('%4d: %s' % (h[i], i))
+
+    i = sorted(h, key=h.get, reverse=True)[0]
+    # unanimous ?
+    if h[i] == len(l):
+        return i
+
+    return None
+
+
+#
+# try to invent plausible information by looking at subpackages
+#
+def invent_from_subpackages(path, vr):
+    sdesc_candidates = []
+    category_candidates = []
+
+    for (dirpath, subdirs, files) in os.walk(path):
+        # debuginfo packages never have a good information
+        if 'debuginfo' in dirpath:
+            continue
+
+        # consider sub-package hints
+        for f in files:
+            if re.match('^.*-' + re.escape(vr) + '.hint$', f):
+                hints = hint.hint_file_parse(os.path.join(dirpath, f), hint.pvr)
+                if 'sdesc' in hints:
+                    # ... which doesn't contain 'Obsolete' etc.
+                    if 'Obsolete' in hints['sdesc'] or '_obsolete' in hints['category']:
+                        continue
+
+                    # remove anything inside parentheses, or a single word after
+                    # a hyphen, at the end of quoted sdesc
+                    sdesc = hints['sdesc']
+                    sdesc = re.sub(r'"(.*)"', r'\1', sdesc)
+                    sdesc = re.sub(r'(\(.*?\))$', '', sdesc)
+                    sdesc = re.sub(r' - \w*$', '', sdesc)
+                    sdesc = sdesc.strip()
+                    sdesc = '"' + sdesc + '"'
+
+                    sdesc_candidates.append(sdesc)
+
+                    # ignore 'Doc' category (on the basis that this usually a
+                    # documentation subpackage)
+                    if hints['category'] != 'Doc':
+                        category_candidates.append(hints['category'])
+
+    # Ignore a single tool/utility subpackage
+    for t in ['utility', 'utilities', 'tool']:
+        occurences = [c for c in sdesc_candidates if re.search(r'\b' + t + '\b', c.lower())]
+        if len(occurences) == 1:
+            sdesc_candidates.remove(occurences[0])
+
+    # pick 'Libs' if that's a possibility
+    category = pick(category_candidates)
+    if not category and 'Libs' in category_candidates:
+        category = 'Libs'
+
+    return (pick(sdesc_candidates), category)
+
+
+#
+# try to invent plausible information by looking at more recent versions
+#
+def invent_from_other_versions(path, later_vrs):
+    sdesc_candidates = []
+    category_candidates = []
+
+    pn = path.split(os.path.sep)[-1]
+    for vr in later_vrs:
+        f = pn + '-' + vr + '.hint'
+        hints = hint.hint_file_parse(os.path.join(path, f), hint.pvr)
+
+        if 'sdesc' in hints:
+            sdesc_candidates.append(hints['sdesc'])
+        if 'category' in hints:
+            category_candidates.append(hints['category'])
+
+    return (pick(sdesc_candidates), pick(category_candidates))
+
+
+#
+#
+#
+def fix_one_hint(dirpath, hintfile, vr, later_vrs):
+    hints = hint.hint_file_parse(os.path.join(dirpath, hintfile), hint.pvr)
+
+    hints.pop('parse-errors', None)
+    hints.pop('parse-warnings', None)
+
+    if ('skip' not in hints) or (len(hints) > 1):
+        return (0, 0)
+
+    # if hint only contains skip:, try to come up with plausible sdesc and category
+    (sdesc, category) = invent_from_subpackages(dirpath, vr)
+    if not (sdesc and category):
+        (sdesc, category) = invent_from_other_versions(dirpath, later_vrs)
+    if not (sdesc and category):
+        print('couldn\'t invent hints for %s' % (hintfile))
+        return (1, 0)
+
+    hints['sdesc'] = sdesc
+    hints['category'] = category
+
+    if 'source' not in hints['sdesc']:
+        sdesc = re.sub(r'"(.*)"', r'\1', hints['sdesc'])
+        sdesc += ' (source)'
+        hints['sdesc'] = '"' + sdesc + '"'
+
+    print('writing invented hints for %s' % (hintfile))
+    hint_file_write(os.path.join(dirpath, hintfile), hints)
+
+    return (1, 1)
+
+
+def fix_hints(rel_area, mode):
+    skip_only = 0
+    invented = 0
+
+    for (dirpath, subdirs, files) in os.walk(rel_area):
+        vrs = {}
+        for f in files:
+            match = re.match(r'^.*?-(\d.*).hint$', f)
+            if match:
+                vrs[match.group(1)] = f
+
+        if vrs:
+            if mode == 'newest':
+                v = sorted(vrs, key=lambda v: SetupVersion(v), reverse=True)[0]
+                f = vrs[v]
+                vrs = {v: f}
+
+            sorted_vrs = sorted(vrs, key=lambda v: SetupVersion(v))
+            while sorted_vrs:
+                vr = sorted_vrs.pop(0)
+                (s, i) = fix_one_hint(dirpath, vrs[vr], vr, sorted_vrs)
+                skip_only += s
+                invented += i
+
+    print('%d skip only hints, invented %d hints' % (skip_only, invented))
+
+
+#
+#
+#
+
+
+def main():
+    relarea_default = common_constants.FTP
+
+    parser = argparse.ArgumentParser(description='skip-only hint fixer')
+    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    parser.add_argument('--mode', action='store', metavar='all|newest', choices=['all', 'newest'], help="fix all hints, or (default) only for newest version", default='newest')
+    (args) = parser.parse_args()
+
+    return fix_hints(args.rel_area, args.mode)
+
+
+#
+#
+#
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/calm/maintainers.py b/calm/maintainers.py
index b9c51fd..7ffc12b 100644
--- a/calm/maintainers.py
+++ b/calm/maintainers.py
@@ -46,14 +46,7 @@ import logging
 import os
 import re
 
-#
-#
-#
-
-
-def touch(fn, times=None):
-    with open(fn, 'a'):
-        os.utime(fn, times)
+from . import utils
 
 #
 #
@@ -94,7 +87,7 @@ class Maintainer(object):
         if self.reminders_issued:
             # if reminders were issued, update the timestamp
             logging.debug("updating reminder time for %s" % self.name)
-            touch(reminder_file)
+            utils.touch(reminder_file)
         elif (not self.reminders_timestamp_checked) and (self.reminder_time != 0):
             # if we didn't need to check the reminder timestamp, it can be
             # reset
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
index 9370092..a74f913 100755
--- a/calm/pkg2html.py
+++ b/calm/pkg2html.py
@@ -55,6 +55,7 @@ from .version import SetupVersion
 from . import common_constants
 from . import maintainers
 from . import package
+from . import utils
 
 
 #
@@ -176,8 +177,8 @@ def update_package_listings(args, packages):
                     <!--#include virtual="/top.html" -->
                     <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">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">categories</span>: %s<br><br>' % arch_packages[p].version_hints[bv].get('category', ''), file=f)
 
                     for key in ['depends', 'obsoletes', 'provides', 'conflicts', 'build-depends']:
@@ -247,9 +248,9 @@ def update_package_listings(args, packages):
     if not args.dryrun:
         with open(packages_inc, 'w') as index:
             os.fchmod(index.fileno(), 0o755)
-            print(textwrap.dedent('''\
-                                     <table class="pkglist">'''), file=index)
+            print('<table class="pkglist">', file=index)
 
+            first = ' class="pkgname"'
             for p in sorted(package_list, key=package.sort_key):
                 if p.endswith('-debuginfo'):
                     continue
@@ -266,11 +267,17 @@ def update_package_listings(args, packages):
                 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('<tr><td%s><a href="summary/%s.html">%s</a></td><td>%s</td></tr>' %
+                      (first, p, p, html.escape(header, quote=False)),
+                      file=index)
+                first = ''
 
-            print(textwrap.dedent('''\
-                                     </table>
-                                     '''), file=index)
+            print('</table>', file=index)
+
+        # touch the including file for the benefit of 'XBitHack full'
+        package_list = os.path.join(args.htdocs, 'package_list.html')
+        if os.path.exists(package_list):
+            utils.touch(package_list)
 
 
 def write_arch_listing(args, packages, arch):
diff --git a/calm/utils.py b/calm/utils.py
new file mode 100644
index 0000000..07e45a0
--- /dev/null
+++ b/calm/utils.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019 Jon Turney
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+
+#
+# utility functions
+#
+
+import os
+
+
+#
+# touch a file
+#
+def touch(fn, times=None):
+    with open(fn, 'a'):
+        os.utime(fn, times)
diff --git a/test/testdata/htdocs.expected/packages.inc b/test/testdata/htdocs.expected/packages.inc
index af1c670..0ed68aa 100755
--- a/test/testdata/htdocs.expected/packages.inc
+++ b/test/testdata/htdocs.expected/packages.inc
@@ -1,5 +1,5 @@
 <table class="pkglist">
-<tr><td><a href="summary/arc.html">arc</a></td><td>The ARC archive utility</td></tr>
+<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><td><a href="summary/cygwin.html">cygwin</a></td><td>The UNIX emulation engine</td></tr>
@@ -21,4 +21,3 @@
 <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
index a848293..2d988b8 100644
--- a/test/testdata/htdocs.expected/summary/arc.html
+++ b/test/testdata/htdocs.expected/summary/arc.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: The ARC archive utility<br><br>
+<span class="detail">description</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
diff --git a/test/testdata/htdocs.expected/summary/base-cygwin.html b/test/testdata/htdocs.expected/summary/base-cygwin.html
index 24b3742..a0d814d 100644
--- a/test/testdata/htdocs.expected/summary/base-cygwin.html
+++ b/test/testdata/htdocs.expected/summary/base-cygwin.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: Initial base installation helper script<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/corrupt.html b/test/testdata/htdocs.expected/summary/corrupt.html
index 4c311c2..0b91c3a 100644
--- a/test/testdata/htdocs.expected/summary/corrupt.html
+++ b/test/testdata/htdocs.expected/summary/corrupt.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: A corrupt package<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
index af5d1e3..bf4d895 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-debuginfo.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: Debug info for cygwin<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/cygwin-devel.html b/test/testdata/htdocs.expected/summary/cygwin-devel.html
index d951336..1a443b8 100644
--- a/test/testdata/htdocs.expected/summary/cygwin-devel.html
+++ b/test/testdata/htdocs.expected/summary/cygwin-devel.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: Core development files<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/cygwin.html b/test/testdata/htdocs.expected/summary/cygwin.html
index cdd427e..b77856b 100644
--- a/test/testdata/htdocs.expected/summary/cygwin.html
+++ b/test/testdata/htdocs.expected/summary/cygwin.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: The UNIX emulation engine<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/keychain.html b/test/testdata/htdocs.expected/summary/keychain.html
index a15fad4..392083b 100644
--- a/test/testdata/htdocs.expected/summary/keychain.html
+++ b/test/testdata/htdocs.expected/summary/keychain.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: Key manager for OpenSSH<br><br>
+<span class="detail">description</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
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
index 1a309c9..efa7fef 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd-devel.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/libdns_sd1.html b/test/testdata/htdocs.expected/summary/libdns_sd1.html
index 40c926f..1b1e201 100644
--- a/test/testdata/htdocs.expected/summary/libdns_sd1.html
+++ b/test/testdata/htdocs.expected/summary/libdns_sd1.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/mDNSResponder.html b/test/testdata/htdocs.expected/summary/mDNSResponder.html
index 49c3740..94788d1 100644
--- a/test/testdata/htdocs.expected/summary/mDNSResponder.html
+++ b/test/testdata/htdocs.expected/summary/mDNSResponder.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: Bonjour Zeroconf implementation<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/obs-a.html b/test/testdata/htdocs.expected/summary/obs-a.html
index e069b83..0d32039 100644
--- a/test/testdata/htdocs.expected/summary/obs-a.html
+++ b/test/testdata/htdocs.expected/summary/obs-a.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: obsolete package A<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/obs-b.html b/test/testdata/htdocs.expected/summary/obs-b.html
index 0e9f2ae..3062af6 100644
--- a/test/testdata/htdocs.expected/summary/obs-b.html
+++ b/test/testdata/htdocs.expected/summary/obs-b.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: obsolete package B<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/openssh.html b/test/testdata/htdocs.expected/summary/openssh.html
index 67bc7e4..a8a92be 100644
--- a/test/testdata/htdocs.expected/summary/openssh.html
+++ b/test/testdata/htdocs.expected/summary/openssh.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: The OpenSSH server and client programs<br><br>
+<span class="detail">description</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>
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 679f572..277fd3b 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
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: Per-version hint test package<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/per-version.html b/test/testdata/htdocs.expected/summary/per-version.html
index 286f867..fe82cee 100644
--- a/test/testdata/htdocs.expected/summary/per-version.html
+++ b/test/testdata/htdocs.expected/summary/per-version.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: Per-version hint test package<br><br>
+<span class="detail">description</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>
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 8270b36..700037e 100644
--- a/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
+++ b/test/testdata/htdocs.expected/summary/perl-Net-SMTP-SSL.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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
+<span class="detail">summary</span>: Perl distribution Net-SMTP-SSL<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/rpm-doc.html b/test/testdata/htdocs.expected/summary/rpm-doc.html
index a20b3d0..d7c844f 100644
--- a/test/testdata/htdocs.expected/summary/rpm-doc.html
+++ b/test/testdata/htdocs.expected/summary/rpm-doc.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">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">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>:  
diff --git a/test/testdata/htdocs.expected/summary/staleversion.html b/test/testdata/htdocs.expected/summary/staleversion.html
index 5f336ff..a283f53 100644
--- a/test/testdata/htdocs.expected/summary/staleversion.html
+++ b/test/testdata/htdocs.expected/summary/staleversion.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: Test package for stale version removal<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/test-c.html b/test/testdata/htdocs.expected/summary/test-c.html
index 18fe254..c506b97 100644
--- a/test/testdata/htdocs.expected/summary/test-c.html
+++ b/test/testdata/htdocs.expected/summary/test-c.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: test package C<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/test-d.html b/test/testdata/htdocs.expected/summary/test-d.html
index 0c6a0e0..fc139bf 100644
--- a/test/testdata/htdocs.expected/summary/test-d.html
+++ b/test/testdata/htdocs.expected/summary/test-d.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: test package D<br><br>
+<span class="detail">description</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 
diff --git a/test/testdata/htdocs.expected/summary/test-e.html b/test/testdata/htdocs.expected/summary/test-e.html
index e7a30fc..b97a9ba 100644
--- a/test/testdata/htdocs.expected/summary/test-e.html
+++ b/test/testdata/htdocs.expected/summary/test-e.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: test package E<br><br>
+<span class="detail">description</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>
diff --git a/test/testdata/htdocs.expected/summary/testpackage.html b/test/testdata/htdocs.expected/summary/testpackage.html
index acc6098..ca5706e 100644
--- a/test/testdata/htdocs.expected/summary/testpackage.html
+++ b/test/testdata/htdocs.expected/summary/testpackage.html
@@ -10,8 +10,8 @@
 <div id="main">
 <!--#include virtual="/top.html" -->
 <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">summary</span>: A test package (stuff &amp; other stuff)<br><br>
+<span class="detail">description</span>: A test package (stuff &amp; 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
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.