This is the mail archive of the cygwin-apps-cvs mailing list for the cygwin-apps project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[calm - Cygwin server-side packaging maintenance script] branch master, updated. 5903247af568efae6112bcba99ead3e0bf5a4a9a




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

commit 5903247af568efae6112bcba99ead3e0bf5a4a9a
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Tue May 10 13:54:50 2016 +0000

    Make packageable
    
    Rearrange file layout for python packaging
    Add setup.py
    Use python3 style relative imports
    Add calm and mksetupini script entry points
    Fix tests to locate testdata in the same directory


Diff:
---
 .travis.yml                                        |    2 +-
 abeyance_handler.py                                |   73 -
 buffering_smtp_handler.py                          |   91 -
 calm                                               |    3 -
 calm.py                                            |  345 ---
 calm.sh                                            |    2 +
 calm/abeyance_handler.py                           |   73 +
 calm/buffering_smtp_handler.py                     |   91 +
 calm/calm.py                                       |  353 +++
 calm/common_constants.py                           |   67 +
 calm/compare-arches                                |  130 +
 calm/fix-missing-cygwin-dep.py                     |  138 ++
 calm/hint.py                                       |  301 +++
 calm/maintainers.py                                |  161 ++
 calm/mkmaintdir                                    |  140 ++
 calm/mksetupini.py                                 |  126 +
 calm/package.py                                    |  681 ++++++
 calm/past_mistakes.py                              |   97 +
 calm/pkg2html.py                                   |  239 ++
 calm/queue.py                                      |   70 +
 calm/setup_exe.py                                  |   73 +
 calm/spelling.py                                   |  134 ++
 calm/uploads.py                                    |  278 +++
 calm/version.py                                    |  130 +
 calm/words.txt                                     |  437 ++++
 common_constants.py                                |   67 -
 compare-arches                                     |  130 -
 fix-missing-cygwin-dep.py                          |  138 --
 hint.py                                            |  301 ---
 maintainers.py                                     |  161 --
 mkmaintdir                                         |  140 --
 mksetupini                                         |  117 -
 package.py                                         |  681 ------
 past_mistakes.py                                   |   97 -
 pep8                                               |    2 +-
 pkg2html.py                                        |  239 --
 queue.py                                           |   70 -
 setup.py                                           |   21 +
 setup_exe.py                                       |   73 -
 spelling.py                                        |  134 --
 test.sh                                            |    2 +
 test/__init__.py                                   |    2 +
 test/test_calm.py                                  |  294 +++
 test/testdata/.gitignore                           |    7 +
 .../noarch/release/perl-Net-SMTP-SSL/expected      |    5 +
 test/testdata/hints/x86/release/arc/expected       |    8 +
 .../hints/x86/release/base-cygwin/expected         |    5 +
 .../x86/release/cygwin/cygwin-debuginfo/expected   |    8 +
 .../hints/x86/release/cygwin/cygwin-devel/expected |    8 +
 test/testdata/hints/x86/release/cygwin/expected    |    7 +
 test/testdata/hints/x86/release/invalid/expected   |    4 +
 test/testdata/hints/x86/release/keychain/expected  |   12 +
 test/testdata/hints/x86/release/libspiro/expected  |    1 +
 .../x86/release/libspiro/libspiro-devel/expected   |    1 +
 .../hints/x86/release/libspiro/libspiro0/expected  |    1 +
 .../testdata/hints/x86/release/libtextcat/expected |   11 +
 .../release/libtextcat/libtextcat-devel/expected   |   12 +
 .../x86/release/libtextcat/libtextcat0/expected    |   12 +
 .../hints/x86/release/mDNSResponder/expected       |   10 +
 .../release/mDNSResponder/libdns_sd-devel/expected |    7 +
 .../x86/release/mDNSResponder/libdns_sd1/expected  |    7 +
 .../x86/release/mingw64-i686-binutils/expected     |    6 +
 .../mingw64-i686-binutils-debuginfo/expected       |    7 +
 test/testdata/hints/x86/release/naim/expected      |    6 +
 test/testdata/hints/x86/release/openssh/expected   |    5 +
 test/testdata/hints/x86/release/proj/expected      |    5 +
 .../hints/x86/release/proj/libproj-devel/expected  |    6 +
 .../hints/x86/release/proj/libproj1/expected       |    6 +
 .../hints/x86/release/proj/proj-debuginfo/expected |    5 +
 test/testdata/hints/x86/release/rpm-doc/expected   |    2 +
 test/testdata/hints/x86/release/splint/expected    |   15 +
 .../hints/x86/release/testpackage/expected         |    1 +
 .../perl-Net-SMTP-SSL-1.03-2-src.tar.xz            |  Bin 0 -> 2752 bytes
 .../perl-Net-SMTP-SSL-1.03-2.tar.xz                |  Bin 0 -> 3180 bytes
 .../noarch/release/perl-Net-SMTP-SSL/setup.hint    |    5 +
 .../release/after-ready/after-ready-1.0-1.tar.bz2  |  Bin 0 -> 195 bytes
 .../x86/release/after-ready/setup.hint             |    4 +
 .../not-on-maintainer-list-1.0-1.tar.bz2           |  Bin 0 -> 195 bytes
 .../x86/release/not-on-maintainer-list/setup.hint  |    4 +
 .../not-on-package-list-1.0-1.tar.bz2              |  Bin 0 -> 195 bytes
 .../x86/release/not-on-package-list/setup.hint     |    4 +
 .../x86/release/not-ready/not-ready-1.0-1.tar.bz2  |  Bin 0 -> 195 bytes
 .../x86/release/not-ready/setup.hint               |    4 +
 .../x86/release/testpackage/setup.hint             |    6 +
 .../testpackage/testpackage-1.0-1-src.tar.bz2      |  Bin 0 -> 195 bytes
 .../release/testpackage/testpackage-1.0-1.tar.bz2  |  Bin 0 -> 195 bytes
 .../testpackage/testpackage-subpackage/setup.hint  |    4 +
 .../testpackage-subpackage-1.0-1.tar.bz2           |  Bin 0 -> 195 bytes
 .../x86/release/testpackage2/setup.hint            |    4 +
 .../testpackage2/testpackage2-1.0-1.tar.bz2        |  Bin 0 -> 195 bytes
 .../testpackage2-subpackage/setup.hint             |    4 +
 .../testpackage2-subpackage-1.0-1.tar.bz2          |  Bin 0 -> 195 bytes
 test/testdata/homes/Jon Turney/!email              |    1 +
 test/testdata/htdocs.expected/x86/.htaccess        |    1 +
 test/testdata/htdocs.expected/x86/arc/.htaccess    |    3 +
 .../testdata/htdocs.expected/x86/arc/arc-4.32.7-10 |    5 +
 .../htdocs.expected/x86/arc/arc-4.32.7-10-src      |    5 +
 .../htdocs.expected/x86/base-cygwin/.htaccess      |    3 +
 .../x86/base-cygwin/base-cygwin-3.6-1              |    7 +
 .../x86/base-cygwin/base-cygwin-3.8-1              |    7 +
 .../htdocs.expected/x86/cygwin-debuginfo/.htaccess |    3 +
 .../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1  |    7 +
 .../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1  |    7 +
 .../cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3    |    7 +
 .../htdocs.expected/x86/cygwin-devel/.htaccess     |    3 +
 .../x86/cygwin-devel/cygwin-devel-2.2.0-1          |    7 +
 .../x86/cygwin-devel/cygwin-devel-2.2.1-1          |    7 +
 .../x86/cygwin-devel/cygwin-devel-2.3.0-0.3        |    7 +
 test/testdata/htdocs.expected/x86/cygwin/.htaccess |    3 +
 .../htdocs.expected/x86/cygwin/cygwin-2.2.0-1      |    7 +
 .../htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src  |    7 +
 .../htdocs.expected/x86/cygwin/cygwin-2.2.1-1      |    7 +
 .../htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src  |    7 +
 .../htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3    |    7 +
 .../x86/cygwin/cygwin-2.3.0-0.3-src                |    7 +
 .../htdocs.expected/x86/keychain/.htaccess         |    3 +
 .../htdocs.expected/x86/keychain/keychain-2.6.8-1  |   19 +
 .../x86/keychain/keychain-2.6.8-1-src              |    8 +
 .../htdocs.expected/x86/keychain/keychain-2.7.1-1  |   19 +
 .../x86/keychain/keychain-2.7.1-1-src              |   10 +
 .../htdocs.expected/x86/libdns_sd-devel/.htaccess  |    3 +
 .../x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1 |    7 +
 .../htdocs.expected/x86/libdns_sd1/.htaccess       |    3 +
 .../x86/libdns_sd1/libdns_sd1-379.32.1-1           |    7 +
 .../htdocs.expected/x86/libtextcat-devel/.htaccess |    3 +
 .../x86/libtextcat-devel/libtextcat-devel-2.2-2    |    7 +
 .../htdocs.expected/x86/libtextcat0/.htaccess      |    3 +
 .../x86/libtextcat0/libtextcat0-2.2-2              |    7 +
 .../htdocs.expected/x86/mDNSResponder/.htaccess    |    3 +
 .../x86/mDNSResponder/mDNSResponder-379.32.1-1     |    7 +
 .../x86/mDNSResponder/mDNSResponder-379.32.1-1-src |    7 +
 test/testdata/htdocs.expected/x86/naim/.htaccess   |    3 +
 .../testdata/htdocs.expected/x86/openssh/.htaccess |    3 +
 .../htdocs.expected/x86/openssh/openssh-7.2p2-1    |    7 +
 .../x86/openssh/openssh-7.2p2-1-src                |    7 +
 test/testdata/htdocs.expected/x86/packages.inc     |   23 +
 .../x86/perl-Net-SMTP-SSL/.htaccess                |    3 +
 .../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1 |   21 +
 .../perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src |    8 +
 .../htdocs.expected/x86/proj-debuginfo/.htaccess   |    3 +
 .../x86/proj-debuginfo/proj-debuginfo-4.8.0-1      |    7 +
 .../testdata/htdocs.expected/x86/rpm-doc/.htaccess |    3 +
 .../htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2      |   18 +
 .../htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src  |    5 +
 .../htdocs.expected/x86/rpm-doc/rpm-doc-999-1      |    5 +
 .../htdocs.expected/x86/testpackage/.htaccess      |    3 +
 .../x86/testpackage/testpackage-0.1-1              |    5 +
 test/testdata/inifile/setup.ini.expected           |  215 ++
 test/testdata/pkglist/cygwin-pkg-maint             | 2501 ++++++++++++++++++++
 test/testdata/pkglist/expected                     |   55 +
 test/testdata/process_arch/homedir.expected        |   18 +
 test/testdata/process_arch/htdocs.expected         |   29 +
 test/testdata/process_arch/rel_area.expected       |   66 +
 test/testdata/process_arch/vault.expected          |    1 +
 .../perl-Net-SMTP-SSL-1.03-1-src.tar.xz            |  Bin 0 -> 2752 bytes
 .../perl-Net-SMTP-SSL-1.03-1.tar.xz                |  Bin 0 -> 3180 bytes
 .../noarch/release/perl-Net-SMTP-SSL/setup.hint    |    5 +
 .../x86/release/arc/arc-4.32.7-10-src.tar.bz2      |  Bin 0 -> 14 bytes
 .../relarea/x86/release/arc/arc-4.32.7-10.tar.bz2  |  Bin 0 -> 14 bytes
 test/testdata/relarea/x86/release/arc/setup.hint   |    8 +
 .../release/base-cygwin/base-cygwin-3.6-1.tar.xz   |  Bin 0 -> 228 bytes
 .../release/base-cygwin/base-cygwin-3.8-1.tar.xz   |  Bin 0 -> 228 bytes
 .../relarea/x86/release/base-cygwin/setup.hint     |    4 +
 .../x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz   |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-2.2.0-1.tar.xz       |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz   |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-2.2.1-1.tar.xz       |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz     |  Bin 0 -> 228 bytes
 .../cygwin-debuginfo-2.2.0-1.tar.xz                |  Bin 0 -> 228 bytes
 .../cygwin-debuginfo-2.2.1-1.tar.xz                |  Bin 0 -> 228 bytes
 .../cygwin-debuginfo-2.3.0-0.3.tar.xz              |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-debuginfo/setup.hint |    9 +
 .../cygwin-devel/cygwin-devel-2.2.0-1.tar.xz       |  Bin 0 -> 228 bytes
 .../cygwin-devel/cygwin-devel-2.2.1-1.tar.xz       |  Bin 0 -> 228 bytes
 .../cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz     |  Bin 0 -> 228 bytes
 .../x86/release/cygwin/cygwin-devel/setup.hint     |    8 +
 .../testdata/relarea/x86/release/cygwin/setup.hint |    7 +
 .../relarea/x86/release/invalid/setup.hint         |    2 +
 .../release/keychain/keychain-2.6.8-1-src.tar.bz2  |  Bin 0 -> 36347 bytes
 .../x86/release/keychain/keychain-2.6.8-1.tar.bz2  |  Bin 0 -> 30476 bytes
 .../release/keychain/keychain-2.7.1-1-src.tar.bz2  |  Bin 0 -> 134875 bytes
 .../x86/release/keychain/keychain-2.7.1-1.tar.bz2  |  Bin 0 -> 32219 bytes
 .../relarea/x86/release/keychain/setup.hint        |   12 +
 .../x86/release/libspiro/libspiro-devel/setup.hint |   11 +
 .../x86/release/libspiro/libspiro0/setup.hint      |   11 +
 .../relarea/x86/release/libspiro/setup.hint        |    9 +
 .../libtextcat/libtextcat-2.2-2-src.tar.bz2        |  Bin 0 -> 195 bytes
 .../release/libtextcat/libtextcat-2.2-2.tar.bz2    |  Bin 0 -> 195 bytes
 .../libtextcat-devel-2.2-2.tar.bz2                 |  Bin 0 -> 195 bytes
 .../release/libtextcat/libtextcat-devel/setup.hint |   11 +
 .../libtextcat0/libtextcat0-2.2-2.tar.bz2          |  Bin 0 -> 195 bytes
 .../x86/release/libtextcat/libtextcat0/setup.hint  |   11 +
 .../relarea/x86/release/libtextcat/setup.hint      |   10 +
 .../libdns_sd-devel-379.32.1-1.tar.bz2             |  Bin 0 -> 195 bytes
 .../mDNSResponder/libdns_sd-devel/setup.hint       |    7 +
 .../libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2       |  Bin 0 -> 195 bytes
 .../release/mDNSResponder/libdns_sd1/setup.hint    |    7 +
 .../mDNSResponder-379.32.1-1-src.tar.bz2           |  Bin 0 -> 195 bytes
 .../mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 |  Bin 0 -> 195 bytes
 .../relarea/x86/release/mDNSResponder/setup.hint   |   11 +
 .../mingw64-i686-binutils-debuginfo/setup.hint     |    6 +
 .../x86/release/mingw64-i686-binutils/setup.hint   |    5 +
 test/testdata/relarea/x86/release/naim/setup.hint  |    5 +
 .../x86/release/openssh/openssh-7.2p2-1-src.tar.xz |  Bin 0 -> 228 bytes
 .../x86/release/openssh/openssh-7.2p2-1.tar.xz     |  Bin 0 -> 228 bytes
 .../relarea/x86/release/openssh/setup.hint         |    5 +
 .../x86/release/proj/libproj-devel/setup.hint      |    5 +
 .../relarea/x86/release/proj/libproj1/setup.hint   |    5 +
 test/testdata/relarea/x86/release/proj/setup.hint  |    4 +
 .../x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2  |  Bin 0 -> 42 bytes
 .../x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2      |  Bin 0 -> 50941 bytes
 .../x86/release/rpm-doc/rpm-doc-999-1.tar.bz2      |  Bin 0 -> 42 bytes
 .../relarea/x86/release/rpm-doc/setup.hint         |    2 +
 .../testdata/relarea/x86/release/splint/setup.hint |   14 +
 .../relarea/x86/release/testpackage/setup.hint     |    3 +
 test/testdata/uploads/move.expected                |    3 +
 test/testdata/uploads/pkglist.expected             |   14 +
 testdata/.gitignore                                |    7 -
 .../noarch/release/perl-Net-SMTP-SSL/expected      |    5 -
 testdata/hints/x86/release/arc/expected            |    8 -
 testdata/hints/x86/release/base-cygwin/expected    |    5 -
 .../x86/release/cygwin/cygwin-debuginfo/expected   |    8 -
 .../hints/x86/release/cygwin/cygwin-devel/expected |    8 -
 testdata/hints/x86/release/cygwin/expected         |    7 -
 testdata/hints/x86/release/invalid/expected        |    4 -
 testdata/hints/x86/release/keychain/expected       |   12 -
 testdata/hints/x86/release/libspiro/expected       |    1 -
 .../x86/release/libspiro/libspiro-devel/expected   |    1 -
 .../hints/x86/release/libspiro/libspiro0/expected  |    1 -
 testdata/hints/x86/release/libtextcat/expected     |   11 -
 .../release/libtextcat/libtextcat-devel/expected   |   12 -
 .../x86/release/libtextcat/libtextcat0/expected    |   12 -
 testdata/hints/x86/release/mDNSResponder/expected  |   10 -
 .../release/mDNSResponder/libdns_sd-devel/expected |    7 -
 .../x86/release/mDNSResponder/libdns_sd1/expected  |    7 -
 .../x86/release/mingw64-i686-binutils/expected     |    6 -
 .../mingw64-i686-binutils-debuginfo/expected       |    7 -
 testdata/hints/x86/release/naim/expected           |    6 -
 testdata/hints/x86/release/openssh/expected        |    5 -
 testdata/hints/x86/release/proj/expected           |    5 -
 .../hints/x86/release/proj/libproj-devel/expected  |    6 -
 testdata/hints/x86/release/proj/libproj1/expected  |    6 -
 .../hints/x86/release/proj/proj-debuginfo/expected |    5 -
 testdata/hints/x86/release/rpm-doc/expected        |    2 -
 testdata/hints/x86/release/splint/expected         |   15 -
 testdata/hints/x86/release/testpackage/expected    |    1 -
 .../perl-Net-SMTP-SSL-1.03-2-src.tar.xz            |  Bin 2752 -> 0 bytes
 .../perl-Net-SMTP-SSL-1.03-2.tar.xz                |  Bin 3180 -> 0 bytes
 .../noarch/release/perl-Net-SMTP-SSL/setup.hint    |    5 -
 .../release/after-ready/after-ready-1.0-1.tar.bz2  |  Bin 195 -> 0 bytes
 .../x86/release/after-ready/setup.hint             |    4 -
 .../not-on-maintainer-list-1.0-1.tar.bz2           |  Bin 195 -> 0 bytes
 .../x86/release/not-on-maintainer-list/setup.hint  |    4 -
 .../not-on-package-list-1.0-1.tar.bz2              |  Bin 195 -> 0 bytes
 .../x86/release/not-on-package-list/setup.hint     |    4 -
 .../x86/release/not-ready/not-ready-1.0-1.tar.bz2  |  Bin 195 -> 0 bytes
 .../x86/release/not-ready/setup.hint               |    4 -
 .../x86/release/testpackage/setup.hint             |    6 -
 .../testpackage/testpackage-1.0-1-src.tar.bz2      |  Bin 195 -> 0 bytes
 .../release/testpackage/testpackage-1.0-1.tar.bz2  |  Bin 195 -> 0 bytes
 .../testpackage/testpackage-subpackage/setup.hint  |    4 -
 .../testpackage-subpackage-1.0-1.tar.bz2           |  Bin 195 -> 0 bytes
 .../x86/release/testpackage2/setup.hint            |    4 -
 .../testpackage2/testpackage2-1.0-1.tar.bz2        |  Bin 195 -> 0 bytes
 .../testpackage2-subpackage/setup.hint             |    4 -
 .../testpackage2-subpackage-1.0-1.tar.bz2          |  Bin 195 -> 0 bytes
 testdata/homes/Jon Turney/!email                   |    1 -
 testdata/htdocs.expected/x86/.htaccess             |    1 -
 testdata/htdocs.expected/x86/arc/.htaccess         |    3 -
 testdata/htdocs.expected/x86/arc/arc-4.32.7-10     |    5 -
 testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src |    5 -
 testdata/htdocs.expected/x86/base-cygwin/.htaccess |    3 -
 .../x86/base-cygwin/base-cygwin-3.6-1              |    7 -
 .../x86/base-cygwin/base-cygwin-3.8-1              |    7 -
 .../htdocs.expected/x86/cygwin-debuginfo/.htaccess |    3 -
 .../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1  |    7 -
 .../x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1  |    7 -
 .../cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3    |    7 -
 .../htdocs.expected/x86/cygwin-devel/.htaccess     |    3 -
 .../x86/cygwin-devel/cygwin-devel-2.2.0-1          |    7 -
 .../x86/cygwin-devel/cygwin-devel-2.2.1-1          |    7 -
 .../x86/cygwin-devel/cygwin-devel-2.3.0-0.3        |    7 -
 testdata/htdocs.expected/x86/cygwin/.htaccess      |    3 -
 testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1 |    7 -
 .../htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src  |    7 -
 testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1 |    7 -
 .../htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src  |    7 -
 .../htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3    |    7 -
 .../x86/cygwin/cygwin-2.3.0-0.3-src                |    7 -
 testdata/htdocs.expected/x86/keychain/.htaccess    |    3 -
 .../htdocs.expected/x86/keychain/keychain-2.6.8-1  |   19 -
 .../x86/keychain/keychain-2.6.8-1-src              |    8 -
 .../htdocs.expected/x86/keychain/keychain-2.7.1-1  |   19 -
 .../x86/keychain/keychain-2.7.1-1-src              |   10 -
 .../htdocs.expected/x86/libdns_sd-devel/.htaccess  |    3 -
 .../x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1 |    7 -
 testdata/htdocs.expected/x86/libdns_sd1/.htaccess  |    3 -
 .../x86/libdns_sd1/libdns_sd1-379.32.1-1           |    7 -
 .../htdocs.expected/x86/libtextcat-devel/.htaccess |    3 -
 .../x86/libtextcat-devel/libtextcat-devel-2.2-2    |    7 -
 testdata/htdocs.expected/x86/libtextcat0/.htaccess |    3 -
 .../x86/libtextcat0/libtextcat0-2.2-2              |    7 -
 .../htdocs.expected/x86/mDNSResponder/.htaccess    |    3 -
 .../x86/mDNSResponder/mDNSResponder-379.32.1-1     |    7 -
 .../x86/mDNSResponder/mDNSResponder-379.32.1-1-src |    7 -
 testdata/htdocs.expected/x86/naim/.htaccess        |    3 -
 testdata/htdocs.expected/x86/openssh/.htaccess     |    3 -
 .../htdocs.expected/x86/openssh/openssh-7.2p2-1    |    7 -
 .../x86/openssh/openssh-7.2p2-1-src                |    7 -
 testdata/htdocs.expected/x86/packages.inc          |   23 -
 .../x86/perl-Net-SMTP-SSL/.htaccess                |    3 -
 .../x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1 |   21 -
 .../perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src |    8 -
 .../htdocs.expected/x86/proj-debuginfo/.htaccess   |    3 -
 .../x86/proj-debuginfo/proj-debuginfo-4.8.0-1      |    7 -
 testdata/htdocs.expected/x86/rpm-doc/.htaccess     |    3 -
 testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2 |   18 -
 .../htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src  |    5 -
 testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1 |    5 -
 testdata/htdocs.expected/x86/testpackage/.htaccess |    3 -
 .../x86/testpackage/testpackage-0.1-1              |    5 -
 testdata/inifile/setup.ini.expected                |  215 --
 testdata/pkglist/cygwin-pkg-maint                  | 2501 --------------------
 testdata/pkglist/expected                          |   55 -
 testdata/process_arch/homedir.expected             |   18 -
 testdata/process_arch/htdocs.expected              |   29 -
 testdata/process_arch/rel_area.expected            |   66 -
 testdata/process_arch/vault.expected               |    1 -
 .../perl-Net-SMTP-SSL-1.03-1-src.tar.xz            |  Bin 2752 -> 0 bytes
 .../perl-Net-SMTP-SSL-1.03-1.tar.xz                |  Bin 3180 -> 0 bytes
 .../noarch/release/perl-Net-SMTP-SSL/setup.hint    |    5 -
 .../x86/release/arc/arc-4.32.7-10-src.tar.bz2      |  Bin 14 -> 0 bytes
 .../relarea/x86/release/arc/arc-4.32.7-10.tar.bz2  |  Bin 14 -> 0 bytes
 testdata/relarea/x86/release/arc/setup.hint        |    8 -
 .../release/base-cygwin/base-cygwin-3.6-1.tar.xz   |  Bin 228 -> 0 bytes
 .../release/base-cygwin/base-cygwin-3.8-1.tar.xz   |  Bin 228 -> 0 bytes
 .../relarea/x86/release/base-cygwin/setup.hint     |    4 -
 .../x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz   |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-2.2.0-1.tar.xz       |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz   |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-2.2.1-1.tar.xz       |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz     |  Bin 228 -> 0 bytes
 .../cygwin-debuginfo-2.2.0-1.tar.xz                |  Bin 228 -> 0 bytes
 .../cygwin-debuginfo-2.2.1-1.tar.xz                |  Bin 228 -> 0 bytes
 .../cygwin-debuginfo-2.3.0-0.3.tar.xz              |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-debuginfo/setup.hint |    9 -
 .../cygwin-devel/cygwin-devel-2.2.0-1.tar.xz       |  Bin 228 -> 0 bytes
 .../cygwin-devel/cygwin-devel-2.2.1-1.tar.xz       |  Bin 228 -> 0 bytes
 .../cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz     |  Bin 228 -> 0 bytes
 .../x86/release/cygwin/cygwin-devel/setup.hint     |    8 -
 testdata/relarea/x86/release/cygwin/setup.hint     |    7 -
 testdata/relarea/x86/release/invalid/setup.hint    |    2 -
 .../release/keychain/keychain-2.6.8-1-src.tar.bz2  |  Bin 36347 -> 0 bytes
 .../x86/release/keychain/keychain-2.6.8-1.tar.bz2  |  Bin 30476 -> 0 bytes
 .../release/keychain/keychain-2.7.1-1-src.tar.bz2  |  Bin 134875 -> 0 bytes
 .../x86/release/keychain/keychain-2.7.1-1.tar.bz2  |  Bin 32219 -> 0 bytes
 testdata/relarea/x86/release/keychain/setup.hint   |   12 -
 .../x86/release/libspiro/libspiro-devel/setup.hint |   11 -
 .../x86/release/libspiro/libspiro0/setup.hint      |   11 -
 testdata/relarea/x86/release/libspiro/setup.hint   |    9 -
 .../libtextcat/libtextcat-2.2-2-src.tar.bz2        |  Bin 195 -> 0 bytes
 .../release/libtextcat/libtextcat-2.2-2.tar.bz2    |  Bin 195 -> 0 bytes
 .../libtextcat-devel-2.2-2.tar.bz2                 |  Bin 195 -> 0 bytes
 .../release/libtextcat/libtextcat-devel/setup.hint |   11 -
 .../libtextcat0/libtextcat0-2.2-2.tar.bz2          |  Bin 195 -> 0 bytes
 .../x86/release/libtextcat/libtextcat0/setup.hint  |   11 -
 testdata/relarea/x86/release/libtextcat/setup.hint |   10 -
 .../libdns_sd-devel-379.32.1-1.tar.bz2             |  Bin 195 -> 0 bytes
 .../mDNSResponder/libdns_sd-devel/setup.hint       |    7 -
 .../libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2       |  Bin 195 -> 0 bytes
 .../release/mDNSResponder/libdns_sd1/setup.hint    |    7 -
 .../mDNSResponder-379.32.1-1-src.tar.bz2           |  Bin 195 -> 0 bytes
 .../mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 |  Bin 195 -> 0 bytes
 .../relarea/x86/release/mDNSResponder/setup.hint   |   11 -
 .../mingw64-i686-binutils-debuginfo/setup.hint     |    6 -
 .../x86/release/mingw64-i686-binutils/setup.hint   |    5 -
 testdata/relarea/x86/release/naim/setup.hint       |    5 -
 .../x86/release/openssh/openssh-7.2p2-1-src.tar.xz |  Bin 228 -> 0 bytes
 .../x86/release/openssh/openssh-7.2p2-1.tar.xz     |  Bin 228 -> 0 bytes
 testdata/relarea/x86/release/openssh/setup.hint    |    5 -
 .../x86/release/proj/libproj-devel/setup.hint      |    5 -
 .../relarea/x86/release/proj/libproj1/setup.hint   |    5 -
 testdata/relarea/x86/release/proj/setup.hint       |    4 -
 .../x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2  |  Bin 42 -> 0 bytes
 .../x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2      |  Bin 50941 -> 0 bytes
 .../x86/release/rpm-doc/rpm-doc-999-1.tar.bz2      |  Bin 42 -> 0 bytes
 testdata/relarea/x86/release/rpm-doc/setup.hint    |    2 -
 testdata/relarea/x86/release/splint/setup.hint     |   14 -
 .../relarea/x86/release/testpackage/setup.hint     |    3 -
 testdata/uploads/move.expected                     |    3 -
 testdata/uploads/pkglist.expected                  |   14 -
 tests.py                                           |  288 ---
 uploads.py                                         |  278 ---
 version.py                                         |  130 -
 words.txt                                          |  437 ----
 397 files changed, 7735 insertions(+), 7688 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index e6c1776..a5b35c2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,4 +5,4 @@ python:
 install: "pip install pep8 dirq"
 script:
  - ./pep8
- - ./tests.py
+ - python -m unittest discover
diff --git a/abeyance_handler.py b/abeyance_handler.py
deleted file mode 100644
index 227de3c..0000000
--- a/abeyance_handler.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2016 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.
-#
-
-import logging
-from logging.handlers import BufferingHandler
-
-
-# Loosely based on the "Buffering logging messages and outputting them
-# conditionally" example from the python logging cookbook.
-#
-# AbeyanceHandler holds log output in a BufferingHandler.  When closed, it will
-# pass all log output of retainLevel or higher to the target logger if any of
-# the log output reaches thresholdLevel level, otherwise it discards all log
-# output.
-
-class AbeyanceHandler(BufferingHandler):
-    def __init__(self, target, thresholdLevel, retainLevel):
-        BufferingHandler.__init__(self, capacity=0)
-        self.target = target
-        self.thresholdLevel = thresholdLevel
-
-        if retainLevel is None:
-            retainLevel = thresholdLevel
-        self.setLevel(retainLevel)
-
-    def shouldFlush(self, record):
-        # the capacity we pass to BufferingHandler is irrelevant since we
-        # override shouldFlush so it never indicates we have reached capacity
-        return False
-
-    def close(self):
-        # if there are any log records of thresholdLevel or higher ...
-        if len(self.buffer) > 0:
-            if any([record.levelno >= self.thresholdLevel for record in self.buffer]):
-                # ... send all records to the target
-                for record in self.buffer:
-                    self.target.handle(record)
-
-        self.target.close()
-
-        # otherwise, just discard the buffers contents
-        super().close()
-
-    def __enter__(self):
-        logging.getLogger().addHandler(self)
-        return self
-
-    def __exit__(self, exception_type, exception_value, traceback):
-        self.close()
-        logging.getLogger().removeHandler(self)
-
-        # process any exception in the with-block normally
-        return False
diff --git a/buffering_smtp_handler.py b/buffering_smtp_handler.py
deleted file mode 100644
index 0bf51a4..0000000
--- a/buffering_smtp_handler.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted,
-# provided that the above copyright notice appear in all copies and that
-# both that copyright notice and this permission notice appear in
-# supporting documentation, and that the name of Vinay Sajip
-# not be used in advertising or publicity pertaining to distribution
-# of the software without specific, written prior permission.
-# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
-# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
-# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-#
-# This file is part of the Python logging distribution. See
-# http://www.red-dove.com/python_logging.html
-#
-
-
-import logging
-import logging.handlers
-import email.message
-
-import common_constants
-
-
-class BufferingSMTPHandler(logging.handlers.BufferingHandler):
-    def __init__(self,
-                 toaddrs,
-                 subject,
-                 mailhost=common_constants.MAILHOST,
-                 fromaddr='cygwin-no-reply@cygwin.com',
-                 logging_format='%(levelname)s: %(message)s'):
-        logging.handlers.BufferingHandler.__init__(self, capacity=0)
-        self.mailhost = mailhost
-        self.mailport = None
-        self.fromaddr = fromaddr
-        self.toaddrs = toaddrs
-        self.subject = subject
-        self.formatter = logging_format
-        self.setFormatter(logging.Formatter(logging_format))
-
-    def flush(self):
-        if len(self.buffer) > 0:
-            msg = ""
-            for record in self.buffer:
-                s = self.format(record)
-                msg = msg + s + "\r\n"
-
-            m = email.message.Message()
-            m['From'] = self.fromaddr
-            m['To'] = ','.join(self.toaddrs)
-            m['Bcc'] = common_constants.ALWAYS_BCC
-            m['Subject'] = self.subject
-            m['X-Calm'] = '1'
-
-            # use utf-8 only if the message can't be ascii encoded
-            charset = 'ascii'
-            try:
-                msg.encode('ascii')
-            except UnicodeError:
-                charset = 'utf-8'
-            m.set_payload(msg, charset=charset)
-
-            # if toaddrs consists of the single address 'debug', just dump the mail we would have sent
-            if self.toaddrs == ['debug']:
-                print('-' * 40)
-                print(msg)
-                print('-' * 40)
-            elif len(self.toaddrs) > 0:
-                try:
-                    import smtplib
-                    port = self.mailport
-                    if not port:
-                        port = smtplib.SMTP_PORT
-                    smtp = smtplib.SMTP(self.mailhost, port)
-                    smtp.send_message(m)
-                    smtp.quit()
-                except:
-                    self.handleError(self.buffer[0])  # first record
-
-            self.buffer = []
-
-    def shouldFlush(self, record):
-        # the capacity we pass to BufferingHandler is irrelevant since we
-        # override shouldFlush so it never indicates we have reached capacity
-        return False
diff --git a/calm b/calm
deleted file mode 100755
index ac1524e..0000000
--- a/calm
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-base_dir=$(dirname "$0")
-exec python3 "$base_dir/calm.py" "$@"
diff --git a/calm.py b/calm.py
deleted file mode 100755
index 4393597..0000000
--- a/calm.py
+++ /dev/null
@@ -1,345 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# calm - better than being upset
-#
-
-#
-# for each arch
-# - read and validate packages from release area
-# - stop if there are errors
-# otherwise,
-# for each maintainer
-# - read and validate any package uploads
-# - build a list of files to move and remove
-# - for each arch
-# -- merge package sets
-# -- remove from the package set files which are to be removed
-# -- validate merged package set
-# -- process remove list
-# - on failure
-# -- mail maintainer with errors
-# -- empty move list
-# -- discard merged package sets
-# - on success
-# -- process move list
-# -- mail maintainer with movelist
-# -- continue with merged package sets
-# write package listings
-# write setup.ini file
-#
-
-from contextlib import ExitStack
-import argparse
-import logging
-import os
-import shutil
-import sys
-import tempfile
-
-from abeyance_handler import AbeyanceHandler
-from buffering_smtp_handler import BufferingSMTPHandler
-import common_constants
-import maintainers
-import package
-import pkg2html
-import queue
-import setup_exe
-import uploads
-
-
-#
-#
-#
-
-def process(args):
-    subject = 'calm%s: cygwin package upload report from %s' % (' [dry-run]' if args.dryrun else '', os.uname()[1])
-
-    # send one email per run to leads, if any errors occurred
-    with mail_logs(args.email, toaddrs=args.email, subject='%s' % (subject), thresholdLevel=logging.ERROR) as leads_email:
-        if args.dryrun:
-            logging.warning("--dry-run is in effect, nothing will really be done")
-
-        # for each arch
-        packages = {}
-        for arch in common_constants.ARCHES:
-            logging.debug("reading existing packages for arch %s" % (arch))
-
-            # build package list
-            packages[arch] = package.read_packages(args.rel_area, arch)
-
-            # validate the package set
-            if not package.validate_packages(args, packages[arch]):
-                logging.error("existing %s package set has errors", arch)
-                return None
-
-        # read maintainer list
-        mlist = maintainers.Maintainer.read(args)
-
-        # make the list of all packages
-        all_packages = maintainers.Maintainer.all_packages(mlist)
-
-        # for each maintainer
-        for name in sorted(mlist.keys()):
-            m = mlist[name]
-
-            # also send a mail to each maintainer about their packages
-            with mail_logs(args.email, toaddrs=m.email, subject='%s for %s' % (subject, name), thresholdLevel=logging.INFO) as maint_email:
-
-                # for each arch and noarch
-                scan_result = {}
-                skip_maintainer = False
-                for arch in common_constants.ARCHES + ['noarch']:
-                    logging.debug("reading uploaded arch %s packages from maintainer %s" % (arch, name))
-
-                    # read uploads
-                    scan_result[arch] = uploads.scan(m, all_packages, arch, args)
-
-                    # remove triggers
-                    uploads.remove(args, scan_result[arch].remove_always)
-
-                    if scan_result[arch].error:
-                        logging.error("error while reading uploaded arch %s packages from maintainer %s" % (arch, name))
-                        skip_maintainer = True
-                        continue
-
-                    # queue for source package validator
-                    queue.add(args, scan_result[arch].to_relarea, os.path.join(m.homedir()))
-
-                # if there are no uploaded or removed packages for this
-                # maintainer, we don't have anything to do
-                if not any([scan_result[a].packages or scan_result[a].to_vault for a in scan_result]):
-                    logging.debug("nothing to do for maintainer %s" % (name))
-                    skip_maintainer = True
-
-                if skip_maintainer:
-                    continue
-
-                # for each arch
-                merged_packages = {}
-                valid = True
-                for arch in common_constants.ARCHES:
-                    logging.debug("merging %s package set with uploads from maintainer %s" % (arch, name))
-
-                    # merge package sets
-                    merged_packages[arch] = package.merge(packages[arch], scan_result[arch].packages, scan_result['noarch'].packages)
-                    if not merged_packages[arch]:
-                        valid = False
-                        break
-
-                    # remove files which are to be removed
-                    #
-                    # XXX: this doesn't properly account for removing setup.hint
-                    # files
-                    for p in scan_result[arch].to_vault:
-                        for f in scan_result[arch].to_vault[p]:
-                            package.delete(merged_packages[arch], p, f)
-
-                    # validate the package set
-                    logging.debug("validating merged %s package set for maintainer %s" % (arch, name))
-                    if not package.validate_packages(args, merged_packages[arch]):
-                        valid = False
-
-                if not valid:
-                    # discard move list and merged_packages
-                    logging.error("error while merging uploaded %s packages for %s" % (arch, name))
-                    continue
-
-                # for each arch and noarch
-                for arch in common_constants.ARCHES + ['noarch']:
-                    logging.debug("moving %s packages for maintainer %s" % (arch, name))
-
-                    # process the move lists
-                    uploads.move_to_vault(args, scan_result[arch].to_vault)
-                    uploads.remove(args, scan_result[arch].remove_success)
-                    uploads.move_to_relarea(m, args, scan_result[arch].to_relarea)
-
-                # for each arch
-                for arch in common_constants.ARCHES:
-                    # use merged package list
-                    packages[arch] = merged_packages[arch]
-                    logging.debug("added %d + %d packages from maintainer %s" % (len(scan_result[arch].packages), len(scan_result['noarch'].packages), name))
-
-    return packages
-
-
-#
-#
-#
-
-def main(args):
-    # read package set and process uploads
-    packages = process(args)
-
-    if not packages:
-        logging.error("not processing uploads or writing setup.ini")
-        return
-
-    # for each arch
-    for arch in common_constants.ARCHES:
-        # update packages listings
-        # XXX: perhaps we need a --[no]listing command line option to disable this from being run?
-        pkg2html.update_package_listings(args, packages[arch], arch)
-
-    # for each arch
-    for arch in common_constants.ARCHES:
-        logging.debug("writing setup.ini for arch %s" % (arch))
-
-        args.arch = arch
-        args.setup_version = setup_exe.extract_version(os.path.join(args.setupdir, 'setup-' + args.arch + '.exe'))
-        logging.debug("setup version is '%s'" % (args.setup_version))
-
-        basedir = os.path.join(args.rel_area, args.arch)
-        inifile = os.path.join(basedir, 'setup.ini')
-
-        # write setup.ini to a temporary file
-        with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
-            args.inifile = tmpfile.name
-
-            changed = False
-
-            # write setup.ini
-            package.write_setup_ini(args, packages[arch], arch)
-
-            if not os.path.exists(inifile):
-                # if the setup.ini file doesn't exist yet
-                logging.warning('no existing %s' % (inifile))
-                changed = True
-            else:
-                # or, if it's changed in more than timestamp
-                status = os.system('/usr/bin/diff -I^setup-timestamp -w -B -q %s %s >/dev/null' % (inifile, tmpfile.name))
-                logging.debug('diff exit status %d' % (status))
-                if (status >> 8) == 1:
-                    changed = True
-
-            # then update setup.ini
-            if changed:
-                if args.dryrun:
-                    logging.warning("not moving %s to %s, due to --dry-run" % (tmpfile.name, inifile))
-                    os.remove(tmpfile.name)
-                else:
-                    # make a backup of the current setup.ini
-                    shutil.copy2(inifile, inifile + '.bak')
-
-                    # replace setup.ini
-                    logging.info("moving %s to %s" % (tmpfile.name, inifile))
-                    shutil.move(tmpfile.name, inifile)
-
-                    # compress and re-sign
-                    for ext in ['.ini', '.bz2', '.xz']:
-                        try:
-                            os.remove(os.path.join(basedir, 'setup' + ext + '.sig'))
-                        except FileNotFoundError:
-                            pass
-
-                        if ext == '.bz2':
-                            os.system('/usr/bin/bzip2 <%s >%s' % (inifile, os.path.splitext(inifile)[0] + ext))
-                        elif ext == '.xz':
-                            os.system('/usr/bin/xz -6e <%s >%s' % (inifile, os.path.splitext(inifile)[0] + ext))
-
-                        os.system('/usr/bin/gpg --batch --yes -b ' + os.path.join(basedir, 'setup' + ext))
-
-                    # arrange for checksums to be recomputed
-                    for sumfile in ['md5.sum', 'sha512.sum']:
-                        try:
-                            os.remove(os.path.join(basedir, sumfile))
-                        except FileNotFoundError:
-                            pass
-            else:
-                logging.debug("removing %s, unchanged %s" % (tmpfile.name, inifile))
-                os.remove(tmpfile.name)
-
-
-#
-# we only want to mail the logs if the email option was used
-# (otherwise use ExitStack() as a 'do nothing' context)
-#
-
-def mail_logs(enabled, toaddrs, subject, thresholdLevel, retainLevel=None):
-    if enabled:
-        return AbeyanceHandler(BufferingSMTPHandler(toaddrs, subject), thresholdLevel, retainLevel)
-
-    return ExitStack()
-
-
-#
-#
-#
-
-if __name__ == "__main__":
-    htdocs_default = os.path.join(common_constants.HTDOCS, 'packages')
-    homedir_default = common_constants.HOMEDIR
-    orphanmaint_default = common_constants.ORPHANMAINT
-    pkglist_default = common_constants.PKGMAINT
-    relarea_default = common_constants.FTP
-    setupdir_default = common_constants.HTDOCS
-    vault_default = common_constants.VAULT
-    logdir_default = '/sourceware/cygwin-staging/logs'
-    queuedir_default = '/sourceware/cygwin-staging/queue'
-
-    parser = argparse.ArgumentParser(description='Upset replacement')
-    parser.add_argument('--email', action='store', dest='email', nargs='?', const=common_constants.EMAILS, help='email output to maintainer and ADDRS (default: ' + common_constants.EMAILS + ')', metavar='ADDRS')
-    parser.add_argument('--force', action='store_true', help="overwrite existing files")
-    parser.add_argument('--homedir', action='store', metavar='DIR', help="maintainer home directory (default: " + homedir_default + ")", default=homedir_default)
-    parser.add_argument('--htdocs', action='store', metavar='DIR', help="htdocs output directory (default: " + htdocs_default + ")", default=htdocs_default)
-    parser.add_argument('--logdir', action='store', metavar='DIR', help="log directory (default: '" + logdir_default + "')", default=logdir_default)
-    parser.add_argument('--orphanmaint', action='store', metavar='NAMES', help="orphan package maintainers (default: '" + orphanmaint_default + "')", default=orphanmaint_default)
-    parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
-    parser.add_argument('--queuedir', action='store', metavar='DIR', help="queue directory (default: '" + queuedir_default + "')", default=queuedir_default)
-    parser.add_argument('--release', action='store', help='value for setup-release key (default: cygwin)', default='cygwin')
-    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
-    parser.add_argument('--setupdir', action='store', metavar='DIR', help="setup executable directory (default: " + setupdir_default + ")", default=setupdir_default)
-    parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun', help="don't do anything")
-    parser.add_argument('--vault', action='store', metavar='DIR', help="vault directory (default: " + vault_default + ")", default=vault_default, dest='vault')
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
-    (args) = parser.parse_args()
-
-    # set up logging to a file
-    try:
-        os.makedirs(args.logdir, exist_ok=True)
-    except FileExistsError:
-        pass
-    rfh = logging.handlers.RotatingFileHandler(os.path.join(args.logdir, 'calm.log'), backupCount=48)
-    rfh.doRollover()  # force a rotate on every run
-    rfh.setFormatter(logging.Formatter('%(asctime)s - %(levelname)-8s - %(message)s'))
-    rfh.setLevel(logging.DEBUG)
-    logging.getLogger().addHandler(rfh)
-
-    # setup logging to stdout, of WARNING messages or higher (INFO if verbose)
-    ch = logging.StreamHandler(sys.stdout)
-    ch.setFormatter(logging.Formatter(os.path.basename(sys.argv[0])+': %(message)s'))
-    if args.verbose:
-        ch.setLevel(logging.INFO)
-    else:
-        ch.setLevel(logging.WARNING)
-    logging.getLogger().addHandler(ch)
-
-    # change root logger level from the default of WARNING to NOTSET so it
-    # doesn't filter out any log messages due to level
-    logging.getLogger().setLevel(logging.NOTSET)
-
-    if args.email:
-        args.email = args.email.split(',')
-
-    sys.exit(main(args))
diff --git a/calm.sh b/calm.sh
new file mode 100755
index 0000000..48fba9c
--- /dev/null
+++ b/calm.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+exec python3 -m calm.calm "$@"
diff --git a/calm/__init__.py b/calm/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/calm/abeyance_handler.py b/calm/abeyance_handler.py
new file mode 100644
index 0000000..227de3c
--- /dev/null
+++ b/calm/abeyance_handler.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2016 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.
+#
+
+import logging
+from logging.handlers import BufferingHandler
+
+
+# Loosely based on the "Buffering logging messages and outputting them
+# conditionally" example from the python logging cookbook.
+#
+# AbeyanceHandler holds log output in a BufferingHandler.  When closed, it will
+# pass all log output of retainLevel or higher to the target logger if any of
+# the log output reaches thresholdLevel level, otherwise it discards all log
+# output.
+
+class AbeyanceHandler(BufferingHandler):
+    def __init__(self, target, thresholdLevel, retainLevel):
+        BufferingHandler.__init__(self, capacity=0)
+        self.target = target
+        self.thresholdLevel = thresholdLevel
+
+        if retainLevel is None:
+            retainLevel = thresholdLevel
+        self.setLevel(retainLevel)
+
+    def shouldFlush(self, record):
+        # the capacity we pass to BufferingHandler is irrelevant since we
+        # override shouldFlush so it never indicates we have reached capacity
+        return False
+
+    def close(self):
+        # if there are any log records of thresholdLevel or higher ...
+        if len(self.buffer) > 0:
+            if any([record.levelno >= self.thresholdLevel for record in self.buffer]):
+                # ... send all records to the target
+                for record in self.buffer:
+                    self.target.handle(record)
+
+        self.target.close()
+
+        # otherwise, just discard the buffers contents
+        super().close()
+
+    def __enter__(self):
+        logging.getLogger().addHandler(self)
+        return self
+
+    def __exit__(self, exception_type, exception_value, traceback):
+        self.close()
+        logging.getLogger().removeHandler(self)
+
+        # process any exception in the with-block normally
+        return False
diff --git a/calm/buffering_smtp_handler.py b/calm/buffering_smtp_handler.py
new file mode 100644
index 0000000..13fca18
--- /dev/null
+++ b/calm/buffering_smtp_handler.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+#
+# Copyright 2001-2002 by Vinay Sajip. All Rights Reserved.
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of Vinay Sajip
+# not be used in advertising or publicity pertaining to distribution
+# of the software without specific, written prior permission.
+# VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+# This file is part of the Python logging distribution. See
+# http://www.red-dove.com/python_logging.html
+#
+
+
+import logging
+import logging.handlers
+import email.message
+
+from . import common_constants
+
+
+class BufferingSMTPHandler(logging.handlers.BufferingHandler):
+    def __init__(self,
+                 toaddrs,
+                 subject,
+                 mailhost=common_constants.MAILHOST,
+                 fromaddr='cygwin-no-reply@cygwin.com',
+                 logging_format='%(levelname)s: %(message)s'):
+        logging.handlers.BufferingHandler.__init__(self, capacity=0)
+        self.mailhost = mailhost
+        self.mailport = None
+        self.fromaddr = fromaddr
+        self.toaddrs = toaddrs
+        self.subject = subject
+        self.formatter = logging_format
+        self.setFormatter(logging.Formatter(logging_format))
+
+    def flush(self):
+        if len(self.buffer) > 0:
+            msg = ""
+            for record in self.buffer:
+                s = self.format(record)
+                msg = msg + s + "\r\n"
+
+            m = email.message.Message()
+            m['From'] = self.fromaddr
+            m['To'] = ','.join(self.toaddrs)
+            m['Bcc'] = common_constants.ALWAYS_BCC
+            m['Subject'] = self.subject
+            m['X-Calm'] = '1'
+
+            # use utf-8 only if the message can't be ascii encoded
+            charset = 'ascii'
+            try:
+                msg.encode('ascii')
+            except UnicodeError:
+                charset = 'utf-8'
+            m.set_payload(msg, charset=charset)
+
+            # if toaddrs consists of the single address 'debug', just dump the mail we would have sent
+            if self.toaddrs == ['debug']:
+                print('-' * 40)
+                print(msg)
+                print('-' * 40)
+            elif len(self.toaddrs) > 0:
+                try:
+                    import smtplib
+                    port = self.mailport
+                    if not port:
+                        port = smtplib.SMTP_PORT
+                    smtp = smtplib.SMTP(self.mailhost, port)
+                    smtp.send_message(m)
+                    smtp.quit()
+                except:
+                    self.handleError(self.buffer[0])  # first record
+
+            self.buffer = []
+
+    def shouldFlush(self, record):
+        # the capacity we pass to BufferingHandler is irrelevant since we
+        # override shouldFlush so it never indicates we have reached capacity
+        return False
diff --git a/calm/calm.py b/calm/calm.py
new file mode 100755
index 0000000..c9e5bd9
--- /dev/null
+++ b/calm/calm.py
@@ -0,0 +1,353 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# calm - better than being upset
+#
+
+#
+# for each arch
+# - read and validate packages from release area
+# - stop if there are errors
+# otherwise,
+# for each maintainer
+# - read and validate any package uploads
+# - build a list of files to move and remove
+# - for each arch
+# -- merge package sets
+# -- remove from the package set files which are to be removed
+# -- validate merged package set
+# -- process remove list
+# - on failure
+# -- mail maintainer with errors
+# -- empty move list
+# -- discard merged package sets
+# - on success
+# -- process move list
+# -- mail maintainer with movelist
+# -- continue with merged package sets
+# write package listings
+# write setup.ini file
+#
+
+from contextlib import ExitStack
+import argparse
+import logging
+import os
+import shutil
+import sys
+import tempfile
+
+from .abeyance_handler import AbeyanceHandler
+from .buffering_smtp_handler import BufferingSMTPHandler
+from . import common_constants
+from . import maintainers
+from . import package
+from . import pkg2html
+from . import queue
+from . import setup_exe
+from . import uploads
+
+
+#
+#
+#
+
+def process(args):
+    subject = 'calm%s: cygwin package upload report from %s' % (' [dry-run]' if args.dryrun else '', os.uname()[1])
+
+    # send one email per run to leads, if any errors occurred
+    with mail_logs(args.email, toaddrs=args.email, subject='%s' % (subject), thresholdLevel=logging.ERROR) as leads_email:
+        if args.dryrun:
+            logging.warning("--dry-run is in effect, nothing will really be done")
+
+        # for each arch
+        packages = {}
+        for arch in common_constants.ARCHES:
+            logging.debug("reading existing packages for arch %s" % (arch))
+
+            # build package list
+            packages[arch] = package.read_packages(args.rel_area, arch)
+
+            # validate the package set
+            if not package.validate_packages(args, packages[arch]):
+                logging.error("existing %s package set has errors", arch)
+                return None
+
+        # read maintainer list
+        mlist = maintainers.Maintainer.read(args)
+
+        # make the list of all packages
+        all_packages = maintainers.Maintainer.all_packages(mlist)
+
+        # for each maintainer
+        for name in sorted(mlist.keys()):
+            m = mlist[name]
+
+            # also send a mail to each maintainer about their packages
+            with mail_logs(args.email, toaddrs=m.email, subject='%s for %s' % (subject, name), thresholdLevel=logging.INFO) as maint_email:
+
+                # for each arch and noarch
+                scan_result = {}
+                skip_maintainer = False
+                for arch in common_constants.ARCHES + ['noarch']:
+                    logging.debug("reading uploaded arch %s packages from maintainer %s" % (arch, name))
+
+                    # read uploads
+                    scan_result[arch] = uploads.scan(m, all_packages, arch, args)
+
+                    # remove triggers
+                    uploads.remove(args, scan_result[arch].remove_always)
+
+                    if scan_result[arch].error:
+                        logging.error("error while reading uploaded arch %s packages from maintainer %s" % (arch, name))
+                        skip_maintainer = True
+                        continue
+
+                    # queue for source package validator
+                    queue.add(args, scan_result[arch].to_relarea, os.path.join(m.homedir()))
+
+                # if there are no uploaded or removed packages for this
+                # maintainer, we don't have anything to do
+                if not any([scan_result[a].packages or scan_result[a].to_vault for a in scan_result]):
+                    logging.debug("nothing to do for maintainer %s" % (name))
+                    skip_maintainer = True
+
+                if skip_maintainer:
+                    continue
+
+                # for each arch
+                merged_packages = {}
+                valid = True
+                for arch in common_constants.ARCHES:
+                    logging.debug("merging %s package set with uploads from maintainer %s" % (arch, name))
+
+                    # merge package sets
+                    merged_packages[arch] = package.merge(packages[arch], scan_result[arch].packages, scan_result['noarch'].packages)
+                    if not merged_packages[arch]:
+                        valid = False
+                        break
+
+                    # remove files which are to be removed
+                    #
+                    # XXX: this doesn't properly account for removing setup.hint
+                    # files
+                    for p in scan_result[arch].to_vault:
+                        for f in scan_result[arch].to_vault[p]:
+                            package.delete(merged_packages[arch], p, f)
+
+                    # validate the package set
+                    logging.debug("validating merged %s package set for maintainer %s" % (arch, name))
+                    if not package.validate_packages(args, merged_packages[arch]):
+                        valid = False
+
+                if not valid:
+                    # discard move list and merged_packages
+                    logging.error("error while merging uploaded %s packages for %s" % (arch, name))
+                    continue
+
+                # for each arch and noarch
+                for arch in common_constants.ARCHES + ['noarch']:
+                    logging.debug("moving %s packages for maintainer %s" % (arch, name))
+
+                    # process the move lists
+                    uploads.move_to_vault(args, scan_result[arch].to_vault)
+                    uploads.remove(args, scan_result[arch].remove_success)
+                    uploads.move_to_relarea(m, args, scan_result[arch].to_relarea)
+
+                # for each arch
+                for arch in common_constants.ARCHES:
+                    # use merged package list
+                    packages[arch] = merged_packages[arch]
+                    logging.debug("added %d + %d packages from maintainer %s" % (len(scan_result[arch].packages), len(scan_result['noarch'].packages), name))
+
+    return packages
+
+
+#
+#
+#
+
+def do_main(args):
+    # read package set and process uploads
+    packages = process(args)
+
+    if not packages:
+        logging.error("not processing uploads or writing setup.ini")
+        return
+
+    # for each arch
+    for arch in common_constants.ARCHES:
+        # update packages listings
+        # XXX: perhaps we need a --[no]listing command line option to disable this from being run?
+        pkg2html.update_package_listings(args, packages[arch], arch)
+
+    # for each arch
+    for arch in common_constants.ARCHES:
+        logging.debug("writing setup.ini for arch %s" % (arch))
+
+        args.arch = arch
+        args.setup_version = setup_exe.extract_version(os.path.join(args.setupdir, 'setup-' + args.arch + '.exe'))
+        logging.debug("setup version is '%s'" % (args.setup_version))
+
+        basedir = os.path.join(args.rel_area, args.arch)
+        inifile = os.path.join(basedir, 'setup.ini')
+
+        # write setup.ini to a temporary file
+        with tempfile.NamedTemporaryFile(delete=False) as tmpfile:
+            args.inifile = tmpfile.name
+
+            changed = False
+
+            # write setup.ini
+            package.write_setup_ini(args, packages[arch], arch)
+
+            if not os.path.exists(inifile):
+                # if the setup.ini file doesn't exist yet
+                logging.warning('no existing %s' % (inifile))
+                changed = True
+            else:
+                # or, if it's changed in more than timestamp
+                status = os.system('/usr/bin/diff -I^setup-timestamp -w -B -q %s %s >/dev/null' % (inifile, tmpfile.name))
+                logging.debug('diff exit status %d' % (status))
+                if (status >> 8) == 1:
+                    changed = True
+
+            # then update setup.ini
+            if changed:
+                if args.dryrun:
+                    logging.warning("not moving %s to %s, due to --dry-run" % (tmpfile.name, inifile))
+                    os.remove(tmpfile.name)
+                else:
+                    # make a backup of the current setup.ini
+                    shutil.copy2(inifile, inifile + '.bak')
+
+                    # replace setup.ini
+                    logging.info("moving %s to %s" % (tmpfile.name, inifile))
+                    shutil.move(tmpfile.name, inifile)
+
+                    # compress and re-sign
+                    for ext in ['.ini', '.bz2', '.xz']:
+                        try:
+                            os.remove(os.path.join(basedir, 'setup' + ext + '.sig'))
+                        except FileNotFoundError:
+                            pass
+
+                        if ext == '.bz2':
+                            os.system('/usr/bin/bzip2 <%s >%s' % (inifile, os.path.splitext(inifile)[0] + ext))
+                        elif ext == '.xz':
+                            os.system('/usr/bin/xz -6e <%s >%s' % (inifile, os.path.splitext(inifile)[0] + ext))
+
+                        os.system('/usr/bin/gpg --batch --yes -b ' + os.path.join(basedir, 'setup' + ext))
+
+                    # arrange for checksums to be recomputed
+                    for sumfile in ['md5.sum', 'sha512.sum']:
+                        try:
+                            os.remove(os.path.join(basedir, sumfile))
+                        except FileNotFoundError:
+                            pass
+            else:
+                logging.debug("removing %s, unchanged %s" % (tmpfile.name, inifile))
+                os.remove(tmpfile.name)
+
+
+#
+# we only want to mail the logs if the email option was used
+# (otherwise use ExitStack() as a 'do nothing' context)
+#
+
+def mail_logs(enabled, toaddrs, subject, thresholdLevel, retainLevel=None):
+    if enabled:
+        return AbeyanceHandler(BufferingSMTPHandler(toaddrs, subject), thresholdLevel, retainLevel)
+
+    return ExitStack()
+
+
+#
+#
+#
+
+def main():
+    htdocs_default = os.path.join(common_constants.HTDOCS, 'packages')
+    homedir_default = common_constants.HOMEDIR
+    orphanmaint_default = common_constants.ORPHANMAINT
+    pkglist_default = common_constants.PKGMAINT
+    relarea_default = common_constants.FTP
+    setupdir_default = common_constants.HTDOCS
+    vault_default = common_constants.VAULT
+    logdir_default = '/sourceware/cygwin-staging/logs'
+    queuedir_default = '/sourceware/cygwin-staging/queue'
+
+    parser = argparse.ArgumentParser(description='Upset replacement')
+    parser.add_argument('--email', action='store', dest='email', nargs='?', const=common_constants.EMAILS, help='email output to maintainer and ADDRS (default: ' + common_constants.EMAILS + ')', metavar='ADDRS')
+    parser.add_argument('--force', action='store_true', help="overwrite existing files")
+    parser.add_argument('--homedir', action='store', metavar='DIR', help="maintainer home directory (default: " + homedir_default + ")", default=homedir_default)
+    parser.add_argument('--htdocs', action='store', metavar='DIR', help="htdocs output directory (default: " + htdocs_default + ")", default=htdocs_default)
+    parser.add_argument('--logdir', action='store', metavar='DIR', help="log directory (default: '" + logdir_default + "')", default=logdir_default)
+    parser.add_argument('--orphanmaint', action='store', metavar='NAMES', help="orphan package maintainers (default: '" + orphanmaint_default + "')", default=orphanmaint_default)
+    parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
+    parser.add_argument('--queuedir', action='store', metavar='DIR', help="queue directory (default: '" + queuedir_default + "')", default=queuedir_default)
+    parser.add_argument('--release', action='store', help='value for setup-release key (default: cygwin)', default='cygwin')
+    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    parser.add_argument('--setupdir', action='store', metavar='DIR', help="setup executable directory (default: " + setupdir_default + ")", default=setupdir_default)
+    parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun', help="don't do anything")
+    parser.add_argument('--vault', action='store', metavar='DIR', help="vault directory (default: " + vault_default + ")", default=vault_default, dest='vault')
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
+    (args) = parser.parse_args()
+
+    # set up logging to a file
+    try:
+        os.makedirs(args.logdir, exist_ok=True)
+    except FileExistsError:
+        pass
+    rfh = logging.handlers.RotatingFileHandler(os.path.join(args.logdir, 'calm.log'), backupCount=48)
+    rfh.doRollover()  # force a rotate on every run
+    rfh.setFormatter(logging.Formatter('%(asctime)s - %(levelname)-8s - %(message)s'))
+    rfh.setLevel(logging.DEBUG)
+    logging.getLogger().addHandler(rfh)
+
+    # setup logging to stdout, of WARNING messages or higher (INFO if verbose)
+    ch = logging.StreamHandler(sys.stdout)
+    ch.setFormatter(logging.Formatter(os.path.basename(sys.argv[0])+': %(message)s'))
+    if args.verbose:
+        ch.setLevel(logging.INFO)
+    else:
+        ch.setLevel(logging.WARNING)
+    logging.getLogger().addHandler(ch)
+
+    # change root logger level from the default of WARNING to NOTSET so it
+    # doesn't filter out any log messages due to level
+    logging.getLogger().setLevel(logging.NOTSET)
+
+    if args.email:
+        args.email = args.email.split(',')
+
+    do_main(args)
+
+
+#
+#
+#
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/calm/common_constants.py b/calm/common_constants.py
new file mode 100644
index 0000000..de4bf46
--- /dev/null
+++ b/calm/common_constants.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+import os
+
+#
+# project constants
+#
+# Generally these are defaults for values settable via command line options
+#
+
+# base directory for maintainer upload directories
+HOMEDIR = '/sourceware/cygwin-staging/home'
+
+# the 'release area', contains all released files, which are rsync'ed to mirrors
+FTP = '/var/ftp/pub/cygwin'
+
+# logs are emailed to these addresses if any errors occurred
+EMAILS = ','.join(map(lambda m: m + '@sourceware.org', ['corinna', 'yselkowitz', 'jturney']))
+
+# for testing purposes, every email we send is bcc'd to these addresses
+ALWAYS_BCC = ''
+
+# these maintainers can upload orphaned packages as well
+ORPHANMAINT = "Yaakov Selkowitz"
+
+# architectures we support
+ARCHES = ['x86', 'x86_64']
+
+# base directory for HTML output
+HTDOCS = '/www/sourceware/htdocs/cygwin/'
+
+# the list of packages with maintainers
+PKGMAINT = '/www/sourceware/htdocs/cygwin/cygwin-pkg-maint'
+
+# removed files archive directory
+VAULT = '/sourceware/snapshot-tmp/cygwin'
+
+# SMTP smarthost
+MAILHOST = 'localhost'
+
+# different values to be used when we are not running on sourceware.org, but my
+# test system...
+if os.uname()[1] == 'tambora':
+    FTP = '/var/ftp/pub/cygwin-test'
+    EMAILS = 'jon.turney@dronecode.org.uk'
+    MAILHOST = 'allegra'
diff --git a/calm/compare-arches b/calm/compare-arches
new file mode 100755
index 0000000..d2d6594
--- /dev/null
+++ b/calm/compare-arches
@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# compare-arch - compare package sets between architectures
+#
+
+import argparse
+import logging
+import os
+import sys
+
+import common_constants
+import maintainers
+import package
+import uploads
+
+
+#
+#
+#
+
+def main(args):
+    packages = {}
+    pset = {}
+    union = set()
+
+    for arch in common_constants.ARCHES:
+        # build package list
+        packages[arch] = package.read_packages(args.rel_area, arch)
+
+        # make a set of the package list
+        pset[arch] = frozenset(packages[arch].keys())
+
+        # make the union of all the package lists
+        union = union.union(pset[arch])
+
+        # XXX: could filter out obsolete here
+
+    for p in sorted(union):
+        exists = {}
+        obs = {}
+
+        for arch in common_constants.ARCHES:
+            exists[arch] = False
+            obs[arch] = True
+            if p in packages[arch]:
+                exists[arch] = True
+                if '_obsolete' in packages[arch][p].hints.get('category', ''):
+                    obs[arch] = True
+                else:
+                    obs[arch] = False
+
+        if p.startswith('cygwin32') or p.startswith('cygwin64') or p.endswith('-debuginfo'):
+            continue
+
+        # packages which exist in all arches
+        if all(exists.values()):
+
+            # report packages which are obsolete only in some arch
+            if any(obs.values()) and not all(obs.values()):
+                print("%s is in all arches, but obsolete only in %s" % (p, [a for a in obs if obs[a]]))
+
+            continue
+
+        # ignore packages which are obsolete in all the arches they exist in
+        if all(obs.values()):
+            continue
+
+
+#        print(p, exists, obs)
+        print("%s is only in arch %s" % (p, [a for a in exists if exists[a]]))
+
+    # are there any packages which have a maintainer, but don't exist?
+    mlist = maintainers.Maintainer.read(args)
+    all_packages = maintainers.Maintainer.all_packages(mlist)
+
+    for p in sorted(all_packages):
+        if p not in union:
+            logging.warning("package '%s' has a maintainer, but doesn't exist in any architecture" % (p))
+
+    # find the set of packages which aren't in an arch
+#    for arch in common_constants.ARCHES:
+#        diff = union.difference(pset[arch])
+#        print("only in %s" % arch)
+#        print(sorted(diff))
+
+
+#
+#
+#
+
+if __name__ == "__main__":
+    homedir_default = common_constants.HOMEDIR
+    pkglist_default = common_constants.PKGMAINT
+    relarea_default = common_constants.FTP
+
+    parser = argparse.ArgumentParser(description='Compare arch package sets')
+    parser.add_argument('--homedir', action='store', metavar='DIR', help="maintainer home directory (default: " + homedir_default + ")", default=homedir_default)
+    parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
+    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
+    (args) = parser.parse_args()
+
+    if args.verbose:
+        logging.getLogger().setLevel(logging.INFO)
+
+    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
+
+    main(args)
diff --git a/calm/fix-missing-cygwin-dep.py b/calm/fix-missing-cygwin-dep.py
new file mode 100755
index 0000000..2a9b3ab
--- /dev/null
+++ b/calm/fix-missing-cygwin-dep.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2016 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.
+#
+
+#
+# Historically, cygwin was omitted from requires: and then upset added it back
+# using the autodep mechanism
+#
+# Now we want to remove that complexity and treat it like a normal dependency,
+# so this script fixes up setup.hints, adding cygwin to requires: where it
+# should be
+#
+
+import argparse
+import logging
+import os
+import re
+import sys
+import tarfile
+
+import common_constants
+import package
+
+
+#
+#
+#
+def main(args):
+    # build package list
+    packages = package.read_packages(args.rel_area, args.arch)
+
+    for pn, po in packages.items():
+        # package is source-only
+        if 'skip' in po.hints:
+            logging.info("%s is source-only" % (pn))
+            continue
+
+        # package requires: contains 'cygwin' already
+        #
+        # really this should use a whitespace boundary, not word boundary to
+        # avoid matching cygwin-debug etc., but we just happen to know that only
+        # debuginfo packages depend on cygwin-debuginfo which can safely be
+        # skipped as they will never depend on cygwin
+        requires = po.hints.get('requires', '')
+        if re.search(r'\bcygwin\b', requires):
+            logging.info("%s already has cygwin in requires" % (pn))
+            continue
+
+        # install tarfiles are all empty (usually because package is obsolete)
+        if all([t.is_empty for t in po.tars.values()]):
+            logging.info("%s has empty install tarfiles" % (pn))
+            continue
+
+        # search each install tarfile for executable files
+        #
+        # (any .exe or .dll file might have a dependency on cygwin1.dll, so for
+        # simplicity we will assume that it does)
+        amend = False
+        for t in po.tars:
+            logging.info("%s tarfile %s" % (pn, t))
+
+            if re.search(r'-src\.tar', t):
+                continue
+
+            if po.tars[t].is_empty:
+                continue
+
+            with tarfile.open(os.path.join(args.rel_area, args.arch, po.path, t)) as a:
+                if any(map(lambda f: re.search(r'^(bin|sbin|usr/bin|usr/lib|usr/libexec|usr/sbin)/.*\.(exe|dll|so|cmxs)$', f), a.getnames())):
+                    logging.info("%s: matched in %s" % (pn, t))
+                    amend = True
+                    break
+
+        if not amend:
+            continue
+
+        # adjust requires:, adding 'cygwin' to the end
+        logging.warning("Adding 'cygwin' to requires: in setup.hint for package '%s'" % (pn))
+        if len(requires) > 0:
+            requires = requires + ' '
+        po.hints['requires'] = requires + 'cygwin'
+
+        # write the modified setup.hint file
+        if 'parse-warnings' in po.hints:
+            del po.hints['parse-warnings']
+        if 'parse-errors' in po.hints:
+            del po.hints['parse-errors']
+
+        ofn = os.path.join(args.rel_area, args.arch, po.path, 'setup.hint')
+        fn = os.path.join(args.rel_area, args.arch, po.path, 'setup.hint.modified')
+        with open(fn, 'w') as f:
+            for k, v in po.hints.items():
+                print("%s: %s" % (k, v), file=f)
+
+        # show any 'unexpected' changes in the setup.hint
+        os.system("diff -u -I 'requires:' --ignore-blank-lines --ignore-space-change %s %s" % (ofn, fn))
+
+        # replace the setup.hint file
+        # (written this way so it doesn't spoil a hardlinked backup of the releasearea)
+        os.rename(fn, ofn)
+
+#
+#
+#
+if __name__ == "__main__":
+    relarea_default = common_constants.FTP
+
+    parser = argparse.ArgumentParser(description='requires fixer')
+    parser.add_argument('--arch', action='store', required=True, choices=common_constants.ARCHES)
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output', default=0)
+    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    (args) = parser.parse_args()
+
+    if args.verbose:
+        logging.getLogger().setLevel(logging.INFO)
+
+    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
+
+    main(args)
diff --git a/calm/hint.py b/calm/hint.py
new file mode 100755
index 0000000..2579fad
--- /dev/null
+++ b/calm/hint.py
@@ -0,0 +1,301 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# parser for setup.hint files
+#
+
+from collections import OrderedDict
+import re
+import argparse
+
+# keys which always have a value which may be multiline
+multilinevalkeys = ['ldesc', 'message']
+# keys which always have a value
+valkeys = ['curr', 'prev', 'test', 'category', 'external-source', 'sdesc']
+# keys which may have an empty value
+optvalkeys = ['requires']
+# keys which must have an empty value
+novalkeys = ['skip']
+
+hintkeys = multilinevalkeys + valkeys + optvalkeys + novalkeys
+
+# valid categories
+categories = ['accessibility',
+              'admin',
+              'archive',
+              'audio',
+              'base',
+              'comm',
+              'database',
+              'debug',
+              'devel',
+              'doc',
+              'editors',
+              'games',
+              'gnome',
+              'graphics',
+              'interpreters',
+              'kde',
+              'libs',
+              'lua',
+              'lxde',
+              'mail',
+              'mate',
+              'math',
+              'mingw',
+              'net',
+              'ocaml',
+              'office',
+              'perl',
+              'php',
+              'publishing',
+              'python',
+              'ruby',
+              'scheme',
+              'science',
+              'security',
+              'shells',
+              'sugar',
+              'system',
+              'tcl',
+              'text',
+              'utils',
+              'video',
+              'web',
+              'x11',
+              'xfce',
+              '_obsolete',
+              '_postinstalllast']
+
+
+#
+# A simple lexer to handle multi-line quoted values
+#
+# Historically, a multi-line quote is terminated only by a quote at the end of
+# the line, and embedded quotes are transformed to single quotes.  So there is
+# no escaping of embedded quotes, and no way to represent one.
+#
+# XXX: Fix the few packages which use embedded quotes, then we can switch this
+# to a simpler character by character lexer, which just reads until next
+# newline, and next quote when we encounter a quote.
+#
+def item_lexer(c):
+    i = -1
+    lines = c.splitlines()
+
+    while i < len(lines)-1:
+        i = i + 1
+        o = lines[i]
+
+        # discard lines starting with '#'
+        if o.startswith('#'):
+            continue
+
+        o = o.strip()
+
+        # discard empty lines
+        if not o:
+            continue
+
+        # line containing quoted text
+        if o.count('"') == 2:
+            yield (i, o, None)
+            continue
+
+        # if the line contains an opening quote
+        if '"' in o:
+            # continue reading lines till closing quote
+            while i < len(lines)-1:
+                i = i + 1
+                # multi-line quoted text preserves any leading space used for
+                # indentation, but removes any trailing space
+                o = o + '\n' + lines[i].rstrip()
+                # multi-line quoted text is only terminated by a quote at the
+                # end of the line
+                if o.endswith('"'):
+                    yield (i, o, None)
+                    break
+            else:
+                yield (i, o, "unterminated quote")
+
+            continue
+
+        # an unquoted line
+        yield (i, o, None)
+
+
+def setup_hint_parse(fn):
+    hints = OrderedDict()
+    errors = []
+    warnings = []
+
+    with open(fn, 'rb') as f:
+        c = f.read()
+
+        # validate that setup.hint is UTF-8 encoded
+        try:
+            c = c.decode('utf-8')
+
+            # parse as key:value items
+            for (i, item, error) in item_lexer(c):
+
+                if (error):
+                    errors.append('%s at line %d' % (error, i))
+
+                if (item.count('"') != 0) and (item.count('"') != 2):
+                    errors.append('embedded quote at line %d' % (i))
+
+                # key:value
+                match = re.match(r'^([^:\s]+):\s*(.*)$', item, re.DOTALL)
+                if match:
+                    key = match.group(1)
+                    value = match.group(2)
+
+                    if key not in hintkeys:
+                        errors.append('unknown setup key %s at line %d' % (key, i))
+                        continue
+
+                    # check if the key occurs more than once
+                    if key in hints:
+                        errors.append('duplicate key %s' % (key))
+
+                    # check the value meets any key-specific constraints
+                    if (key in valkeys) and (len(value) == 0):
+                        errors.append('%s has empty value' % (key))
+
+                    if (key in novalkeys) and (len(value) != 0):
+                        errors.append("%s has non-empty value '%s'" % (key, value))
+
+                    # validate all categories are in the category list (case-insensitively)
+                    if key == 'category':
+                        for c in value.split():
+                            if c.lower() not in categories:
+                                errors.append("unknown category '%s'" % (c))
+
+                    # verify that value for ldesc or sdesc is quoted
+                    # (genini forces this)
+                    if key in ['sdesc', 'ldesc']:
+                        if not (value.startswith('"') and value.endswith('"')):
+                            errors.append("%s value '%s' should be quoted" % (key, value))
+
+                    # if sdesc ends with a '.', warn and fix it
+                    if key == 'sdesc':
+                        if re.search(r'\."$', value):
+                            warnings.append("sdesc ends with '.'")
+                            value = re.sub(r'\."$', '"', value)
+
+                    # warn if sdesc contains '  '
+                    if key == 'sdesc':
+                        if '  ' in value:
+                            warnings.append("sdesc contains '  '")
+
+                    # only 'ldesc' and 'message' are allowed a multi-line value
+                    if (key not in multilinevalkeys) and (len(value.splitlines()) > 1):
+                        errors.append("key %s has multi-line value" % (key))
+
+                    # message must have an id and some text
+                    if key == 'message':
+                        if not re.match(r'(\S+)\s+(\S.*)', value):
+                            errors.append('message value must have id and text')
+
+                    # warn if value starts with a quote followed by whitespace
+                    if re.match(r'^"[ \t]+', value):
+                        warnings.append('value for key %s starts with quoted whitespace' % (key))
+
+                    # store the key:value
+                    hints[key] = value
+                else:
+                    errors.append("unknown setup construct '%s' at line %d" % (item, i))
+
+            # if 'skip' isn't present, 'category' and 'sdesc' must be
+            # XXX: genini also requires 'requires' but that seems wrong
+            if 'skip' not in hints:
+                mandatory = ['category', 'sdesc']
+                for k in mandatory:
+                    if k not in hints:
+                        errors.append("required key '%s' missing" % (k))
+
+            # warn if ldesc and sdesc seem transposed
+            #
+            # (Unfortunately we can't be totally strict about this, as some
+            # packages like to repeat the basic description in ldesc in every
+            # subpackage, but add to sdesc to distinguish the subpackages)
+            if 'ldesc' in hints:
+                if len(hints['sdesc']) > 2*len(hints['ldesc']):
+                    warnings.append('sdesc is much longer than ldesc')
+
+            # sort requires: as differences in ordering are uninteresting
+            if 'requires' in hints:
+                hints['requires'] = ' '.join(sorted(hints['requires'].split()))
+
+        except UnicodeDecodeError:
+            errors.append('invalid UTF-8')
+
+    if errors:
+        hints['parse-errors'] = errors
+
+    if warnings:
+        hints['parse-warnings'] = warnings
+
+    return hints
+
+
+#
+#
+#
+
+def main(args):
+    status = 0
+
+    for fn in args.files:
+        hints = setup_hint_parse(fn)
+
+        if args.verbose > 1:
+            print(hints)
+
+        if 'parse-warnings' in hints:
+            if args.verbose > 0:
+                for l in hints['parse-warnings']:
+                    print('%s: %s' % (fn, l))
+            status = 1
+
+        if 'parse-errors' in hints:
+            for l in hints['parse-errors']:
+                print('%s: %s' % (fn, l))
+            status = 255
+
+    return status
+
+#
+#
+#
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description='setup.hint validator')
+    parser.add_argument('files', nargs='*', metavar='filename', help='list of files')
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output', default=0)
+
+    (args) = parser.parse_args()
+
+    exit(main(args))
diff --git a/calm/maintainers.py b/calm/maintainers.py
new file mode 100644
index 0000000..3d6d9c1
--- /dev/null
+++ b/calm/maintainers.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# utilities for working with a maintainer list
+#
+
+#
+# things we know about a maintainer:
+#
+# - their home directory
+# - the list of packages they maintain (given by cygwin-pkg-list)
+# - an email address (in HOME/!email (or !mail), as we don't want to publish
+#   it, and want to allow the maintainer to change it)
+#
+
+import itertools
+import logging
+import os
+import re
+import sys
+
+
+class Maintainer(object):
+    _homedirs = ''
+
+    def __init__(self, name, email=None, pkgs=None):
+        if email is None:
+            email = []
+        if pkgs is None:
+            pkgs = []
+
+        self.name = name
+        self.email = email
+        self.pkgs = pkgs
+
+    def __repr__(self):
+        return "maintainers.Maintainer('%s', %s, %s)" % (self.name, self.email, self.pkgs)
+
+    def homedir(self):
+        return os.path.join(Maintainer._homedirs, self.name)
+
+    @staticmethod
+    def _find(mlist, name):
+        mlist.setdefault(name, Maintainer(name))
+        return mlist[name]
+
+    # add maintainers which have existing directories
+    @classmethod
+    def add_directories(self, mlist, homedirs):
+        self._homedirs = homedirs
+
+        for n in os.listdir(homedirs):
+            if not os.path.isdir(os.path.join(homedirs, n)):
+                continue
+
+            m = Maintainer._find(mlist, n)
+
+            for e in ['!email', '!mail']:
+                email = os.path.join(homedirs, m.name, e)
+                if os.path.isfile(email):
+                    with open(email) as f:
+                        for l in f:
+                            # one address per line, ignore blank and comment lines
+                            if l.startswith('#'):
+                                continue
+                            l = l.strip()
+                            if l:
+                                m.email.append(l)
+
+        return mlist
+
+    # add maintainers from the package maintainers list, with the packages they
+    # maintain
+    @staticmethod
+    def add_packages(mlist,  pkglist, orphanMaint=None):
+        with open(pkglist) as f:
+            for (i, l) in enumerate(f):
+                l = l.rstrip()
+
+                # match lines of the form '<package> <maintainer(s)>'
+                match = re.match(r'^(\S+)\s+(.+)$', l)
+                if match:
+                    pkg = match.group(1)
+                    m = match.group(2)
+
+                    # if maintainer starts with a word in all caps, just use that
+                    (m, n) = re.subn(r'^([A-Z]+)\b.*$', r'\1', m)
+                    if n > 0:
+                        # ignore packages marked as 'OBSOLETE'
+                        if m == 'OBSOLETE':
+                            continue
+
+                        # orphaned packages get the default maintainer if we have
+                        # one, otherwise are assigned to 'ORPHANED'
+                        elif m == 'ORPHANED':
+                            if orphanMaint is not None:
+                                m = orphanMaint
+
+                        else:
+                            logging.error("unknown package status '%s' in line %s:%d: '%s'" % (m, pkglist, i, l))
+                            continue
+
+                    # joint maintainers are separated by '/'
+                    for name in m.split('/'):
+                        m = Maintainer._find(mlist, name)
+                        m.pkgs.append(pkg)
+
+                else:
+                    logging.error("unrecognized line in %s:%d: '%s'" % (pkglist, i, l))
+
+        return mlist
+
+    # create maintainer list
+    @staticmethod
+    def read(args):
+        mlist = {}
+        mlist = Maintainer.add_directories(mlist, args.homedir)
+        mlist = Maintainer.add_packages(mlist, args.pkglist, getattr(args, 'orphanmaint', None))
+
+        return mlist
+
+    # a list of all packages
+    @staticmethod
+    def all_packages(mlist):
+        return list(itertools.chain.from_iterable(mlist[m].pkgs for m in mlist))
+
+#
+# We must be able to use pathnames which contain any character in the maintainer
+# name, read from the maintainer list file.
+#
+# So, this test is somewhat sloppy.  In theory the filesystem encoding might be
+# some encoding which can represent the subset of the io encoding that
+# maintainer names actually use.  In practice, use a utf-8 locale.
+#
+
+if sys.getfilesystemencoding() != sys.getdefaultencoding():
+    print("IO encoding is '%s', filesystem encoding is '%s'" % (sys.getdefaultencoding(), sys.getfilesystemencoding()), file=sys.stderr)
+    print('It is required that IO encoded strings are convertible to the filesystem encoding', file=sys.stderr)
+    print("Please set the locale", file=sys.stderr)
+    exit(1)
diff --git a/calm/mkmaintdir b/calm/mkmaintdir
new file mode 100755
index 0000000..cadeaa6
--- /dev/null
+++ b/calm/mkmaintdir
@@ -0,0 +1,140 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# create maintainer upload directories
+#
+# a re-implementation of the mkpkgdir perl script in python
+# intended to be run from crontab every 5 minutes
+#
+# - Read existing maintainer directories, build a list of maintainer
+# - Read cygwin-pkg-maint, add to list of maintainers, and build a list of
+#   packages for each maintainer
+# - Assign orpahaned packages to the project lead(s)
+# - For each maintainer, create a home directory, set permissions, and write a
+#   !packages file
+# - Report if the maintainer has no packages and mark with !defunct
+#
+
+import argparse
+import grp
+import logging
+import os
+import pwd
+import re
+import sys
+
+import common_constants
+import maintainers
+
+#
+#
+#
+
+cygwin_uid = pwd.getpwnam('cygwin').pw_uid
+cygstage_gid = grp.getgrnam('cygstage').gr_gid
+
+# different values to be used when we are not running on sourceware.org, but my
+# test system...
+if os.uname()[1] == 'tambora':
+    cygwin_uid = pwd.getpwnam('jon').pw_uid
+    cygstage_gid = grp.getgrnam('None').gr_gid
+
+
+#
+#
+#
+
+def main(args):
+    # clear the umask in case it is set
+    os.umask(0)
+
+    # create maintainer list
+    mlist = {}
+    mlist = maintainers.Maintainer.add_directories(mlist, args.homedir)
+    mlist = maintainers.Maintainer.add_packages(mlist, args.pkglist, args.orphanmaint)
+
+    # create or suggest removal for each maintainer directory
+    for name in sorted(mlist.keys()):
+        m = mlist[name]
+        dirpath = m.homedir()
+
+        # if the path exists, but isn't a directory
+        if os.path.exists(dirpath) and not os.path.isdir(dirpath):
+            logging.error("%s exists and isn't a directory!" % dirpath)
+            continue
+
+        # ensure the upload directory exists, with appropriate permissions, owner and contents
+        logging.info('processing %s' % dirpath)
+        if not args.dryrun:
+            os.makedirs(dirpath, exist_ok=True)
+            os.chown(dirpath, cygwin_uid, cygstage_gid)
+            os.chmod(dirpath, 0o2775)
+            # write !packages file (we don't use this for anything anymore, but
+            # keep it around for information)
+            with open(os.path.join(dirpath, '!packages'), 'w') as fd:
+                os.fchown(fd.fileno(), cygwin_uid, cygstage_gid)
+                print('|'.join([re.escape(p) for p in m.pkgs]), file=fd)
+            # and create arch subdirectories, with appropriate owner
+            for subdir in common_constants.ARCHES:
+                os.makedirs(os.path.join(dirpath, subdir, 'release'), exist_ok=True)
+                os.chown(os.path.join(dirpath, subdir, 'release'), cygwin_uid, cygstage_gid)
+
+        # create/remove !defunct as appropriate
+        defunct = os.path.join(dirpath, '!defunct')
+        if len(m.pkgs) == 0:
+            # if they have no packages, suggest removing their upload directory (once)
+            if not os.path.exists(defunct):
+                logging.warning("defunct maintainer %s, consider removing their directory?" % name)
+                if not args.dryrun:
+                    open(defunct, 'w').close()
+        else:
+            # remove defunct marker if no longer defunct
+            if os.path.exists(defunct):
+                logging.info("maintainer %s no longer defunct" % name)
+                if not args.dryrun:
+                    os.unlink(defunct)
+
+#
+#
+#
+
+if __name__ == "__main__":
+    homedir_default = common_constants.HOMEDIR
+    orphanmaint_default = common_constants.ORPHANMAINT
+    pkglist_default = common_constants.PKGMAINT
+
+    parser = argparse.ArgumentParser(description='Create maintainer upload directories')
+    parser.add_argument('--homedir', action='store', metavar='DIR', help="maintainer home directory (default: " + homedir_default + ")", default=homedir_default)
+    parser.add_argument('--orphanmaint', action='store', metavar='NAMES', help="orphan package maintainers (default: '" + orphanmaint_default + "')", default=orphanmaint_default)
+    parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
+    parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun', help="don't do anything")
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
+    (args) = parser.parse_args()
+
+    if args.verbose:
+        logging.getLogger().setLevel(logging.INFO)
+
+    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
+
+    main(args)
diff --git a/calm/mksetupini.py b/calm/mksetupini.py
new file mode 100755
index 0000000..6add377
--- /dev/null
+++ b/calm/mksetupini.py
@@ -0,0 +1,126 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# mksetupini
+#
+# Make a setup.ini file from a collection of tarfiles and setup.hints
+# (this is intended to be a replacement for genini)
+#
+
+import argparse
+import logging
+import os
+import sys
+
+from . import common_constants
+from . import hint
+from . import package
+
+try:
+    import spelling
+except ImportError:
+    pass
+
+
+#
+#
+#
+def do_main(args):
+    # build package list
+    packages = package.read_packages(args.rel_area, args.arch)
+
+    # spellcheck text hints
+    if args.spell:
+        if spelling:
+            spelling.spellcheck_hints(args, packages)
+        else:
+            logging.error("spell-checking support not available")
+
+    # validate the package set
+    if not package.validate_packages(args, packages):
+        logging.error("package set has errors, not writing setup.ini")
+        return
+
+    # write setup.ini
+    package.write_setup_ini(args, packages, args.arch)
+
+    if args.stats:
+        stats(packages)
+
+
+#
+#
+#
+
+def stats(packages):
+    # make a histogram of categories
+    histogram = {}
+
+    for c in hint.categories:
+        histogram[c.lower()] = 0
+
+    for p in packages.values():
+        if 'category' in p.hints:
+            for c in p.hints['category'].split():
+                histogram.setdefault(c.lower(), 0)
+                histogram[c.lower()] += 1
+
+    for c in sorted(histogram, key=histogram.get, reverse=True):
+        print('%16s: %4d' % (c, histogram[c]))
+
+
+#
+#
+#
+def main():
+    pkglist_default = common_constants.PKGMAINT
+    relarea_default = common_constants.FTP
+
+    parser = argparse.ArgumentParser(description='Make setup.ini')
+    parser.add_argument('--arch', action='store', required=True, choices=common_constants.ARCHES)
+    parser.add_argument('--inifile', '-u', action='store', help='output filename', required=True)
+    parser.add_argument('--okmissing', action='append', help='missing things are ok', choices=['required-package'])
+    parser.add_argument('--pkglist', action='store', nargs='?', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", const=pkglist_default)
+    parser.add_argument('--release', action='store', help='value for setup-release key (default: cygwin)', default='cygwin')
+    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    parser.add_argument('--spell', action='store_true', help='spellcheck text hints')
+    parser.add_argument('--stats', action='store_true', help='show additional package statistics')
+    parser.add_argument('--setup-version', action='store', metavar='VERSION', help='value for setup-version key')
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
+    (args) = parser.parse_args()
+
+    if args.verbose:
+        logging.getLogger().setLevel(logging.INFO)
+
+    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
+
+    do_main(args)
+
+
+#
+#
+#
+
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/calm/package.py b/calm/package.py
new file mode 100755
index 0000000..bf3d680
--- /dev/null
+++ b/calm/package.py
@@ -0,0 +1,681 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# utilities for working with a package database
+#
+
+from collections import defaultdict
+import copy
+import difflib
+import hashlib
+import logging
+import os
+import pprint
+import re
+import tarfile
+import textwrap
+import time
+
+from .version import SetupVersion
+from . import common_constants
+from . import hint
+from . import maintainers
+from . import past_mistakes
+
+
+# information we keep about a package
+class Package(object):
+    def __init__(self):
+        self.path = ''  # path to package, relative to release area
+        self.tars = {}
+        self.hints = {}
+
+    def __repr__(self):
+        return "Package('%s', %s, %s)" % (self.path, pprint.pformat(self.tars),
+                                          pprint.pformat(self.hints))
+
+
+# information we keep about a tar file
+class Tar(object):
+    def __init__(self):
+        self.sha512 = ''
+        self.size = 0
+        self.is_empty = False
+        self.is_used = False
+
+    def __repr__(self):
+        return "Tar('%s', %d, %s)" % (self.sha512, self.size, self.is_empty)
+
+
+#
+# read a packages from a directory hierarchy
+#
+def read_packages(rel_area, arch):
+    packages = defaultdict(Package)
+
+    # both noarch/ and <arch>/ directories are considered
+    for root in ['noarch', arch]:
+        releasedir = os.path.join(rel_area, root)
+        logging.debug('reading packages from %s' % releasedir)
+
+        for (dirpath, subdirs, files) in os.walk(releasedir):
+            read_package(packages, rel_area, dirpath, files)
+
+        logging.debug("%d packages read" % len(packages))
+
+    return packages
+
+
+# helper function to compute sha512 for a particular file
+# (block_size should be some multiple of sha512 block size which can be efficiently read)
+def sha512_file(fn, block_size=256*128):
+    sha512 = hashlib.sha512()
+
+    with open(fn, 'rb') as f:
+        for chunk in iter(lambda: f.read(block_size), b''):
+            sha512.update(chunk)
+
+    return sha512.hexdigest()
+
+
+#
+# read a single package
+#
+def read_package(packages, basedir, dirpath, files, strict=False):
+    strict_lvl = logging.ERROR if strict else logging.WARNING
+    relpath = os.path.relpath(dirpath, basedir)
+    warnings = False
+
+    if 'setup.hint' in files:
+        files.remove('setup.hint')
+        # the package name is always the directory name
+        p = os.path.basename(dirpath)
+
+        if not re.match(r'^[\w\-._+]*$', p):
+            logging.error("package '%s' name contains illegal characters" % p)
+            return True
+
+        # check for duplicate package names at different paths
+        if p in packages:
+            logging.error("duplicate package name at paths %s and %s" %
+                          (dirpath, packages[p].path))
+            return True
+
+        # read setup.hints
+        hints = hint.setup_hint_parse(os.path.join(dirpath, 'setup.hint'))
+        if 'parse-errors' in hints:
+            for l in hints['parse-errors']:
+                logging.error("package '%s': %s" % (p, l))
+            logging.error("errors while parsing hints for package '%s'" % p)
+            return True
+        if 'parse-warnings' in hints:
+            for l in hints['parse-warnings']:
+                logging.info("package '%s': %s" % (p, l))
+
+        # read sha512.sum
+        sha512 = {}
+        if 'sha512.sum' not in files:
+            logging.debug("no sha512.sum for package '%s'" % p)
+        else:
+            files.remove('sha512.sum')
+
+            with open(os.path.join(dirpath, 'sha512.sum')) as fo:
+                for l in fo:
+                    match = re.match(r'^(\S+)\s+(?:\*|)(\S+)$', l)
+                    if match:
+                        sha512[match.group(2)] = match.group(1)
+                    else:
+                        logging.warning("bad line '%s' in sha512.sum for package '%s'" % (l, p))
+
+        # discard obsolete md5.sum
+        if 'md5.sum' in files:
+            files.remove('md5.sum')
+
+        # collect the attributes for each tar file
+        tars = {}
+
+        for f in list(filter(lambda f: re.match(r'^' + re.escape(p) + r'.*\.tar.*$', f), files)):
+            files.remove(f)
+
+            # warn if tar filename doesn't follow P-V-R naming convention
+            #
+            # P must match the package name, V can contain anything, R must
+            # start with a number
+            match = re.match(r'^' + re.escape(p) + '-(.+)-(\d[0-9a-zA-Z.]*)(-src|)\.tar\.(bz2|gz|lzma|xz)$', f)
+            if not match:
+                logging.log(strict_lvl, "tar file '%s' in package '%s' doesn't follow naming convention" % (f, p))
+                warnings = True
+            else:
+                # historically, V can contain a '-' (since we can use the fact
+                # we already know P to split unambiguously), but this is a bad
+                # idea.
+                if '-' in match.group(1):
+                    lvl = logging.WARNING if p not in past_mistakes.hyphen_in_version else logging.INFO
+                    logging.log(lvl, "tar file '%s' in package '%s' contains '-' in version" % (f, p))
+
+                if not match.group(1)[0].isdigit():
+                    logging.warning("tar file '%s' in package '%s' has a version which doesn't start with a digit" % (f, p))
+
+            tars[f] = Tar()
+            tars[f].size = os.path.getsize(os.path.join(dirpath, f))
+            tars[f].is_empty = tarfile_is_empty(os.path.join(dirpath, f))
+
+            if f in sha512:
+                tars[f].sha512 = sha512[f]
+            else:
+                tars[f].sha512 = sha512_file(os.path.join(dirpath, f))
+                logging.debug("no sha512.sum line for file %s in package '%s', computed sha512 hash is %s" % (f, p, tars[f].sha512))
+
+        # ignore dotfiles
+        for f in files:
+            if f.startswith('.'):
+                files.remove(f)
+
+        # warn about unexpected files, including tarfiles which don't match the
+        # package name
+        if files:
+            logging.log(strict_lvl, "unexpected files in %s: %s" % (p, ', '.join(files)))
+            warnings = True
+
+        packages[p].hints = hints
+        packages[p].tars = tars
+        packages[p].path = relpath
+
+        #
+        # now we have read the package, fix some common defects in the hints
+        #
+
+        # note if the package is self-source
+        # XXX: this should really be defined as a setup.hint key
+        if p in past_mistakes.self_source:
+            packages[p].hints['self-source'] = ''
+
+        # don't allow a redundant 'package:' or 'package - ' at start of sdesc
+        #
+        # match case-insensitively, and use a base package name (trim off any
+        # leading 'lib' from package name, remove any soversion or 'devel'
+        # suffix)
+        #
+        if 'sdesc' in hints:
+            colon = re.match(r'^"(.*?)(\s*:|\s+-)', hints['sdesc'])
+            if colon:
+                package_basename = re.sub(r'^lib(.*?)(|-devel|\d*)$', r'\1', p)
+                if package_basename.upper().startswith(colon.group(1).upper()):
+                    logging.log(strict_lvl, "package '%s' sdesc starts with '%s'; this is redundant as the UI will show both the package name and sdesc" % (p, ''.join(colon.group(1, 2))))
+                    warnings = True
+
+    elif (len(files) > 0) and (relpath.count(os.path.sep) > 1):
+        logging.warning("no setup.hint in %s but has files: %s" % (dirpath, ', '.join(files)))
+
+    if strict:
+        return warnings
+
+    return False
+
+
+#
+# utility to determine if a tar file is empty
+#
+def tarfile_is_empty(tf):
+    # sometimes compressed empty files are used rather than a compressed empty
+    # tar archive
+    if os.path.getsize(tf) <= 32:
+        return True
+
+    # parsing the tar archive just to determine if it contains at least one
+    # archive member is relatively expensive, so we just assume it contains
+    # something if it's over a certain size threshold
+    if os.path.getsize(tf) > 1024:
+        return False
+
+    # if it's really a tar file, does it contain zero files?
+    with tarfile.open(tf) as a:
+        if any(a) == 0:
+            return True
+
+    return False
+
+
+# a sorting which forces packages which begin with '!' to be sorted first,
+# packages which begin with '_" to be sorted last, and others to be sorted
+# case-insensitively
+def sort_key(k):
+    k = k.lower()
+    if k[0] == '!':
+        k = chr(0) + k
+    elif k[0] == '_':
+        k = chr(255) + k
+    return k
+
+
+#
+# validate the package database
+#
+def validate_packages(args, packages):
+    error = False
+
+    for p in sorted(packages.keys()):
+        logging.debug("validating package '%s'" % (p))
+
+        if 'required-package' not in getattr(args, 'okmissing', []):
+            # all packages listed in requires must exist
+            if 'requires' in packages[p].hints:
+                for r in packages[p].hints['requires'].split():
+                    if r not in packages:
+                        logging.error("package '%s' requires nonexistent package '%s'" % (p, r))
+                        error = True
+
+                        # a package is should not appear in it's own requires
+                        if r == p:
+                            lvl = logging.WARNING if p not in past_mistakes.self_requires else logging.INFO
+                            logging.log(lvl, "package '%s' requires itself" % (p))
+
+        # if external-source is used, the package must exist
+        if 'external-source' in packages[p].hints:
+            e = packages[p].hints['external-source']
+            if e not in packages:
+                logging.error("package '%s' refers to nonexistent external-source '%s'" % (p, e))
+                error = True
+
+        packages[p].vermap = defaultdict(defaultdict)
+        is_empty = {}
+        has_install = False
+
+        for t in packages[p].tars:
+            # categorize each tarfile as either 'source' or 'install'
+            if re.search(r'-src\.tar', t):
+                category = 'source'
+            else:
+                category = 'install'
+                has_install = True
+                is_empty[t] = packages[p].tars[t].is_empty
+
+            # extract just the version part from tar filename
+            v = re.sub(r'^' + re.escape(p) + '-', '', t)
+            v = re.sub(r'(-src|)\.tar\.(bz2|gz|lzma|xz)$', '', v)
+
+            # for each version, a package can contain at most one source tar
+            # file and at most one install tar file.  warn if we have too many
+            # (for e.g. both a .xz and .bz2 install tar file)
+            if category in packages[p].vermap[v]:
+                logging.error("package '%s' has more than one %s tar file for version '%s'" % (p, category, v))
+                error = True
+
+            # store tarfile corresponding to this version and category
+            packages[p].vermap[v][category] = t
+
+        # if the package has no install tarfiles (i.e. is source only), make
+        # sure it is marked as 'skip' (which really means 'source-only' at the
+        # moment)
+        #
+        # (this needs to take place after uploads have been merged into the
+        # package set, so that an upload containing just a replacement
+        # setup.hint is not considered a source-only package)
+        #
+        # XXX: the check should probably be for any non-empty install files, but
+        # that differs from what upset does
+        if not has_install and 'skip' not in packages[p].hints:
+            packages[p].hints['skip'] = ''
+            logging.info("package '%s' appears to be source-only as it has no install tarfiles, adding 'skip:' hint" % (p))
+
+        # verify the versions specified for stability level exist
+        levels = ['test', 'curr', 'prev']
+        for l in levels:
+            if l in packages[p].hints:
+                # check that version exists
+                v = packages[p].hints[l]
+                if v not in packages[p].vermap:
+                    logging.error("package '%s' stability '%s' selects non-existent version '%s'" % (p, l, v))
+                    error = True
+
+        # assign a version to each stability level
+        packages[p].stability = defaultdict()
+
+        # sort in order from highest to lowest version
+        for v in sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True):
+            level_found = False
+
+            while True:
+                # no stability levels left
+                if len(levels) == 0:
+                    # XXX: versions which don't correspond to any stability level
+                    # should be reported, we might want to remove them at some point
+                    logging.log(5, "package '%s' has no stability levels left for version '%s'" % (p, v))
+                    break
+
+                l = levels[0]
+
+                # if current stability level has an override
+                if l in packages[p].hints:
+                    # if we haven't reached that version yet
+                    if v != packages[p].hints[l]:
+                        break
+                    else:
+                        logging.debug("package '%s' stability '%s' overridden to version '%s'" % (p, l, v))
+                else:
+                    # level 'test' must be assigned by override
+                    if l == 'test':
+                        levels.remove(l)
+                        # go around again to check for override at the new level
+                        continue
+
+                level_found = True
+                logging.log(5, "package '%s' stability '%s' assigned version '%s'" % (p, l, v))
+                break
+
+            if not level_found:
+                continue
+
+            # assign version to level
+            packages[p].stability[l] = v
+            # and remove from list of unallocated levels
+            levels.remove(l)
+
+        # lastly, fill in any levels which we skipped over because a higher
+        # stability level was overriden to a lower version
+        for l in levels:
+            if l in packages[p].hints:
+                packages[p].stability[l] = packages[p].hints[l]
+
+        # If, for every stability level, the install tarball is empty and there
+        # is no source tarball, we should probably be marked obsolete
+        if 'skip' not in packages[p].hints:
+            if '_obsolete' not in packages[p].hints['category']:
+                has_something = False
+
+                for l in ['test', 'curr', 'prev']:
+                    if l in packages[p].stability:
+                        v = packages[p].stability[l]
+                        if 'source' in packages[p].vermap[v]:
+                            has_something = True
+                        elif 'install' in packages[p].vermap[v]:
+                            if not packages[p].tars[packages[p].vermap[v]['install']].is_empty:
+                                has_something = True
+
+                if not has_something:
+                    logging.warning("package '%s' has empty install tar file and no source for all levels, but it's not in the _obsolete category" % (p))
+
+    # make another pass to verify a source tarfile exists for every install
+    # tarfile version
+    for p in sorted(packages.keys()):
+        for v in sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True):
+            if 'install' not in packages[p].vermap[v]:
+                continue
+
+            # unless the install tarfile is empty
+            if packages[p].tars[packages[p].vermap[v]['install']].is_empty:
+                continue
+
+            # source tarfile may be either in this package or in the
+            # external-source package
+            #
+            # mark the source tarfile as being used by an install tarfile
+            if 'source' in packages[p].vermap[v]:
+                packages[p].tars[packages[p].vermap[v]['source']].is_used = True
+                continue
+
+            if 'external-source' in packages[p].hints:
+                es_p = packages[p].hints['external-source']
+                if es_p in packages:
+                    if 'source' in packages[es_p].vermap[v]:
+                        packages[es_p].tars[packages[es_p].vermap[v]['source']].is_used = True
+                        continue
+
+            # unless this package is marked as 'self-source'
+            if 'self-source' in packages[p].hints:
+                continue
+
+            logging.error("package '%s' version '%s' is missing source" % (p, v))
+            error = True
+
+    # make another pass to verify that each non-empty source tarfile version has
+    # at least one corresponding non-empty install tarfile, in some package.
+    for p in sorted(packages.keys()):
+        for v in sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True):
+            if 'source' not in packages[p].vermap[v]:
+                continue
+
+            if packages[p].tars[packages[p].vermap[v]['source']].is_empty:
+                continue
+
+            if not packages[p].tars[packages[p].vermap[v]['source']].is_used:
+                logging.error("package '%s' version '%s' source has no non-empty install tarfiles" % (p, v))
+                error = True
+
+    # validate that all packages are in the package maintainers list
+    validate_package_maintainers(args, packages)
+
+    return not error
+
+
+#
+def validate_package_maintainers(args, packages):
+    if not args.pkglist:
+        return
+
+    # read maintainer list
+    mlist = {}
+    mlist = maintainers.Maintainer.add_packages(mlist, args.pkglist)
+
+    # make the list of all packages
+    all_packages = maintainers.Maintainer.all_packages(mlist)
+
+    # validate that all packages are in the package list
+    for p in sorted(packages):
+        # ignore skip packages
+        if 'skip' in packages[p].hints:
+            continue
+        # ignore obsolete packages
+        if '_obsolete' in packages[p].hints['category']:
+            continue
+        if not is_in_package_list(packages[p].path, all_packages):
+            logging.error("package '%s' is not in the package list" % (p))
+
+
+#
+# write setup.ini
+#
+def write_setup_ini(args, packages, arch):
+
+    logging.debug('writing %s' % (args.inifile))
+
+    with open(args.inifile, 'w') as f:
+        os.fchmod(f.fileno(), 0o644)
+
+        # write setup.ini header
+        print(textwrap.dedent('''\
+        # This file is automatically generated.  If you edit it, your
+        # edits will be discarded next time the file is generated.
+        # See http://cygwin.com/setup.html for details.
+        #'''), file=f)
+
+        if args.release:
+            print("release: %s" % args.release, file=f)
+        print("arch: %s" % arch, file=f)
+        print("setup-timestamp: %d" % time.time(), file=f)
+        if args.setup_version:
+            print("setup-version: %s" % args.setup_version, file=f)
+
+        # for each package
+        for p in sorted(packages.keys(), key=sort_key):
+            # do nothing if 'skip'
+            if 'skip' in packages[p].hints:
+                continue
+
+            # write package data
+            print("\n@ %s" % p, file=f)
+
+            print("sdesc: %s" % packages[p].hints['sdesc'], file=f)
+
+            if 'ldesc' in packages[p].hints:
+                print("ldesc: %s" % packages[p].hints['ldesc'], file=f)
+
+            # for historical reasons, category names must start with a capital
+            # letter
+            category = ' '.join(map(upper_first_character, packages[p].hints['category'].split()))
+            print("category: %s" % category, file=f)
+
+            if 'requires' in packages[p].hints:
+                # for historical reasons, empty requires are suppressed
+                requires = packages[p].hints['requires']
+                if requires:
+                    print("requires: %s" % requires, file=f)
+
+            # write tarfile lines for each stability level
+            for level in ['curr', 'prev', 'test']:
+                if level in packages[p].stability:
+                    version = packages[p].stability[level]
+                    if level != 'curr':
+                        print("[%s]" % level, file=f)
+                    print("version: %s" % version, file=f)
+
+                    if 'install' in packages[p].vermap[version]:
+                        t = packages[p].vermap[version]['install']
+                        tar_line('install', packages[p], t, f)
+
+                    # look for corresponding source in this package first
+                    if 'source' in packages[p].vermap[version]:
+                        t = packages[p].vermap[version]['source']
+                        tar_line('source', packages[p], t, f)
+                    # if that doesn't exist, follow external-source
+                    elif 'external-source' in packages[p].hints:
+                        s = packages[p].hints['external-source']
+                        if 'source' in packages[s].vermap[version]:
+                            t = packages[s].vermap[version]['source']
+                            tar_line('source', packages[s], t, f)
+                        else:
+                            logging.warning("package '%s' version '%s' has no source in external-source '%s'" % (p, version, s))
+
+            if 'message' in packages[p].hints:
+                print("message: %s" % packages[p].hints['message'], file=f)
+
+
+# helper function to output details for a particular tar file
+def tar_line(category, p, t, f):
+    fn = os.path.join(p.path, t)
+    sha512 = p.tars[t].sha512
+    size = p.tars[t].size
+    print("%s: %s %d %s" % (category, fn, size, sha512), file=f)
+
+
+# helper function to change the first character of a string to upper case,
+# without altering the rest
+def upper_first_character(s):
+    return s[:1].upper() + s[1:]
+
+
+#
+# merge sets of packages
+#
+# for each package which exist in both a and b:
+# - they must exist at the same relative path
+# - we combine the list of tarfiles, duplicates are not permitted
+# - we use the hints from b, and warn if they are different to the hints for a
+#
+def merge(a, *l):
+    # start with a copy of a
+    c = copy.deepcopy(a)
+
+    for b in l:
+        for p in b:
+            # if the package is in b but not in a, add it to the copy
+            if p not in a:
+                c[p] = b[p]
+            # else, if the package is both in a and b, we have to do a merge
+            else:
+                # package must exist at same relative path
+                if a[p].path != b[p].path:
+                    logging.error("package '%s' is at paths %s and %s" % (p, a[p].path, b[p].path))
+                    return None
+                else:
+                    for t in b[p].tars:
+                        if t in c[p].tars:
+                            logging.error("package '%s' has duplicate tarfile %s" % (p, t))
+                            return None
+                        else:
+                            c[p].tars[t] = b[p].tars[t]
+
+                    # use hints from b, but warn if they have changed
+                    if a[p].hints != b[p].hints:
+                        c[p].hints = b[p].hints
+
+                        diff = '\n'.join(difflib.ndiff(
+                            pprint.pformat(a[p].hints).splitlines(),
+                            pprint.pformat(b[p].hints).splitlines()))
+
+                        logging.warning("package '%s' hints changed\n%s" % (p, diff))
+
+    return c
+
+
+#
+# delete a file from a package set
+#
+
+def delete(packages, path, fn):
+    for p in packages:
+        if packages[p].path == path:
+            for t in packages[p].tars:
+                if t == fn:
+                    del packages[p].tars[t]
+                    break
+
+
+#
+# verify that the package ppath is in the list of packages plist
+#
+# (This means that a maintainer can upload a package with any name, provided the
+# path contains one allowed for that maintainer)
+#
+# This avoids the need to have to explicitly list foo, foo_autorebase,
+# foo-devel, foo-doc, foo-debuginfo, libfoo0, girepository-foo, etc. instead of
+# just foo in the package list
+#
+# But means only the rule that a package can't exist in multiple paths prevents
+# arbitrary package upload.
+#
+
+def package_list_re(plist):
+    if getattr(package_list_re, "_plist", []) != plist:
+        pattern = '|'.join(map(lambda p: r'/' + re.escape(p) + r'(?:/|$)', plist))
+        package_list_re._regex = re.compile(pattern, re.IGNORECASE)
+        package_list_re._plist = plist
+
+    return package_list_re._regex
+
+
+def is_in_package_list(ppath, plist):
+    if package_list_re(plist).search(ppath):
+        return True
+
+    return False
+
+
+#
+#
+#
+if __name__ == "__main__":
+    for arch in common_constants.ARCHES:
+        packages = read_packages(common_constants.FTP, arch)
+        print("arch %s has %d packages" % (arch, len(packages)))
diff --git a/calm/past_mistakes.py b/calm/past_mistakes.py
new file mode 100644
index 0000000..5e1132f
--- /dev/null
+++ b/calm/past_mistakes.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# For things we really want to warn on but there are annoyingly many existing
+# uses, we have a list of existing uses we can forgive, so we can warn on new
+# uses.
+#
+
+# package names which have been used with versions containing a hyphen
+hyphen_in_version = [
+    'ctorrent',
+    'email',
+    'email-debuginfo',
+    'fdupes',
+    'gendef',
+    'gendef-debuginfo',
+    'gtk3-engines-unico',
+    'gtk3-engines-unico-debuginfo',
+    'hidapi',
+    'hidapi-debuginfo',
+    'libhidapi-devel',
+    'libhidapi0',
+    'libmangle',
+    'libmangle-debuginfo',
+    'man-pages-posix',
+    'mingw64-i686-hidapi',
+    'mingw64-i686-hidapi-debuginfo',
+    'mingw64-x86_64-hidapi',
+    'mingw64-x86_64-hidapi-debuginfo',
+    'recode',
+    'recode-debuginfo',
+    'socat',
+    'socat-debuginfo',
+    'tack',
+    'tack-debuginfo',
+    'xemacs-mule-sumo',
+    'xemacs-sumo',
+    'xview',
+    'xview-devel',
+]
+
+# cygport places this into the requires of every debuginfo package
+self_requires = [
+    'cygwin-debuginfo'
+]
+
+# these are packages which only contain data, symlinks or scripts and thus
+# function as their own source
+self_source = [
+    'R_autorebase',
+    '_update-info-dir',
+    'base-cygwin',
+    'base-files',  # older versions were self-source, but current one isn't
+    'chere',
+    'cygcheck-dep',
+    'gcc4-core',
+    'gcc4-g++',
+    'tesseract-ocr-deu',  # unclear how these are delivered by upstream and how they are packaged
+    'tesseract-ocr-deu-f',
+    'tesseract-ocr-eng',
+    'tesseract-ocr-fra',
+    'tesseract-ocr-ita',
+    'tesseract-ocr-nld',
+    'tesseract-ocr-por',
+    'tesseract-ocr-spa',
+    'tesseract-ocr-vie',
+    'tesseract-training-core',
+    'tesseract-training-deu',
+    'tesseract-training-eng',
+    'tesseract-training-fra',
+    'tesseract-training-ita',
+    'tesseract-training-nld',
+    'tesseract-training-por',
+    'tesseract-training-spa',
+    'tesseract-training-vie',
+]
diff --git a/calm/pkg2html.py b/calm/pkg2html.py
new file mode 100755
index 0000000..c5bedb6
--- /dev/null
+++ b/calm/pkg2html.py
@@ -0,0 +1,239 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# write package listing HTML files
+#
+# - build a list of all files under HTDOCS/packages/<arch>
+# - for each package in the package database
+# --- create a .htaccess file in the package directory, if not present
+# -- for each tar file
+# --- if a package listing HTML file doesn't already exist
+# ---- write a HTML package listing file listing the tar file contents
+# - write packages.inc, the list of packages
+# - remove any listing files for which there was no package
+# - remove any empty directories (TBD)
+#
+# note that the directory hierarchy of (noarch|arch)/package/subpackages is
+# flattened in the package listing to just the package name
+#
+
+from collections import defaultdict
+import argparse
+import glob
+import logging
+import os
+import re
+import sys
+import tarfile
+import textwrap
+import time
+
+from . import common_constants
+from . import package
+
+
+#
+#
+#
+
+def update_package_listings(args, packages, arch):
+    base = os.path.join(args.htdocs, arch)
+    if not args.dryrun:
+        try:
+            os.makedirs(base, exist_ok=True)
+        except FileExistsError:
+            pass
+
+    #
+    # write base directory .htaccess, if needed
+    #
+    # force trying to access the base directory to redirect to the package list
+    # page, as having the server index this directory containing lots of
+    # subdirectories makes this URL very expensive to serve if someone stumbles
+    # onto it by accident)
+    #
+
+    htaccess = os.path.join(base, '.htaccess')
+    if not os.path.exists(htaccess) or args.force:
+        logging.debug('writing %s' % htaccess)
+        if not args.dryrun:
+            with open(htaccess, 'w') as f:
+
+                print('Redirect temp /packages/%s/index.html https://cygwin.com/packages/package_list.html' % (arch),
+                      file=f)
+
+    toremove = glob.glob(os.path.join(base, '*', '*'))
+
+    for p in packages:
+
+        # do nothing for packages marked 'skip'
+        if 'skip' in packages[p].hints:
+            continue
+
+        dir = os.path.join(base, p)
+        if not args.dryrun:
+            try:
+                os.makedirs(dir, exist_ok=True)
+            except FileExistsError:
+                pass
+            os.chmod(dir, 0o777)
+
+        #
+        # write .htaccess if needed
+        #
+
+        htaccess = os.path.join(dir, '.htaccess')
+        if not os.path.exists(htaccess):
+            logging.debug('writing %s' % htaccess)
+            if not args.dryrun or args.force:
+                with open(htaccess, 'w') as f:
+
+                    print(textwrap.dedent('''\
+                                             Options Indexes
+                                             IndexOptions -FancyIndexing
+                                             AddType text/html 1 2 3 4 5 6 7 8 9'''),
+                          file=f)
+                    # XXX: omitting 0 here doesn't make much sense.  and this
+                    # doesn't help for src packages, so is it actually having
+                    # any effect?
+
+        #
+        # for each tarfile, write tarfile listing
+        #
+
+        for t in packages[p].tars:
+
+            fver = re.sub(r'\.tar.*$', '', t)
+            html = os.path.join(dir, fver)
+
+            # ... if it doesn't already exist, or force
+            if not os.path.exists(html) or args.force:
+
+                logging.debug('writing %s' % html)
+
+                if not args.dryrun:
+                    with open(html, 'w') as f:
+                        header = p + ": " + packages[p].hints['sdesc'].replace('"', '')
+                        if fver.endswith('-src'):
+                            header = header + " (source code)"
+                        else:
+                            header = header + " (installed binaries and support files)"
+                        # XXX: also recognize '-devel', '-doc', '-debuginfo' ?
+                        # XXX: '(utilities)', '(runtime)'
+                        # XXX: and work out if it's runtime library?
+
+                        print(textwrap.dedent('''\
+                                                 <html>
+                                                 <h1>%s</h1>
+                                                 <tt><pre>''' % (header)), file=f)
+
+                        tf = os.path.join(args.rel_area, packages[p].path, t)
+                        if not os.path.exists(tf):
+                            # XXX: this shouldn't happen with a full mirror...
+                            print('tarfile %s not found' % tf, file=f)
+                        elif os.path.getsize(tf) <= 32:
+                            # compressed empty files aren't a valid tar file,
+                            # but we can just ignore them
+                            pass
+                        else:
+                            with tarfile.open(tf) as a:
+                                for i in a:
+                                    print('    %-16s%12d %s' % (time.strftime('%Y-%m-%d %H:%M', time.gmtime(i.mtime)), i.size, i.name), file=f, end='')
+                                    if i.isdir():
+                                        print('/', file=f, end='')
+                                    if i.issym() or i.islnk():
+                                        print(' -> %s' % i.linkname, file=f, end='')
+                                    print('', file=f)
+
+                        print(textwrap.dedent('''\
+                                                 </pre></tt>
+                                                 </html>'''), file=f)
+            else:
+                logging.log(5, 'not writing %s, already exists' % html)
+
+            # this file should exist, so remove from the toremove list
+            if html in toremove:
+                toremove.remove(html)
+
+    #
+    # write packages.inc
+    #
+
+    packages_inc = os.path.join(base, 'packages.inc')
+    logging.debug('writing %s' % packages_inc)
+    if not args.dryrun:
+        with open(packages_inc, 'w') as index:
+            os.fchmod(index.fileno(), 0o755)
+            print(textwrap.dedent('''\
+                                     <div id="%s">
+                                     <div id="background">
+                                     <b class="rtop"><b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b></b>
+                                     <h2>Available Packages for %s</h2>
+                                     <b class="rbottom"><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b></b>
+                                     </div>
+                                     <br>
+                                     <table class="pkglist">''') % (arch, arch), file=index)
+
+            for p in sorted(packages.keys(), key=package.sort_key):
+                # don't write anything if 'skip'
+                if 'skip' in packages[p].hints:
+                    continue
+
+                header = packages[p].hints['sdesc'].replace('"', '')
+
+                print('<tr><td><a href="' + arch + '/' + p + '">' + p + '</a></td><td>' + header + '</td></tr>', file=index)
+
+            print(textwrap.dedent('''\
+                                     </table>
+                                     </div>'''), file=index)
+
+    #
+    # remove any remaining listing files for which there was no corresponding package
+    #
+
+    for r in toremove:
+        logging.debug('rm %s' % r)
+        if not args.dryrun:
+            os.unlink(r)
+
+if __name__ == "__main__":
+    htdocs_default = os.path.join(common_constants.HTDOCS, 'packages')
+    relarea_default = common_constants.FTP
+
+    parser = argparse.ArgumentParser(description='Write HTML package listings')
+    parser.add_argument('--arch', action='store', required=True, choices=common_constants.ARCHES)
+    parser.add_argument('--force', action='store_true', help="overwrite existing files")
+    parser.add_argument('--htdocs', action='store', metavar='DIR', help="htdocs output directory (default: " + htdocs_default + ")", default=htdocs_default)
+    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
+    parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun', help="don't do anything")
+    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
+    (args) = parser.parse_args()
+
+    if args.verbose:
+        logging.getLogger().setLevel(logging.INFO)
+
+    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
+
+    packages = package.read_packages(args.rel_area, args.arch)
+    update_package_listings(args, packages, args.arch)
diff --git a/calm/queue.py b/calm/queue.py
new file mode 100644
index 0000000..31f3cbb
--- /dev/null
+++ b/calm/queue.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2016 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.
+#
+
+from dirq.QueueSimple import QueueSimple
+import logging
+import os
+import re
+
+from . import uploads
+
+QUEUE = 'package_queue'
+
+
+#
+#
+#
+
+def add(args, movelist, fromdir):
+    if not hasattr(args, 'queuedir'):
+        return
+
+    queue_root = os.path.join(args.queuedir, 'dirq')
+    upload_root = os.path.join(args.queuedir, 'uploads')
+
+    dirq = QueueSimple(os.path.join(queue_root, QUEUE))
+
+    # clean up empty directories
+    dirq.purge()
+    os.system('find %s -depth -mindepth 1 -type d -empty -delete' % upload_root)
+
+    # are there any source packages in the filelist?
+    srcpkgs = []
+    for p in movelist:
+        for f in movelist[p]:
+            if re.search(r'-src.tar.(bz2|gz|lzma|xz)$', f):
+                srcpkgs.append(os.path.join(p, f))
+
+    # if so...
+    #
+    # XXX: really this should break things up into the set of files for each
+    # source file
+    if len(srcpkgs) >= 1:
+        # keep all the files for comparison
+        uploads.copy(args, movelist, fromdir, upload_root)
+
+        # queue any srcpkgs
+        for p in srcpkgs:
+            if not args.dryrun:
+                logging.debug("queuing source package %s for validation" % (p))
+                dirq.add(p)
diff --git a/calm/setup_exe.py b/calm/setup_exe.py
new file mode 100755
index 0000000..d9d85be
--- /dev/null
+++ b/calm/setup_exe.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# extract version from setup executable
+#
+
+import argparse
+import os
+import re
+
+
+#
+# the setup binary contains a '%%% setup-version ' string identifying the
+# version, but it's hard to read that when it's UPX packed.
+#
+# so instead, we expect the exe file to be a symlink to a file which encodes
+# the version in it's name
+#
+# XXX: possibly we could work around this by placing the version string into
+# a string resource and using upx's --keep-resource flag to keep that resource
+# uncompressed
+#
+
+def extract_version(fn):
+    # check the file exists
+    if not os.path.exists(fn):
+        raise FileNotFoundError
+
+    # canonicalize the pathname
+    fn = os.path.realpath(fn)
+
+    match = re.search(r'setup-([\d\.]+).x86', fn)
+    if match:
+        return match.group(1)
+    else:
+        return None
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description='Extract version from setup executable')
+    parser.add_argument('exe', action='store', nargs='?', metavar='filename', help='executable file')
+    (args) = parser.parse_args()
+
+    if args.exe:
+        v = extract_version(args.exe)
+        if v:
+            print(v)
+            exit(0)
+        exit(1)
+
+    parser.print_help()
+
+# XXX:maybe this could make the filename from /www/sourceware/htdocs/cygwin and arch?
diff --git a/calm/spelling.py b/calm/spelling.py
new file mode 100644
index 0000000..2b477c1
--- /dev/null
+++ b/calm/spelling.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+import logging
+import re
+from enchant import DictWithPWL
+from enchant.checker import SpellChecker
+from enchant.tokenize import Filter
+
+
+#
+#
+#
+
+class DescFilter(Filter):
+    # acronym may start with a digit (e.g. 3GPP), contains two or more capital
+    # letters (e.g. IP), may also end with a digit (e.g. MP3), and may be
+    # pluralized (e.g. DLLs)
+    _acronym_pattern = re.compile(r'^\d?[A-Z]{2,}\d?(|s)')
+    _url_pattern = re.compile(r'.+://.+')
+    _module_pattern = re.compile(r'.+::.+')
+    _path_pattern = re.compile(r'^/.+')
+
+    _commands = ['apng2gif', 'gif2apng']
+
+    #
+    def _skip(self, word):
+        # skip acronyms
+        if self._acronym_pattern.match(word):
+            # print("%s is an acronyn" % word)
+            return True
+
+        # ignore things which look like URLs
+        if self._url_pattern.match(word):
+            # print("%s is a URL" % word)
+            return True
+
+        # ignore things which look like perl/ruby module names (contain ::)
+        if self._module_pattern.match(word):
+            # print("%s is a module name" % word)
+            return True
+
+        # ignore things which look like paths
+        if self._path_pattern.match(word):
+            # print("%s is a path name" % word)
+            return True
+
+        # commands containing digits won't be recognized as single words, so we
+        # arrange to skip those also
+        if word in self._commands:
+            return True
+
+        return False
+
+
+def spellcheck_hints(args, packages):
+    spelldict = DictWithPWL('en-US')
+    chkr = SpellChecker(spelldict, filters=[DescFilter])
+    misspellings = {}
+
+    # add technical words not in spell-checking dictionary
+    wordlist = []
+    with open('words.txt') as f:
+        for w in f:
+            # strip any trailing comment
+            w = re.sub(r'#.*$', '', w)
+            # strip any whitespace
+            w = w.strip()
+            spelldict.add(w)
+            wordlist.append(w.lower())
+            # XXX: for the moment, to reduce the set of errors, ignore the fact
+            # that words.txt gives a canonical capitalization, and accept any
+            # capitalization
+            spelldict.add(w.lower())
+            spelldict.add(w.capitalize())
+
+    # add all package names as valid words
+    for p in packages:
+        for w in re.split('[_-]', p):
+            # remove punctuation characters
+            w = re.sub(r'[+]', '', w)
+            # strip off any trailing numbers
+            w = re.sub(r'[\d.]*$', '', w)
+
+            # both with and without any lib prefix
+            for w1 in [w, re.sub(r'^lib', '', w)]:
+                # add the package name unless it exists in the list above, which
+                # will give a canonical capitalization
+                if w.lower() not in wordlist:
+                    spelldict.add(w.lower())
+                    spelldict.add(w)
+                    spelldict.add(w.capitalize())
+
+    # for each package
+    for p in sorted(packages.keys()):
+        # debuginfo packages have uninteresting, auto-generated text which
+        # contains the package name
+        if p.endswith('-debuginfo'):
+            continue
+
+        # spell-check the spell-checkable keys
+        for k in ['sdesc', 'ldesc', 'message']:
+            if k in packages[p].hints:
+                chkr.set_text(packages[p].hints[k])
+                # XXX: this is doing all the work to generate suggestions, which
+                # we then ignore, so could be written much more efficiently
+                for err in chkr:
+                    # logging.error("package '%s', hint '%s': Is '%s' a word?" % (p, k, err.word))
+                    misspellings.setdefault(err.word, 0)
+                    misspellings[err.word] += 1
+
+    # summarize
+    for c in sorted(misspellings, key=misspellings.get, reverse=True):
+        print('%16s: %4d' % (c, misspellings[c]))
diff --git a/calm/uploads.py b/calm/uploads.py
new file mode 100644
index 0000000..9c11031
--- /dev/null
+++ b/calm/uploads.py
@@ -0,0 +1,278 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# upload directory processing
+#
+
+from collections import defaultdict, namedtuple
+import filecmp
+import os
+import logging
+import re
+import shutil
+import time
+
+from . import package
+
+# reminders will be issued daily
+REMINDER_INTERVAL = 60*60*24
+
+# a named tuple type to hold the result of scan
+ScanResult = namedtuple('ScanResult', 'error,packages,to_relarea,to_vault,remove_always,remove_success')
+
+
+#
+#
+#
+
+def scan(m, all_packages, arch, args):
+    basedir = os.path.join(m.homedir(), arch)
+    releasedir = os.path.join(args.rel_area, arch)
+
+    packages = defaultdict(package.Package)
+    move = defaultdict(list)
+    vault = defaultdict(list)
+    remove = []
+    remove_success = []
+    error = False
+    mtimes = [('', 0)]
+
+    logging.debug('reading packages from %s' % (basedir))
+
+    # note mtime of any !ready file at top-level
+    for ready in [os.path.join(basedir, '!ready'), os.path.join(basedir, 'release', '!ready')]:
+        if os.path.exists(ready):
+            mtime = os.path.getmtime(ready)
+            mtimes.append(('', mtime))
+            logging.debug('processing files with mtime older than %d' % (mtime))
+            remove.append(ready)
+
+    # the mtime of this file indicates when 'ignoring as there is no !ready'
+    # warnings were last emitted
+    reminder_file = os.path.join(m.homedir(), '!reminder-timestamp')
+    if os.path.exists(reminder_file):
+        reminder_time = os.path.getmtime(reminder_file)
+    else:
+        reminder_time = 0
+    reminders = False
+    logging.debug("reminder-timestamp %d, interval %d, next reminder %d, current time %d" % (reminder_time, REMINDER_INTERVAL, reminder_time + REMINDER_INTERVAL, time.time()))
+
+    # scan package directories
+    for (dirpath, subdirs, files) in os.walk(os.path.join(basedir, 'release')):
+        relpath = os.path.relpath(dirpath, m.homedir())
+
+        # skip uninteresting directories
+        if (not files) or (relpath == os.path.join(arch, 'release')):
+            continue
+
+        logging.debug('reading uploads from %s' % dirpath)
+
+        # note the mtime of the !ready file
+        if '!ready' in files:
+            ready = os.path.join(dirpath, '!ready')
+            mtime = os.path.getmtime(ready)
+            mtimes.append((relpath + '/', mtime))
+            remove.append(ready)
+            files.remove('!ready')
+            logging.debug("processing files below '%s' with mtime older than %d" % (relpath, mtime))
+        else:
+            # otherwise work back up a list of (path,mtimes) (which should be in
+            # shortest-to-longest order, since os.walk() walks the tree
+            # top-down), and use the mtime of the first (longest) matching path.
+            while True:
+                (path, mtime) = mtimes[-1]
+                if relpath.startswith(path):
+                    logging.debug("using mtime %d from subpath '%s' of '%s'" % (mtime, path, relpath))
+                    break
+                else:
+                    mtimes.pop()
+
+        # package doesn't appear in package list at all
+        if not package.is_in_package_list(relpath, all_packages):
+            logging.error("package '%s' is not in the package list" % dirpath)
+            continue
+
+        # only process packages for which we are listed as a maintainer
+        if not package.is_in_package_list(relpath, m.pkgs):
+            logging.warning("package '%s' is not in the package list for maintainer %s" % (dirpath, m.name))
+            continue
+
+        # filter out files we don't need to consider
+        for f in sorted(files):
+            fn = os.path.join(dirpath, f)
+            rel_fn = os.path.join(relpath, f)
+            logging.debug("processing %s" % rel_fn)
+
+            # ignore !packages (which we no longer use)
+            # ignore !mail and !email (which we have already read)
+            if f in ['!packages', '!mail', '!email']:
+                files.remove(f)
+                continue
+
+            # ignore in-progress sftp uploads. Net::SFTP::SftpServer uses
+            # temporary upload filenames ending with '.SftpXFR.<pid>'
+            if re.search(r'\.SftpXFR\.\d*$', f):
+                logging.debug("ignoring temporary upload file %s" % fn)
+                files.remove(f)
+                continue
+
+            # only process files newer than !ready
+            if os.path.getmtime(fn) > mtime:
+                if mtime == 0:
+                    reminders = True
+                    lvl = logging.DEBUG
+
+                    # if more than REMINDER_INTERVAL has elapsed since we warned
+                    # about files being ignored, warn again
+                    if time.time() > (reminder_time + REMINDER_INTERVAL):
+                        lvl = logging.WARNING
+                        if not args.dryrun:
+                            touch(reminder_file)
+
+                    logging.log(lvl, "ignoring %s as there is no !ready" % fn)
+                else:
+                    logging.warning("ignoring %s as it is newer than !ready" % fn)
+                files.remove(f)
+                continue
+
+            if f.startswith('-'):
+                if ('*' in f) or ('?' in f):
+                    logging.error("remove file %s name contains metacharacters, which are no longer supported" % fn)
+                    error = True
+                elif os.path.getsize(fn) != 0:
+                    logging.error("remove file %s is not empty" % fn)
+                    error = True
+                else:
+                    vault[relpath].append(f[1:])
+                    remove_success.append(fn)
+                files.remove(f)
+            else:
+                dest = os.path.join(releasedir, relpath, f)
+                if os.path.isfile(dest):
+                    if f != 'setup.hint':
+                        if filecmp.cmp(dest, fn, shallow=False):
+                            logging.info("ignoring, identical %s is already in release area" % fn)
+                        else:
+                            logging.error("ignoring, different %s is already in release area (perhaps you should rebuild with a different version-release identifier?)" % fn)
+                            error = True
+                        files.remove(f)
+                    else:
+                        if filecmp.cmp(dest, fn, shallow=False):
+                            logging.debug("identical %s is already in release area" % fn)
+                        else:
+                            logging.debug("different %s is already in release area" % fn)
+                        # we always consider setup.hint, as we can't have a valid package without it
+                        move[relpath].append(f)
+                else:
+                    move[relpath].append(f)
+
+        # read and validate package
+        if files:
+            # strict means we consider warnings as fatal for upload
+            if package.read_package(packages, m.homedir(), dirpath, files, strict=True):
+                error = True
+
+    # if we didn't need to check the reminder timestamp, it can be reset
+    if not reminders and not args.dryrun:
+        try:
+            os.remove(reminder_file)
+        except FileNotFoundError:
+            pass
+
+    return ScanResult(error, packages, move, vault, remove, remove_success)
+
+
+#
+#
+#
+
+def touch(fn, times=None):
+    with open(fn, 'a'):
+        os.utime(fn, times)
+
+
+#
+#
+#
+
+def remove(args, remove):
+    for f in remove:
+        logging.debug("rm %s", f)
+        if not args.dryrun:
+            os.unlink(f)
+
+
+#
+#
+#
+
+def move(args, movelist, fromdir, todir):
+    for p in sorted(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
+        logging.info("move from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
+        for f in sorted(movelist[p]):
+            if os.path.exists(os.path.join(fromdir, p, f)):
+                logging.info("%s" % (f))
+                if not args.dryrun:
+                    os.rename(os.path.join(fromdir, p, f), os.path.join(todir, p, f))
+            else:
+                logging.error("%s can't be moved as it doesn't exist" % (f))
+
+
+def move_to_relarea(m, args, movelist):
+    move(args, movelist, m.homedir(), args.rel_area)
+    # XXX: Note that there seems to be a separate process, not run from
+    # cygwin-admin's crontab, which changes the ownership of files in the
+    # release area to cyguser:cygwin
+
+
+def move_to_vault(args, movelist):
+    move(args, movelist, args.rel_area, args.vault)
+
+
+#
+#
+#
+
+def copy(args, movelist, fromdir, todir):
+    for p in sorted(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
+        logging.debug("copy from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
+        for f in sorted(movelist[p]):
+            if os.path.exists(os.path.join(fromdir, p, f)):
+                logging.debug("%s" % (f))
+                if not args.dryrun:
+                    shutil.copy2(os.path.join(fromdir, p, f), os.path.join(todir, p, f))
+            else:
+                logging.error("%s can't be copied as it doesn't exist" % (f))
diff --git a/calm/version.py b/calm/version.py
new file mode 100644
index 0000000..027372f
--- /dev/null
+++ b/calm/version.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+import itertools
+import logging
+import re
+
+
+#
+
+def cmp(a, b):
+    return (a > b) - (a < b)
+
+
+#
+# SetupVersion
+#
+# a helper class which implements the same version ordering as setup
+#
+
+class SetupVersion:
+    def __init__(self, version_string):
+        self._version_string = version_string
+
+        # split version into [V, R], on the last '-', if any
+        split = list(itertools.chain(version_string.rsplit('-', 1), ['']))[:2]
+
+        # then split each part into numeric and non-numeric sequences.
+        # numeric sequences have leading zeroes discarded
+        for j, i in enumerate(['V', 'R']):
+            setattr(self, '_' + i, [re.sub(r'^0+(\d)', r'\1', m.group(1), 1) for m in re.finditer(r'(\d+|\D+)', split[j])])
+
+    def __str__(self):
+        return '%s (V=%s R=%s)' % (self._version_string, str(self._V), str(self._R))
+
+    # XXX: Implementing the __lt__ comparison operator in terms of the obsolete
+    # __cmp__ operator is rather over-complicated.  If we really only need
+    # __lt__ (which is sufficent to make this class sortable), then we should
+    # just implement it directly.  For the moment, keep __cmp__ around in case
+    # we need to do other comparisons. (in which case, see also functools
+    # @total_ordering class decorator)
+    def __lt__(self, other):
+        return self.__cmp__(other) == -1
+
+    def __cmp__(self, other):
+        # warn about ill-specified comparisons
+        # SetupVersion._warn_ambiguous_compare(self, other)
+
+        # compare V
+        c = SetupVersion._compare(self._V, other._V)
+        if c != 0:
+            return c
+
+        # if V are the same, compare R
+        return SetupVersion._compare(self._R, other._R)
+
+    # comparison helper function
+    @staticmethod
+    def _compare(a, b):
+
+        # compare each sequence in order
+        for i in range(0, min(len(a), len(b))):
+            # sort a non-digit sequence before a digit sequence
+            if a[i].isdigit() != b[i].isdigit():
+                return 1 if a[i].isdigit() else -1
+
+            # compare as numbers
+            if a[i].isdigit():
+                # because leading zeros have already been removed, if one number
+                # has more digits, it is greater
+                c = cmp(len(a[i]), len(b[i]))
+                if c != 0:
+                    return c
+                # fallthrough
+
+            # compare lexicographically
+            c = cmp(a[i], b[i])
+            if c != 0:
+                return c
+
+        # if equal length, all components have matched, so equal
+        # otherwise, the version with a suffix remaining is greater
+        return cmp(len(a), len(b))
+
+    # warn if the comparison of these versions is historically under-specified
+    @staticmethod
+    def _warn_ambiguous_compare(a, b):
+        def classify(s):
+            if len(s) == 0:
+                return 'e'
+            elif s[0].isdigit():
+                return 'n'
+            elif s[0] in '.-_':
+                return s[0]
+            elif s[0].isalpha():
+                return 'a'
+            return 'o'
+
+        def is_ambiguous(a, b):
+            ambiguous = False
+
+            for i in range(0, min(len(a), len(b))):
+                if classify(a[i]) != classify(b[i]):
+                    ambiguous = True
+                    break
+
+            return ambiguous
+
+        if is_ambiguous(a._V, b._V) or is_ambiguous(a._R, b._R):
+            logging.warning("ordering of versions '%s' and '%s' may not be what you expect" % (a._version_string, b._version_string))
diff --git a/calm/words.txt b/calm/words.txt
new file mode 100644
index 0000000..9809cce
--- /dev/null
+++ b/calm/words.txt
@@ -0,0 +1,437 @@
+AbiWord
+Advection
+Amdahl
+AqBanking
+Arial
+AsciiDoc
+Assuan
+BeOS
+Bezier
+BiDi
+BibLaTeX
+BitTorrent
+Boehm
+Bokmål
+Bonjour
+Bonjour's
+Bopomofo
+Bourne
+BuildBot
+CMake
+Castilian
+ChangeLog
+Clark's
+ClearCase
+CodeView
+Codec
+CoffeeScript
+Compositing
+ConTeXt
+Corel
+CorelTrace
+CppUnit
+Cryptographic
+DejaGnu
+DejaVu
+Delaunay
+DirectMedia
+DjVu
+DocBook
+DocTeX
+FastCGI
+Filename
+Filenames
+FlexDLL
+FooBillard
+FourCC
+FreeBSD
+FreeFont
+FreeHand
+FreeRDP
+FreeTDS
+FreeType
+Fullscreen
+GNUstep
+Galician
+GeoLite
+Gerrit
+GnuCash
+GnuPG
+GnuTLS
+GraphViz
+Haible
+HarfBuzz
+HexChat
+Hiragana
+Icecast
+Indic
+Infinote
+Inria
+Interlingua
+Intrinsics
+Kana
+Kanji
+Karlsruhe
+Kerberos
+Keyring
+Keyrings
+Kilgard
+Kivio
+Korn
+Kriging
+LaTeX
+Lempel
+Lexically
+LibOFX
+LibreSSL
+LilyPond
+Linkable
+Lossless
+Lucent
+Macromedia
+Maildir
+Makefile
+Makefiles
+MathML
+Matroska
+MikMod
+MinGW
+MirBSD
+MobileMP
+Mollweide
+Multihead
+Multilingualization
+MusicBrainz
+MySQL
+NeXT
+NetBSD
+NetCDF
+NetWare
+Nominatim
+NumPy
+OAuth
+ORBit
+Oberhumer
+ObjC
+Oniguruma
+OpenAL
+OpenAerialMap
+OpenBLAS
+OpenBSD
+OpenCDK
+OpenDocument
+OpenEXR
+OpenJPEG
+OpenJade
+OpenMP
+OpenOffice
+OpenPGP
+OpenSSH
+OpenSSL
+OpenStreetMap
+OpenType
+OpenXPS
+OutGuess
+PageMaker
+PortAudio
+PortMidi
+PostScript
+PostgreSQL
+Preprocessor
+Prolog
+Psion
+PuTTY
+PuTTY's
+PulseAudio
+PulseAudio's
+Punycode
+PyGTK
+Pythonic
+QtWebKit
+QuaZIP
+README
+Rakefiles
+RandR
+Rasterizer
+Rijndael
+Rocquencourt
+Signalling
+SoX
+Solaris
+SoundFont
+SourceForge
+SpiderMonkey
+Steganographic
+Stoll
+Stylesheet
+Stylesheets
+SuiteSparse
+Tatham
+TiMidity
+TigerVNC
+TightVNC
+TinyXML
+Trie
+TrueAudio
+TrueType
+TurboVNC
+Twofish
+TypeCode
+UPower
+Univariate
+Uyghur
+Valencian
+Visio
+Vixie's
+Voronoi
+WebDAV
+WebM
+WebP
+WebServer
+WeeChat
+Wiktionary
+WindowsWM
+WordPerfect
+Xiph
+Zaurus
+Ziv
+aRts
+accessors
+aclocal
+addressbook
+affine
+algarisms
+antialiased
+antialiasing
+asciidoc
+autoloadable
+autoloading
+awk
+azimuthal
+backend
+backends
+backport
+backported
+barcode
+barcodes
+bashism
+bashisms
+behaviour # uk spelling
+benchmarking
+bezier
+biWord
+bioinformatics
+bitrate
+bitrates
+bitstreams
+blowfish
+bodiless
+boolean
+breakpoint
+builtin
+builtins
+bytecode
+cardinality
+centric
+checksum
+checksums
+clothoid
+codec
+colormap
+colour # uk spelling
+coloured # uk spelling
+colours # uk spelling
+combinatorial
+componentized
+compositing
+coroutines
+cryptographic
+customizable
+daemonization
+dataset
+datasets
+datatypes
+decompiler
+decompositions
+decompressor
+decrypting
+discoverability
+discoverable
+distributable
+dlopen
+dpi
+eSpeak
+embeddable
+enumerant
+executable
+executables
+extensibility
+failover
+featureful
+filename
+filenames
+filesystem
+filesystems
+formatter
+forwardings
+framebuffer
+frontend
+fullscreen
+geocoding
+geoinformation
+gp
+helicoids
+hyperlinked
+hyphenator
+iCal
+iCalendar
+iODBC
+indenter
+independency
+inetd
+inode
+internetwork
+jQuery
+jaggy
+kerning
+keymap
+keyring
+keyrings
+lex
+libmagic
+libtoolized
+linkers
+lookup
+lookups
+lossless
+losslessly
+lossy
+mDNS
+maildir
+makefile
+makefiles
+mbox
+metadata
+middleware
+minidump
+minidumps
+minimalistic
+minimise # uk spelling
+modeller # uk spelling
+modelling # uk spelling
+monospace
+monospaced
+multibyte
+multilanguage
+multipart
+multiplatform
+multithreaded
+multithreading
+multiuser
+multivolume
+namespace
+narrowband
+netmask
+optimised # uk spellingx
+parameterized
+parsers
+passphrase
+patchset
+pathname
+persistency
+piecewise
+playlist
+polycones
+polycylinders
+polyhedra
+popup
+preconfigured
+preload
+preprocess
+preprocessor
+programmatically
+pronounceability
+quaternions
+rasterization
+rasterizer
+rasterizing
+rebased
+rebasing
+recognises # uk spelling
+recognises # uk spelling
+reflowable
+reformatter
+reimplemented
+reindenter
+renderer
+renderers
+resizing
+reverb
+scalable
+screenshots
+scrollback
+serializers
+significand
+slurper
+src
+stdin
+stdout
+steganographic
+steganography
+stylesheet
+stylesheets
+subcomponents
+subdirectory
+subhierarchy
+subprocesses
+substring
+subtree
+superset
+swiss
+symbology
+synchronizer
+synsets
+syntaxes
+targetted # uk spelling
+teleportation
+templating
+testsuite
+testsuites
+tetrominoes
+theming
+timestamp
+timestamps
+tokenization
+toolchain
+toolkit
+toolkits
+transactional
+transcoding
+triangulation
+triangulations
+trie
+trojans
+typesafe
+undecorated
+undirected
+unordered
+unpatched
+usably
+uuid
+variadic
+variational
+verifier
+versioning
+virtualized
+waveforms
+webserver
+whitespace
+wideband
+wildcard
+wildcards
+windowful
+workflow
+workflows
+wvWare
+xUnit
+yacc
diff --git a/common_constants.py b/common_constants.py
deleted file mode 100644
index de4bf46..0000000
--- a/common_constants.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-import os
-
-#
-# project constants
-#
-# Generally these are defaults for values settable via command line options
-#
-
-# base directory for maintainer upload directories
-HOMEDIR = '/sourceware/cygwin-staging/home'
-
-# the 'release area', contains all released files, which are rsync'ed to mirrors
-FTP = '/var/ftp/pub/cygwin'
-
-# logs are emailed to these addresses if any errors occurred
-EMAILS = ','.join(map(lambda m: m + '@sourceware.org', ['corinna', 'yselkowitz', 'jturney']))
-
-# for testing purposes, every email we send is bcc'd to these addresses
-ALWAYS_BCC = ''
-
-# these maintainers can upload orphaned packages as well
-ORPHANMAINT = "Yaakov Selkowitz"
-
-# architectures we support
-ARCHES = ['x86', 'x86_64']
-
-# base directory for HTML output
-HTDOCS = '/www/sourceware/htdocs/cygwin/'
-
-# the list of packages with maintainers
-PKGMAINT = '/www/sourceware/htdocs/cygwin/cygwin-pkg-maint'
-
-# removed files archive directory
-VAULT = '/sourceware/snapshot-tmp/cygwin'
-
-# SMTP smarthost
-MAILHOST = 'localhost'
-
-# different values to be used when we are not running on sourceware.org, but my
-# test system...
-if os.uname()[1] == 'tambora':
-    FTP = '/var/ftp/pub/cygwin-test'
-    EMAILS = 'jon.turney@dronecode.org.uk'
-    MAILHOST = 'allegra'
diff --git a/compare-arches b/compare-arches
deleted file mode 100755
index d2d6594..0000000
--- a/compare-arches
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# compare-arch - compare package sets between architectures
-#
-
-import argparse
-import logging
-import os
-import sys
-
-import common_constants
-import maintainers
-import package
-import uploads
-
-
-#
-#
-#
-
-def main(args):
-    packages = {}
-    pset = {}
-    union = set()
-
-    for arch in common_constants.ARCHES:
-        # build package list
-        packages[arch] = package.read_packages(args.rel_area, arch)
-
-        # make a set of the package list
-        pset[arch] = frozenset(packages[arch].keys())
-
-        # make the union of all the package lists
-        union = union.union(pset[arch])
-
-        # XXX: could filter out obsolete here
-
-    for p in sorted(union):
-        exists = {}
-        obs = {}
-
-        for arch in common_constants.ARCHES:
-            exists[arch] = False
-            obs[arch] = True
-            if p in packages[arch]:
-                exists[arch] = True
-                if '_obsolete' in packages[arch][p].hints.get('category', ''):
-                    obs[arch] = True
-                else:
-                    obs[arch] = False
-
-        if p.startswith('cygwin32') or p.startswith('cygwin64') or p.endswith('-debuginfo'):
-            continue
-
-        # packages which exist in all arches
-        if all(exists.values()):
-
-            # report packages which are obsolete only in some arch
-            if any(obs.values()) and not all(obs.values()):
-                print("%s is in all arches, but obsolete only in %s" % (p, [a for a in obs if obs[a]]))
-
-            continue
-
-        # ignore packages which are obsolete in all the arches they exist in
-        if all(obs.values()):
-            continue
-
-
-#        print(p, exists, obs)
-        print("%s is only in arch %s" % (p, [a for a in exists if exists[a]]))
-
-    # are there any packages which have a maintainer, but don't exist?
-    mlist = maintainers.Maintainer.read(args)
-    all_packages = maintainers.Maintainer.all_packages(mlist)
-
-    for p in sorted(all_packages):
-        if p not in union:
-            logging.warning("package '%s' has a maintainer, but doesn't exist in any architecture" % (p))
-
-    # find the set of packages which aren't in an arch
-#    for arch in common_constants.ARCHES:
-#        diff = union.difference(pset[arch])
-#        print("only in %s" % arch)
-#        print(sorted(diff))
-
-
-#
-#
-#
-
-if __name__ == "__main__":
-    homedir_default = common_constants.HOMEDIR
-    pkglist_default = common_constants.PKGMAINT
-    relarea_default = common_constants.FTP
-
-    parser = argparse.ArgumentParser(description='Compare arch package sets')
-    parser.add_argument('--homedir', action='store', metavar='DIR', help="maintainer home directory (default: " + homedir_default + ")", default=homedir_default)
-    parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
-    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
-    (args) = parser.parse_args()
-
-    if args.verbose:
-        logging.getLogger().setLevel(logging.INFO)
-
-    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
-
-    main(args)
diff --git a/fix-missing-cygwin-dep.py b/fix-missing-cygwin-dep.py
deleted file mode 100755
index 2a9b3ab..0000000
--- a/fix-missing-cygwin-dep.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2016 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.
-#
-
-#
-# Historically, cygwin was omitted from requires: and then upset added it back
-# using the autodep mechanism
-#
-# Now we want to remove that complexity and treat it like a normal dependency,
-# so this script fixes up setup.hints, adding cygwin to requires: where it
-# should be
-#
-
-import argparse
-import logging
-import os
-import re
-import sys
-import tarfile
-
-import common_constants
-import package
-
-
-#
-#
-#
-def main(args):
-    # build package list
-    packages = package.read_packages(args.rel_area, args.arch)
-
-    for pn, po in packages.items():
-        # package is source-only
-        if 'skip' in po.hints:
-            logging.info("%s is source-only" % (pn))
-            continue
-
-        # package requires: contains 'cygwin' already
-        #
-        # really this should use a whitespace boundary, not word boundary to
-        # avoid matching cygwin-debug etc., but we just happen to know that only
-        # debuginfo packages depend on cygwin-debuginfo which can safely be
-        # skipped as they will never depend on cygwin
-        requires = po.hints.get('requires', '')
-        if re.search(r'\bcygwin\b', requires):
-            logging.info("%s already has cygwin in requires" % (pn))
-            continue
-
-        # install tarfiles are all empty (usually because package is obsolete)
-        if all([t.is_empty for t in po.tars.values()]):
-            logging.info("%s has empty install tarfiles" % (pn))
-            continue
-
-        # search each install tarfile for executable files
-        #
-        # (any .exe or .dll file might have a dependency on cygwin1.dll, so for
-        # simplicity we will assume that it does)
-        amend = False
-        for t in po.tars:
-            logging.info("%s tarfile %s" % (pn, t))
-
-            if re.search(r'-src\.tar', t):
-                continue
-
-            if po.tars[t].is_empty:
-                continue
-
-            with tarfile.open(os.path.join(args.rel_area, args.arch, po.path, t)) as a:
-                if any(map(lambda f: re.search(r'^(bin|sbin|usr/bin|usr/lib|usr/libexec|usr/sbin)/.*\.(exe|dll|so|cmxs)$', f), a.getnames())):
-                    logging.info("%s: matched in %s" % (pn, t))
-                    amend = True
-                    break
-
-        if not amend:
-            continue
-
-        # adjust requires:, adding 'cygwin' to the end
-        logging.warning("Adding 'cygwin' to requires: in setup.hint for package '%s'" % (pn))
-        if len(requires) > 0:
-            requires = requires + ' '
-        po.hints['requires'] = requires + 'cygwin'
-
-        # write the modified setup.hint file
-        if 'parse-warnings' in po.hints:
-            del po.hints['parse-warnings']
-        if 'parse-errors' in po.hints:
-            del po.hints['parse-errors']
-
-        ofn = os.path.join(args.rel_area, args.arch, po.path, 'setup.hint')
-        fn = os.path.join(args.rel_area, args.arch, po.path, 'setup.hint.modified')
-        with open(fn, 'w') as f:
-            for k, v in po.hints.items():
-                print("%s: %s" % (k, v), file=f)
-
-        # show any 'unexpected' changes in the setup.hint
-        os.system("diff -u -I 'requires:' --ignore-blank-lines --ignore-space-change %s %s" % (ofn, fn))
-
-        # replace the setup.hint file
-        # (written this way so it doesn't spoil a hardlinked backup of the releasearea)
-        os.rename(fn, ofn)
-
-#
-#
-#
-if __name__ == "__main__":
-    relarea_default = common_constants.FTP
-
-    parser = argparse.ArgumentParser(description='requires fixer')
-    parser.add_argument('--arch', action='store', required=True, choices=common_constants.ARCHES)
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output', default=0)
-    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
-    (args) = parser.parse_args()
-
-    if args.verbose:
-        logging.getLogger().setLevel(logging.INFO)
-
-    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
-
-    main(args)
diff --git a/hint.py b/hint.py
deleted file mode 100755
index 2579fad..0000000
--- a/hint.py
+++ /dev/null
@@ -1,301 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# parser for setup.hint files
-#
-
-from collections import OrderedDict
-import re
-import argparse
-
-# keys which always have a value which may be multiline
-multilinevalkeys = ['ldesc', 'message']
-# keys which always have a value
-valkeys = ['curr', 'prev', 'test', 'category', 'external-source', 'sdesc']
-# keys which may have an empty value
-optvalkeys = ['requires']
-# keys which must have an empty value
-novalkeys = ['skip']
-
-hintkeys = multilinevalkeys + valkeys + optvalkeys + novalkeys
-
-# valid categories
-categories = ['accessibility',
-              'admin',
-              'archive',
-              'audio',
-              'base',
-              'comm',
-              'database',
-              'debug',
-              'devel',
-              'doc',
-              'editors',
-              'games',
-              'gnome',
-              'graphics',
-              'interpreters',
-              'kde',
-              'libs',
-              'lua',
-              'lxde',
-              'mail',
-              'mate',
-              'math',
-              'mingw',
-              'net',
-              'ocaml',
-              'office',
-              'perl',
-              'php',
-              'publishing',
-              'python',
-              'ruby',
-              'scheme',
-              'science',
-              'security',
-              'shells',
-              'sugar',
-              'system',
-              'tcl',
-              'text',
-              'utils',
-              'video',
-              'web',
-              'x11',
-              'xfce',
-              '_obsolete',
-              '_postinstalllast']
-
-
-#
-# A simple lexer to handle multi-line quoted values
-#
-# Historically, a multi-line quote is terminated only by a quote at the end of
-# the line, and embedded quotes are transformed to single quotes.  So there is
-# no escaping of embedded quotes, and no way to represent one.
-#
-# XXX: Fix the few packages which use embedded quotes, then we can switch this
-# to a simpler character by character lexer, which just reads until next
-# newline, and next quote when we encounter a quote.
-#
-def item_lexer(c):
-    i = -1
-    lines = c.splitlines()
-
-    while i < len(lines)-1:
-        i = i + 1
-        o = lines[i]
-
-        # discard lines starting with '#'
-        if o.startswith('#'):
-            continue
-
-        o = o.strip()
-
-        # discard empty lines
-        if not o:
-            continue
-
-        # line containing quoted text
-        if o.count('"') == 2:
-            yield (i, o, None)
-            continue
-
-        # if the line contains an opening quote
-        if '"' in o:
-            # continue reading lines till closing quote
-            while i < len(lines)-1:
-                i = i + 1
-                # multi-line quoted text preserves any leading space used for
-                # indentation, but removes any trailing space
-                o = o + '\n' + lines[i].rstrip()
-                # multi-line quoted text is only terminated by a quote at the
-                # end of the line
-                if o.endswith('"'):
-                    yield (i, o, None)
-                    break
-            else:
-                yield (i, o, "unterminated quote")
-
-            continue
-
-        # an unquoted line
-        yield (i, o, None)
-
-
-def setup_hint_parse(fn):
-    hints = OrderedDict()
-    errors = []
-    warnings = []
-
-    with open(fn, 'rb') as f:
-        c = f.read()
-
-        # validate that setup.hint is UTF-8 encoded
-        try:
-            c = c.decode('utf-8')
-
-            # parse as key:value items
-            for (i, item, error) in item_lexer(c):
-
-                if (error):
-                    errors.append('%s at line %d' % (error, i))
-
-                if (item.count('"') != 0) and (item.count('"') != 2):
-                    errors.append('embedded quote at line %d' % (i))
-
-                # key:value
-                match = re.match(r'^([^:\s]+):\s*(.*)$', item, re.DOTALL)
-                if match:
-                    key = match.group(1)
-                    value = match.group(2)
-
-                    if key not in hintkeys:
-                        errors.append('unknown setup key %s at line %d' % (key, i))
-                        continue
-
-                    # check if the key occurs more than once
-                    if key in hints:
-                        errors.append('duplicate key %s' % (key))
-
-                    # check the value meets any key-specific constraints
-                    if (key in valkeys) and (len(value) == 0):
-                        errors.append('%s has empty value' % (key))
-
-                    if (key in novalkeys) and (len(value) != 0):
-                        errors.append("%s has non-empty value '%s'" % (key, value))
-
-                    # validate all categories are in the category list (case-insensitively)
-                    if key == 'category':
-                        for c in value.split():
-                            if c.lower() not in categories:
-                                errors.append("unknown category '%s'" % (c))
-
-                    # verify that value for ldesc or sdesc is quoted
-                    # (genini forces this)
-                    if key in ['sdesc', 'ldesc']:
-                        if not (value.startswith('"') and value.endswith('"')):
-                            errors.append("%s value '%s' should be quoted" % (key, value))
-
-                    # if sdesc ends with a '.', warn and fix it
-                    if key == 'sdesc':
-                        if re.search(r'\."$', value):
-                            warnings.append("sdesc ends with '.'")
-                            value = re.sub(r'\."$', '"', value)
-
-                    # warn if sdesc contains '  '
-                    if key == 'sdesc':
-                        if '  ' in value:
-                            warnings.append("sdesc contains '  '")
-
-                    # only 'ldesc' and 'message' are allowed a multi-line value
-                    if (key not in multilinevalkeys) and (len(value.splitlines()) > 1):
-                        errors.append("key %s has multi-line value" % (key))
-
-                    # message must have an id and some text
-                    if key == 'message':
-                        if not re.match(r'(\S+)\s+(\S.*)', value):
-                            errors.append('message value must have id and text')
-
-                    # warn if value starts with a quote followed by whitespace
-                    if re.match(r'^"[ \t]+', value):
-                        warnings.append('value for key %s starts with quoted whitespace' % (key))
-
-                    # store the key:value
-                    hints[key] = value
-                else:
-                    errors.append("unknown setup construct '%s' at line %d" % (item, i))
-
-            # if 'skip' isn't present, 'category' and 'sdesc' must be
-            # XXX: genini also requires 'requires' but that seems wrong
-            if 'skip' not in hints:
-                mandatory = ['category', 'sdesc']
-                for k in mandatory:
-                    if k not in hints:
-                        errors.append("required key '%s' missing" % (k))
-
-            # warn if ldesc and sdesc seem transposed
-            #
-            # (Unfortunately we can't be totally strict about this, as some
-            # packages like to repeat the basic description in ldesc in every
-            # subpackage, but add to sdesc to distinguish the subpackages)
-            if 'ldesc' in hints:
-                if len(hints['sdesc']) > 2*len(hints['ldesc']):
-                    warnings.append('sdesc is much longer than ldesc')
-
-            # sort requires: as differences in ordering are uninteresting
-            if 'requires' in hints:
-                hints['requires'] = ' '.join(sorted(hints['requires'].split()))
-
-        except UnicodeDecodeError:
-            errors.append('invalid UTF-8')
-
-    if errors:
-        hints['parse-errors'] = errors
-
-    if warnings:
-        hints['parse-warnings'] = warnings
-
-    return hints
-
-
-#
-#
-#
-
-def main(args):
-    status = 0
-
-    for fn in args.files:
-        hints = setup_hint_parse(fn)
-
-        if args.verbose > 1:
-            print(hints)
-
-        if 'parse-warnings' in hints:
-            if args.verbose > 0:
-                for l in hints['parse-warnings']:
-                    print('%s: %s' % (fn, l))
-            status = 1
-
-        if 'parse-errors' in hints:
-            for l in hints['parse-errors']:
-                print('%s: %s' % (fn, l))
-            status = 255
-
-    return status
-
-#
-#
-#
-
-if __name__ == "__main__":
-    parser = argparse.ArgumentParser(description='setup.hint validator')
-    parser.add_argument('files', nargs='*', metavar='filename', help='list of files')
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output', default=0)
-
-    (args) = parser.parse_args()
-
-    exit(main(args))
diff --git a/maintainers.py b/maintainers.py
deleted file mode 100644
index 3d6d9c1..0000000
--- a/maintainers.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# utilities for working with a maintainer list
-#
-
-#
-# things we know about a maintainer:
-#
-# - their home directory
-# - the list of packages they maintain (given by cygwin-pkg-list)
-# - an email address (in HOME/!email (or !mail), as we don't want to publish
-#   it, and want to allow the maintainer to change it)
-#
-
-import itertools
-import logging
-import os
-import re
-import sys
-
-
-class Maintainer(object):
-    _homedirs = ''
-
-    def __init__(self, name, email=None, pkgs=None):
-        if email is None:
-            email = []
-        if pkgs is None:
-            pkgs = []
-
-        self.name = name
-        self.email = email
-        self.pkgs = pkgs
-
-    def __repr__(self):
-        return "maintainers.Maintainer('%s', %s, %s)" % (self.name, self.email, self.pkgs)
-
-    def homedir(self):
-        return os.path.join(Maintainer._homedirs, self.name)
-
-    @staticmethod
-    def _find(mlist, name):
-        mlist.setdefault(name, Maintainer(name))
-        return mlist[name]
-
-    # add maintainers which have existing directories
-    @classmethod
-    def add_directories(self, mlist, homedirs):
-        self._homedirs = homedirs
-
-        for n in os.listdir(homedirs):
-            if not os.path.isdir(os.path.join(homedirs, n)):
-                continue
-
-            m = Maintainer._find(mlist, n)
-
-            for e in ['!email', '!mail']:
-                email = os.path.join(homedirs, m.name, e)
-                if os.path.isfile(email):
-                    with open(email) as f:
-                        for l in f:
-                            # one address per line, ignore blank and comment lines
-                            if l.startswith('#'):
-                                continue
-                            l = l.strip()
-                            if l:
-                                m.email.append(l)
-
-        return mlist
-
-    # add maintainers from the package maintainers list, with the packages they
-    # maintain
-    @staticmethod
-    def add_packages(mlist,  pkglist, orphanMaint=None):
-        with open(pkglist) as f:
-            for (i, l) in enumerate(f):
-                l = l.rstrip()
-
-                # match lines of the form '<package> <maintainer(s)>'
-                match = re.match(r'^(\S+)\s+(.+)$', l)
-                if match:
-                    pkg = match.group(1)
-                    m = match.group(2)
-
-                    # if maintainer starts with a word in all caps, just use that
-                    (m, n) = re.subn(r'^([A-Z]+)\b.*$', r'\1', m)
-                    if n > 0:
-                        # ignore packages marked as 'OBSOLETE'
-                        if m == 'OBSOLETE':
-                            continue
-
-                        # orphaned packages get the default maintainer if we have
-                        # one, otherwise are assigned to 'ORPHANED'
-                        elif m == 'ORPHANED':
-                            if orphanMaint is not None:
-                                m = orphanMaint
-
-                        else:
-                            logging.error("unknown package status '%s' in line %s:%d: '%s'" % (m, pkglist, i, l))
-                            continue
-
-                    # joint maintainers are separated by '/'
-                    for name in m.split('/'):
-                        m = Maintainer._find(mlist, name)
-                        m.pkgs.append(pkg)
-
-                else:
-                    logging.error("unrecognized line in %s:%d: '%s'" % (pkglist, i, l))
-
-        return mlist
-
-    # create maintainer list
-    @staticmethod
-    def read(args):
-        mlist = {}
-        mlist = Maintainer.add_directories(mlist, args.homedir)
-        mlist = Maintainer.add_packages(mlist, args.pkglist, getattr(args, 'orphanmaint', None))
-
-        return mlist
-
-    # a list of all packages
-    @staticmethod
-    def all_packages(mlist):
-        return list(itertools.chain.from_iterable(mlist[m].pkgs for m in mlist))
-
-#
-# We must be able to use pathnames which contain any character in the maintainer
-# name, read from the maintainer list file.
-#
-# So, this test is somewhat sloppy.  In theory the filesystem encoding might be
-# some encoding which can represent the subset of the io encoding that
-# maintainer names actually use.  In practice, use a utf-8 locale.
-#
-
-if sys.getfilesystemencoding() != sys.getdefaultencoding():
-    print("IO encoding is '%s', filesystem encoding is '%s'" % (sys.getdefaultencoding(), sys.getfilesystemencoding()), file=sys.stderr)
-    print('It is required that IO encoded strings are convertible to the filesystem encoding', file=sys.stderr)
-    print("Please set the locale", file=sys.stderr)
-    exit(1)
diff --git a/mkmaintdir b/mkmaintdir
deleted file mode 100755
index cadeaa6..0000000
--- a/mkmaintdir
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# create maintainer upload directories
-#
-# a re-implementation of the mkpkgdir perl script in python
-# intended to be run from crontab every 5 minutes
-#
-# - Read existing maintainer directories, build a list of maintainer
-# - Read cygwin-pkg-maint, add to list of maintainers, and build a list of
-#   packages for each maintainer
-# - Assign orpahaned packages to the project lead(s)
-# - For each maintainer, create a home directory, set permissions, and write a
-#   !packages file
-# - Report if the maintainer has no packages and mark with !defunct
-#
-
-import argparse
-import grp
-import logging
-import os
-import pwd
-import re
-import sys
-
-import common_constants
-import maintainers
-
-#
-#
-#
-
-cygwin_uid = pwd.getpwnam('cygwin').pw_uid
-cygstage_gid = grp.getgrnam('cygstage').gr_gid
-
-# different values to be used when we are not running on sourceware.org, but my
-# test system...
-if os.uname()[1] == 'tambora':
-    cygwin_uid = pwd.getpwnam('jon').pw_uid
-    cygstage_gid = grp.getgrnam('None').gr_gid
-
-
-#
-#
-#
-
-def main(args):
-    # clear the umask in case it is set
-    os.umask(0)
-
-    # create maintainer list
-    mlist = {}
-    mlist = maintainers.Maintainer.add_directories(mlist, args.homedir)
-    mlist = maintainers.Maintainer.add_packages(mlist, args.pkglist, args.orphanmaint)
-
-    # create or suggest removal for each maintainer directory
-    for name in sorted(mlist.keys()):
-        m = mlist[name]
-        dirpath = m.homedir()
-
-        # if the path exists, but isn't a directory
-        if os.path.exists(dirpath) and not os.path.isdir(dirpath):
-            logging.error("%s exists and isn't a directory!" % dirpath)
-            continue
-
-        # ensure the upload directory exists, with appropriate permissions, owner and contents
-        logging.info('processing %s' % dirpath)
-        if not args.dryrun:
-            os.makedirs(dirpath, exist_ok=True)
-            os.chown(dirpath, cygwin_uid, cygstage_gid)
-            os.chmod(dirpath, 0o2775)
-            # write !packages file (we don't use this for anything anymore, but
-            # keep it around for information)
-            with open(os.path.join(dirpath, '!packages'), 'w') as fd:
-                os.fchown(fd.fileno(), cygwin_uid, cygstage_gid)
-                print('|'.join([re.escape(p) for p in m.pkgs]), file=fd)
-            # and create arch subdirectories, with appropriate owner
-            for subdir in common_constants.ARCHES:
-                os.makedirs(os.path.join(dirpath, subdir, 'release'), exist_ok=True)
-                os.chown(os.path.join(dirpath, subdir, 'release'), cygwin_uid, cygstage_gid)
-
-        # create/remove !defunct as appropriate
-        defunct = os.path.join(dirpath, '!defunct')
-        if len(m.pkgs) == 0:
-            # if they have no packages, suggest removing their upload directory (once)
-            if not os.path.exists(defunct):
-                logging.warning("defunct maintainer %s, consider removing their directory?" % name)
-                if not args.dryrun:
-                    open(defunct, 'w').close()
-        else:
-            # remove defunct marker if no longer defunct
-            if os.path.exists(defunct):
-                logging.info("maintainer %s no longer defunct" % name)
-                if not args.dryrun:
-                    os.unlink(defunct)
-
-#
-#
-#
-
-if __name__ == "__main__":
-    homedir_default = common_constants.HOMEDIR
-    orphanmaint_default = common_constants.ORPHANMAINT
-    pkglist_default = common_constants.PKGMAINT
-
-    parser = argparse.ArgumentParser(description='Create maintainer upload directories')
-    parser.add_argument('--homedir', action='store', metavar='DIR', help="maintainer home directory (default: " + homedir_default + ")", default=homedir_default)
-    parser.add_argument('--orphanmaint', action='store', metavar='NAMES', help="orphan package maintainers (default: '" + orphanmaint_default + "')", default=orphanmaint_default)
-    parser.add_argument('--pkglist', action='store', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", default=pkglist_default)
-    parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun', help="don't do anything")
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
-    (args) = parser.parse_args()
-
-    if args.verbose:
-        logging.getLogger().setLevel(logging.INFO)
-
-    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
-
-    main(args)
diff --git a/mksetupini b/mksetupini
deleted file mode 100755
index f87a53c..0000000
--- a/mksetupini
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# mksetupini
-#
-# Make a setup.ini file from a collection of tarfiles and setup.hints
-# (this is intended to be a replacement for genini)
-#
-
-import argparse
-import logging
-import os
-import sys
-
-import common_constants
-import hint
-import package
-
-try:
-    import spelling
-except ImportError:
-    pass
-
-
-#
-#
-#
-def main(args):
-    # build package list
-    packages = package.read_packages(args.rel_area, args.arch)
-
-    # spellcheck text hints
-    if args.spell:
-        if spelling:
-            spelling.spellcheck_hints(args, packages)
-        else:
-            logging.error("spell-checking support not available")
-
-    # validate the package set
-    if not package.validate_packages(args, packages):
-        logging.error("package set has errors, not writing setup.ini")
-        return
-
-    # write setup.ini
-    package.write_setup_ini(args, packages, args.arch)
-
-    if args.stats:
-        stats(packages)
-
-
-#
-#
-#
-
-def stats(packages):
-    # make a histogram of categories
-    histogram = {}
-
-    for c in hint.categories:
-        histogram[c.lower()] = 0
-
-    for p in packages.values():
-        if 'category' in p.hints:
-            for c in p.hints['category'].split():
-                histogram.setdefault(c.lower(), 0)
-                histogram[c.lower()] += 1
-
-    for c in sorted(histogram, key=histogram.get, reverse=True):
-        print('%16s: %4d' % (c, histogram[c]))
-
-#
-#
-#
-if __name__ == "__main__":
-    pkglist_default = common_constants.PKGMAINT
-    relarea_default = common_constants.FTP
-
-    parser = argparse.ArgumentParser(description='Make setup.ini')
-    parser.add_argument('--arch', action='store', required=True, choices=common_constants.ARCHES)
-    parser.add_argument('--inifile', '-u', action='store', help='output filename', required=True)
-    parser.add_argument('--okmissing', action='append', help='missing things are ok', choices=['required-package'])
-    parser.add_argument('--pkglist', action='store', nargs='?', metavar='FILE', help="package maintainer list (default: " + pkglist_default + ")", const=pkglist_default)
-    parser.add_argument('--release', action='store', help='value for setup-release key (default: cygwin)', default='cygwin')
-    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
-    parser.add_argument('--spell', action='store_true', help='spellcheck text hints')
-    parser.add_argument('--stats', action='store_true', help='show additional package statistics')
-    parser.add_argument('--setup-version', action='store', metavar='VERSION', help='value for setup-version key')
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
-    (args) = parser.parse_args()
-
-    if args.verbose:
-        logging.getLogger().setLevel(logging.INFO)
-
-    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
-
-    main(args)
diff --git a/package.py b/package.py
deleted file mode 100755
index b515c2e..0000000
--- a/package.py
+++ /dev/null
@@ -1,681 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# utilities for working with a package database
-#
-
-from collections import defaultdict
-import copy
-import difflib
-import hashlib
-import logging
-import os
-import pprint
-import re
-import tarfile
-import textwrap
-import time
-
-from version import SetupVersion
-import common_constants
-import hint
-import maintainers
-import past_mistakes
-
-
-# information we keep about a package
-class Package(object):
-    def __init__(self):
-        self.path = ''  # path to package, relative to release area
-        self.tars = {}
-        self.hints = {}
-
-    def __repr__(self):
-        return "Package('%s', %s, %s)" % (self.path, pprint.pformat(self.tars),
-                                          pprint.pformat(self.hints))
-
-
-# information we keep about a tar file
-class Tar(object):
-    def __init__(self):
-        self.sha512 = ''
-        self.size = 0
-        self.is_empty = False
-        self.is_used = False
-
-    def __repr__(self):
-        return "Tar('%s', %d, %s)" % (self.sha512, self.size, self.is_empty)
-
-
-#
-# read a packages from a directory hierarchy
-#
-def read_packages(rel_area, arch):
-    packages = defaultdict(Package)
-
-    # both noarch/ and <arch>/ directories are considered
-    for root in ['noarch', arch]:
-        releasedir = os.path.join(rel_area, root)
-        logging.debug('reading packages from %s' % releasedir)
-
-        for (dirpath, subdirs, files) in os.walk(releasedir):
-            read_package(packages, rel_area, dirpath, files)
-
-        logging.debug("%d packages read" % len(packages))
-
-    return packages
-
-
-# helper function to compute sha512 for a particular file
-# (block_size should be some multiple of sha512 block size which can be efficiently read)
-def sha512_file(fn, block_size=256*128):
-    sha512 = hashlib.sha512()
-
-    with open(fn, 'rb') as f:
-        for chunk in iter(lambda: f.read(block_size), b''):
-            sha512.update(chunk)
-
-    return sha512.hexdigest()
-
-
-#
-# read a single package
-#
-def read_package(packages, basedir, dirpath, files, strict=False):
-    strict_lvl = logging.ERROR if strict else logging.WARNING
-    relpath = os.path.relpath(dirpath, basedir)
-    warnings = False
-
-    if 'setup.hint' in files:
-        files.remove('setup.hint')
-        # the package name is always the directory name
-        p = os.path.basename(dirpath)
-
-        if not re.match(r'^[\w\-._+]*$', p):
-            logging.error("package '%s' name contains illegal characters" % p)
-            return True
-
-        # check for duplicate package names at different paths
-        if p in packages:
-            logging.error("duplicate package name at paths %s and %s" %
-                          (dirpath, packages[p].path))
-            return True
-
-        # read setup.hints
-        hints = hint.setup_hint_parse(os.path.join(dirpath, 'setup.hint'))
-        if 'parse-errors' in hints:
-            for l in hints['parse-errors']:
-                logging.error("package '%s': %s" % (p, l))
-            logging.error("errors while parsing hints for package '%s'" % p)
-            return True
-        if 'parse-warnings' in hints:
-            for l in hints['parse-warnings']:
-                logging.info("package '%s': %s" % (p, l))
-
-        # read sha512.sum
-        sha512 = {}
-        if 'sha512.sum' not in files:
-            logging.debug("no sha512.sum for package '%s'" % p)
-        else:
-            files.remove('sha512.sum')
-
-            with open(os.path.join(dirpath, 'sha512.sum')) as fo:
-                for l in fo:
-                    match = re.match(r'^(\S+)\s+(?:\*|)(\S+)$', l)
-                    if match:
-                        sha512[match.group(2)] = match.group(1)
-                    else:
-                        logging.warning("bad line '%s' in sha512.sum for package '%s'" % (l, p))
-
-        # discard obsolete md5.sum
-        if 'md5.sum' in files:
-            files.remove('md5.sum')
-
-        # collect the attributes for each tar file
-        tars = {}
-
-        for f in list(filter(lambda f: re.match(r'^' + re.escape(p) + r'.*\.tar.*$', f), files)):
-            files.remove(f)
-
-            # warn if tar filename doesn't follow P-V-R naming convention
-            #
-            # P must match the package name, V can contain anything, R must
-            # start with a number
-            match = re.match(r'^' + re.escape(p) + '-(.+)-(\d[0-9a-zA-Z.]*)(-src|)\.tar\.(bz2|gz|lzma|xz)$', f)
-            if not match:
-                logging.log(strict_lvl, "tar file '%s' in package '%s' doesn't follow naming convention" % (f, p))
-                warnings = True
-            else:
-                # historically, V can contain a '-' (since we can use the fact
-                # we already know P to split unambiguously), but this is a bad
-                # idea.
-                if '-' in match.group(1):
-                    lvl = logging.WARNING if p not in past_mistakes.hyphen_in_version else logging.INFO
-                    logging.log(lvl, "tar file '%s' in package '%s' contains '-' in version" % (f, p))
-
-                if not match.group(1)[0].isdigit():
-                    logging.warning("tar file '%s' in package '%s' has a version which doesn't start with a digit" % (f, p))
-
-            tars[f] = Tar()
-            tars[f].size = os.path.getsize(os.path.join(dirpath, f))
-            tars[f].is_empty = tarfile_is_empty(os.path.join(dirpath, f))
-
-            if f in sha512:
-                tars[f].sha512 = sha512[f]
-            else:
-                tars[f].sha512 = sha512_file(os.path.join(dirpath, f))
-                logging.debug("no sha512.sum line for file %s in package '%s', computed sha512 hash is %s" % (f, p, tars[f].sha512))
-
-        # ignore dotfiles
-        for f in files:
-            if f.startswith('.'):
-                files.remove(f)
-
-        # warn about unexpected files, including tarfiles which don't match the
-        # package name
-        if files:
-            logging.log(strict_lvl, "unexpected files in %s: %s" % (p, ', '.join(files)))
-            warnings = True
-
-        packages[p].hints = hints
-        packages[p].tars = tars
-        packages[p].path = relpath
-
-        #
-        # now we have read the package, fix some common defects in the hints
-        #
-
-        # note if the package is self-source
-        # XXX: this should really be defined as a setup.hint key
-        if p in past_mistakes.self_source:
-            packages[p].hints['self-source'] = ''
-
-        # don't allow a redundant 'package:' or 'package - ' at start of sdesc
-        #
-        # match case-insensitively, and use a base package name (trim off any
-        # leading 'lib' from package name, remove any soversion or 'devel'
-        # suffix)
-        #
-        if 'sdesc' in hints:
-            colon = re.match(r'^"(.*?)(\s*:|\s+-)', hints['sdesc'])
-            if colon:
-                package_basename = re.sub(r'^lib(.*?)(|-devel|\d*)$', r'\1', p)
-                if package_basename.upper().startswith(colon.group(1).upper()):
-                    logging.log(strict_lvl, "package '%s' sdesc starts with '%s'; this is redundant as the UI will show both the package name and sdesc" % (p, ''.join(colon.group(1, 2))))
-                    warnings = True
-
-    elif (len(files) > 0) and (relpath.count(os.path.sep) > 1):
-        logging.warning("no setup.hint in %s but has files: %s" % (dirpath, ', '.join(files)))
-
-    if strict:
-        return warnings
-
-    return False
-
-
-#
-# utility to determine if a tar file is empty
-#
-def tarfile_is_empty(tf):
-    # sometimes compressed empty files are used rather than a compressed empty
-    # tar archive
-    if os.path.getsize(tf) <= 32:
-        return True
-
-    # parsing the tar archive just to determine if it contains at least one
-    # archive member is relatively expensive, so we just assume it contains
-    # something if it's over a certain size threshold
-    if os.path.getsize(tf) > 1024:
-        return False
-
-    # if it's really a tar file, does it contain zero files?
-    with tarfile.open(tf) as a:
-        if any(a) == 0:
-            return True
-
-    return False
-
-
-# a sorting which forces packages which begin with '!' to be sorted first,
-# packages which begin with '_" to be sorted last, and others to be sorted
-# case-insensitively
-def sort_key(k):
-    k = k.lower()
-    if k[0] == '!':
-        k = chr(0) + k
-    elif k[0] == '_':
-        k = chr(255) + k
-    return k
-
-
-#
-# validate the package database
-#
-def validate_packages(args, packages):
-    error = False
-
-    for p in sorted(packages.keys()):
-        logging.debug("validating package '%s'" % (p))
-
-        if 'required-package' not in getattr(args, 'okmissing', []):
-            # all packages listed in requires must exist
-            if 'requires' in packages[p].hints:
-                for r in packages[p].hints['requires'].split():
-                    if r not in packages:
-                        logging.error("package '%s' requires nonexistent package '%s'" % (p, r))
-                        error = True
-
-                        # a package is should not appear in it's own requires
-                        if r == p:
-                            lvl = logging.WARNING if p not in past_mistakes.self_requires else logging.INFO
-                            logging.log(lvl, "package '%s' requires itself" % (p))
-
-        # if external-source is used, the package must exist
-        if 'external-source' in packages[p].hints:
-            e = packages[p].hints['external-source']
-            if e not in packages:
-                logging.error("package '%s' refers to nonexistent external-source '%s'" % (p, e))
-                error = True
-
-        packages[p].vermap = defaultdict(defaultdict)
-        is_empty = {}
-        has_install = False
-
-        for t in packages[p].tars:
-            # categorize each tarfile as either 'source' or 'install'
-            if re.search(r'-src\.tar', t):
-                category = 'source'
-            else:
-                category = 'install'
-                has_install = True
-                is_empty[t] = packages[p].tars[t].is_empty
-
-            # extract just the version part from tar filename
-            v = re.sub(r'^' + re.escape(p) + '-', '', t)
-            v = re.sub(r'(-src|)\.tar\.(bz2|gz|lzma|xz)$', '', v)
-
-            # for each version, a package can contain at most one source tar
-            # file and at most one install tar file.  warn if we have too many
-            # (for e.g. both a .xz and .bz2 install tar file)
-            if category in packages[p].vermap[v]:
-                logging.error("package '%s' has more than one %s tar file for version '%s'" % (p, category, v))
-                error = True
-
-            # store tarfile corresponding to this version and category
-            packages[p].vermap[v][category] = t
-
-        # if the package has no install tarfiles (i.e. is source only), make
-        # sure it is marked as 'skip' (which really means 'source-only' at the
-        # moment)
-        #
-        # (this needs to take place after uploads have been merged into the
-        # package set, so that an upload containing just a replacement
-        # setup.hint is not considered a source-only package)
-        #
-        # XXX: the check should probably be for any non-empty install files, but
-        # that differs from what upset does
-        if not has_install and 'skip' not in packages[p].hints:
-            packages[p].hints['skip'] = ''
-            logging.info("package '%s' appears to be source-only as it has no install tarfiles, adding 'skip:' hint" % (p))
-
-        # verify the versions specified for stability level exist
-        levels = ['test', 'curr', 'prev']
-        for l in levels:
-            if l in packages[p].hints:
-                # check that version exists
-                v = packages[p].hints[l]
-                if v not in packages[p].vermap:
-                    logging.error("package '%s' stability '%s' selects non-existent version '%s'" % (p, l, v))
-                    error = True
-
-        # assign a version to each stability level
-        packages[p].stability = defaultdict()
-
-        # sort in order from highest to lowest version
-        for v in sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True):
-            level_found = False
-
-            while True:
-                # no stability levels left
-                if len(levels) == 0:
-                    # XXX: versions which don't correspond to any stability level
-                    # should be reported, we might want to remove them at some point
-                    logging.log(5, "package '%s' has no stability levels left for version '%s'" % (p, v))
-                    break
-
-                l = levels[0]
-
-                # if current stability level has an override
-                if l in packages[p].hints:
-                    # if we haven't reached that version yet
-                    if v != packages[p].hints[l]:
-                        break
-                    else:
-                        logging.debug("package '%s' stability '%s' overridden to version '%s'" % (p, l, v))
-                else:
-                    # level 'test' must be assigned by override
-                    if l == 'test':
-                        levels.remove(l)
-                        # go around again to check for override at the new level
-                        continue
-
-                level_found = True
-                logging.log(5, "package '%s' stability '%s' assigned version '%s'" % (p, l, v))
-                break
-
-            if not level_found:
-                continue
-
-            # assign version to level
-            packages[p].stability[l] = v
-            # and remove from list of unallocated levels
-            levels.remove(l)
-
-        # lastly, fill in any levels which we skipped over because a higher
-        # stability level was overriden to a lower version
-        for l in levels:
-            if l in packages[p].hints:
-                packages[p].stability[l] = packages[p].hints[l]
-
-        # If, for every stability level, the install tarball is empty and there
-        # is no source tarball, we should probably be marked obsolete
-        if 'skip' not in packages[p].hints:
-            if '_obsolete' not in packages[p].hints['category']:
-                has_something = False
-
-                for l in ['test', 'curr', 'prev']:
-                    if l in packages[p].stability:
-                        v = packages[p].stability[l]
-                        if 'source' in packages[p].vermap[v]:
-                            has_something = True
-                        elif 'install' in packages[p].vermap[v]:
-                            if not packages[p].tars[packages[p].vermap[v]['install']].is_empty:
-                                has_something = True
-
-                if not has_something:
-                    logging.warning("package '%s' has empty install tar file and no source for all levels, but it's not in the _obsolete category" % (p))
-
-    # make another pass to verify a source tarfile exists for every install
-    # tarfile version
-    for p in sorted(packages.keys()):
-        for v in sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True):
-            if 'install' not in packages[p].vermap[v]:
-                continue
-
-            # unless the install tarfile is empty
-            if packages[p].tars[packages[p].vermap[v]['install']].is_empty:
-                continue
-
-            # source tarfile may be either in this package or in the
-            # external-source package
-            #
-            # mark the source tarfile as being used by an install tarfile
-            if 'source' in packages[p].vermap[v]:
-                packages[p].tars[packages[p].vermap[v]['source']].is_used = True
-                continue
-
-            if 'external-source' in packages[p].hints:
-                es_p = packages[p].hints['external-source']
-                if es_p in packages:
-                    if 'source' in packages[es_p].vermap[v]:
-                        packages[es_p].tars[packages[es_p].vermap[v]['source']].is_used = True
-                        continue
-
-            # unless this package is marked as 'self-source'
-            if 'self-source' in packages[p].hints:
-                continue
-
-            logging.error("package '%s' version '%s' is missing source" % (p, v))
-            error = True
-
-    # make another pass to verify that each non-empty source tarfile version has
-    # at least one corresponding non-empty install tarfile, in some package.
-    for p in sorted(packages.keys()):
-        for v in sorted(packages[p].vermap.keys(), key=lambda v: SetupVersion(v), reverse=True):
-            if 'source' not in packages[p].vermap[v]:
-                continue
-
-            if packages[p].tars[packages[p].vermap[v]['source']].is_empty:
-                continue
-
-            if not packages[p].tars[packages[p].vermap[v]['source']].is_used:
-                logging.error("package '%s' version '%s' source has no non-empty install tarfiles" % (p, v))
-                error = True
-
-    # validate that all packages are in the package maintainers list
-    validate_package_maintainers(args, packages)
-
-    return not error
-
-
-#
-def validate_package_maintainers(args, packages):
-    if not args.pkglist:
-        return
-
-    # read maintainer list
-    mlist = {}
-    mlist = maintainers.Maintainer.add_packages(mlist, args.pkglist)
-
-    # make the list of all packages
-    all_packages = maintainers.Maintainer.all_packages(mlist)
-
-    # validate that all packages are in the package list
-    for p in sorted(packages):
-        # ignore skip packages
-        if 'skip' in packages[p].hints:
-            continue
-        # ignore obsolete packages
-        if '_obsolete' in packages[p].hints['category']:
-            continue
-        if not is_in_package_list(packages[p].path, all_packages):
-            logging.error("package '%s' is not in the package list" % (p))
-
-
-#
-# write setup.ini
-#
-def write_setup_ini(args, packages, arch):
-
-    logging.debug('writing %s' % (args.inifile))
-
-    with open(args.inifile, 'w') as f:
-        os.fchmod(f.fileno(), 0o644)
-
-        # write setup.ini header
-        print(textwrap.dedent('''\
-        # This file is automatically generated.  If you edit it, your
-        # edits will be discarded next time the file is generated.
-        # See http://cygwin.com/setup.html for details.
-        #'''), file=f)
-
-        if args.release:
-            print("release: %s" % args.release, file=f)
-        print("arch: %s" % arch, file=f)
-        print("setup-timestamp: %d" % time.time(), file=f)
-        if args.setup_version:
-            print("setup-version: %s" % args.setup_version, file=f)
-
-        # for each package
-        for p in sorted(packages.keys(), key=sort_key):
-            # do nothing if 'skip'
-            if 'skip' in packages[p].hints:
-                continue
-
-            # write package data
-            print("\n@ %s" % p, file=f)
-
-            print("sdesc: %s" % packages[p].hints['sdesc'], file=f)
-
-            if 'ldesc' in packages[p].hints:
-                print("ldesc: %s" % packages[p].hints['ldesc'], file=f)
-
-            # for historical reasons, category names must start with a capital
-            # letter
-            category = ' '.join(map(upper_first_character, packages[p].hints['category'].split()))
-            print("category: %s" % category, file=f)
-
-            if 'requires' in packages[p].hints:
-                # for historical reasons, empty requires are suppressed
-                requires = packages[p].hints['requires']
-                if requires:
-                    print("requires: %s" % requires, file=f)
-
-            # write tarfile lines for each stability level
-            for level in ['curr', 'prev', 'test']:
-                if level in packages[p].stability:
-                    version = packages[p].stability[level]
-                    if level != 'curr':
-                        print("[%s]" % level, file=f)
-                    print("version: %s" % version, file=f)
-
-                    if 'install' in packages[p].vermap[version]:
-                        t = packages[p].vermap[version]['install']
-                        tar_line('install', packages[p], t, f)
-
-                    # look for corresponding source in this package first
-                    if 'source' in packages[p].vermap[version]:
-                        t = packages[p].vermap[version]['source']
-                        tar_line('source', packages[p], t, f)
-                    # if that doesn't exist, follow external-source
-                    elif 'external-source' in packages[p].hints:
-                        s = packages[p].hints['external-source']
-                        if 'source' in packages[s].vermap[version]:
-                            t = packages[s].vermap[version]['source']
-                            tar_line('source', packages[s], t, f)
-                        else:
-                            logging.warning("package '%s' version '%s' has no source in external-source '%s'" % (p, version, s))
-
-            if 'message' in packages[p].hints:
-                print("message: %s" % packages[p].hints['message'], file=f)
-
-
-# helper function to output details for a particular tar file
-def tar_line(category, p, t, f):
-    fn = os.path.join(p.path, t)
-    sha512 = p.tars[t].sha512
-    size = p.tars[t].size
-    print("%s: %s %d %s" % (category, fn, size, sha512), file=f)
-
-
-# helper function to change the first character of a string to upper case,
-# without altering the rest
-def upper_first_character(s):
-    return s[:1].upper() + s[1:]
-
-
-#
-# merge sets of packages
-#
-# for each package which exist in both a and b:
-# - they must exist at the same relative path
-# - we combine the list of tarfiles, duplicates are not permitted
-# - we use the hints from b, and warn if they are different to the hints for a
-#
-def merge(a, *l):
-    # start with a copy of a
-    c = copy.deepcopy(a)
-
-    for b in l:
-        for p in b:
-            # if the package is in b but not in a, add it to the copy
-            if p not in a:
-                c[p] = b[p]
-            # else, if the package is both in a and b, we have to do a merge
-            else:
-                # package must exist at same relative path
-                if a[p].path != b[p].path:
-                    logging.error("package '%s' is at paths %s and %s" % (p, a[p].path, b[p].path))
-                    return None
-                else:
-                    for t in b[p].tars:
-                        if t in c[p].tars:
-                            logging.error("package '%s' has duplicate tarfile %s" % (p, t))
-                            return None
-                        else:
-                            c[p].tars[t] = b[p].tars[t]
-
-                    # use hints from b, but warn if they have changed
-                    if a[p].hints != b[p].hints:
-                        c[p].hints = b[p].hints
-
-                        diff = '\n'.join(difflib.ndiff(
-                            pprint.pformat(a[p].hints).splitlines(),
-                            pprint.pformat(b[p].hints).splitlines()))
-
-                        logging.warning("package '%s' hints changed\n%s" % (p, diff))
-
-    return c
-
-
-#
-# delete a file from a package set
-#
-
-def delete(packages, path, fn):
-    for p in packages:
-        if packages[p].path == path:
-            for t in packages[p].tars:
-                if t == fn:
-                    del packages[p].tars[t]
-                    break
-
-
-#
-# verify that the package ppath is in the list of packages plist
-#
-# (This means that a maintainer can upload a package with any name, provided the
-# path contains one allowed for that maintainer)
-#
-# This avoids the need to have to explicitly list foo, foo_autorebase,
-# foo-devel, foo-doc, foo-debuginfo, libfoo0, girepository-foo, etc. instead of
-# just foo in the package list
-#
-# But means only the rule that a package can't exist in multiple paths prevents
-# arbitrary package upload.
-#
-
-def package_list_re(plist):
-    if getattr(package_list_re, "_plist", []) != plist:
-        pattern = '|'.join(map(lambda p: r'/' + re.escape(p) + r'(?:/|$)', plist))
-        package_list_re._regex = re.compile(pattern, re.IGNORECASE)
-        package_list_re._plist = plist
-
-    return package_list_re._regex
-
-
-def is_in_package_list(ppath, plist):
-    if package_list_re(plist).search(ppath):
-        return True
-
-    return False
-
-
-#
-#
-#
-if __name__ == "__main__":
-    for arch in common_constants.ARCHES:
-        packages = read_packages(common_constants.FTP, arch)
-        print("arch %s has %d packages" % (arch, len(packages)))
diff --git a/past_mistakes.py b/past_mistakes.py
deleted file mode 100644
index 5e1132f..0000000
--- a/past_mistakes.py
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# For things we really want to warn on but there are annoyingly many existing
-# uses, we have a list of existing uses we can forgive, so we can warn on new
-# uses.
-#
-
-# package names which have been used with versions containing a hyphen
-hyphen_in_version = [
-    'ctorrent',
-    'email',
-    'email-debuginfo',
-    'fdupes',
-    'gendef',
-    'gendef-debuginfo',
-    'gtk3-engines-unico',
-    'gtk3-engines-unico-debuginfo',
-    'hidapi',
-    'hidapi-debuginfo',
-    'libhidapi-devel',
-    'libhidapi0',
-    'libmangle',
-    'libmangle-debuginfo',
-    'man-pages-posix',
-    'mingw64-i686-hidapi',
-    'mingw64-i686-hidapi-debuginfo',
-    'mingw64-x86_64-hidapi',
-    'mingw64-x86_64-hidapi-debuginfo',
-    'recode',
-    'recode-debuginfo',
-    'socat',
-    'socat-debuginfo',
-    'tack',
-    'tack-debuginfo',
-    'xemacs-mule-sumo',
-    'xemacs-sumo',
-    'xview',
-    'xview-devel',
-]
-
-# cygport places this into the requires of every debuginfo package
-self_requires = [
-    'cygwin-debuginfo'
-]
-
-# these are packages which only contain data, symlinks or scripts and thus
-# function as their own source
-self_source = [
-    'R_autorebase',
-    '_update-info-dir',
-    'base-cygwin',
-    'base-files',  # older versions were self-source, but current one isn't
-    'chere',
-    'cygcheck-dep',
-    'gcc4-core',
-    'gcc4-g++',
-    'tesseract-ocr-deu',  # unclear how these are delivered by upstream and how they are packaged
-    'tesseract-ocr-deu-f',
-    'tesseract-ocr-eng',
-    'tesseract-ocr-fra',
-    'tesseract-ocr-ita',
-    'tesseract-ocr-nld',
-    'tesseract-ocr-por',
-    'tesseract-ocr-spa',
-    'tesseract-ocr-vie',
-    'tesseract-training-core',
-    'tesseract-training-deu',
-    'tesseract-training-eng',
-    'tesseract-training-fra',
-    'tesseract-training-ita',
-    'tesseract-training-nld',
-    'tesseract-training-por',
-    'tesseract-training-spa',
-    'tesseract-training-vie',
-]
diff --git a/pep8 b/pep8
index 572ac2d..88158d7 100755
--- a/pep8
+++ b/pep8
@@ -1,2 +1,2 @@
 #!/bin/sh
-grep -s -l '^#!/usr/bin/env python' * | xargs python3 -m pep8 --count --show-source --max-line-length=240
+grep -s -l '^#!/usr/bin/env python' calm/* tests/* | xargs python3 -m pep8 --count --show-source --max-line-length=240
diff --git a/pkg2html.py b/pkg2html.py
deleted file mode 100755
index 2e16076..0000000
--- a/pkg2html.py
+++ /dev/null
@@ -1,239 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# write package listing HTML files
-#
-# - build a list of all files under HTDOCS/packages/<arch>
-# - for each package in the package database
-# --- create a .htaccess file in the package directory, if not present
-# -- for each tar file
-# --- if a package listing HTML file doesn't already exist
-# ---- write a HTML package listing file listing the tar file contents
-# - write packages.inc, the list of packages
-# - remove any listing files for which there was no package
-# - remove any empty directories (TBD)
-#
-# note that the directory hierarchy of (noarch|arch)/package/subpackages is
-# flattened in the package listing to just the package name
-#
-
-from collections import defaultdict
-import argparse
-import glob
-import logging
-import os
-import re
-import sys
-import tarfile
-import textwrap
-import time
-
-import common_constants
-import package
-
-
-#
-#
-#
-
-def update_package_listings(args, packages, arch):
-    base = os.path.join(args.htdocs, arch)
-    if not args.dryrun:
-        try:
-            os.makedirs(base, exist_ok=True)
-        except FileExistsError:
-            pass
-
-    #
-    # write base directory .htaccess, if needed
-    #
-    # force trying to access the base directory to redirect to the package list
-    # page, as having the server index this directory containing lots of
-    # subdirectories makes this URL very expensive to serve if someone stumbles
-    # onto it by accident)
-    #
-
-    htaccess = os.path.join(base, '.htaccess')
-    if not os.path.exists(htaccess) or args.force:
-        logging.debug('writing %s' % htaccess)
-        if not args.dryrun:
-            with open(htaccess, 'w') as f:
-
-                print('Redirect temp /packages/%s/index.html https://cygwin.com/packages/package_list.html' % (arch),
-                      file=f)
-
-    toremove = glob.glob(os.path.join(base, '*', '*'))
-
-    for p in packages:
-
-        # do nothing for packages marked 'skip'
-        if 'skip' in packages[p].hints:
-            continue
-
-        dir = os.path.join(base, p)
-        if not args.dryrun:
-            try:
-                os.makedirs(dir, exist_ok=True)
-            except FileExistsError:
-                pass
-            os.chmod(dir, 0o777)
-
-        #
-        # write .htaccess if needed
-        #
-
-        htaccess = os.path.join(dir, '.htaccess')
-        if not os.path.exists(htaccess):
-            logging.debug('writing %s' % htaccess)
-            if not args.dryrun or args.force:
-                with open(htaccess, 'w') as f:
-
-                    print(textwrap.dedent('''\
-                                             Options Indexes
-                                             IndexOptions -FancyIndexing
-                                             AddType text/html 1 2 3 4 5 6 7 8 9'''),
-                          file=f)
-                    # XXX: omitting 0 here doesn't make much sense.  and this
-                    # doesn't help for src packages, so is it actually having
-                    # any effect?
-
-        #
-        # for each tarfile, write tarfile listing
-        #
-
-        for t in packages[p].tars:
-
-            fver = re.sub(r'\.tar.*$', '', t)
-            html = os.path.join(dir, fver)
-
-            # ... if it doesn't already exist, or force
-            if not os.path.exists(html) or args.force:
-
-                logging.debug('writing %s' % html)
-
-                if not args.dryrun:
-                    with open(html, 'w') as f:
-                        header = p + ": " + packages[p].hints['sdesc'].replace('"', '')
-                        if fver.endswith('-src'):
-                            header = header + " (source code)"
-                        else:
-                            header = header + " (installed binaries and support files)"
-                        # XXX: also recognize '-devel', '-doc', '-debuginfo' ?
-                        # XXX: '(utilities)', '(runtime)'
-                        # XXX: and work out if it's runtime library?
-
-                        print(textwrap.dedent('''\
-                                                 <html>
-                                                 <h1>%s</h1>
-                                                 <tt><pre>''' % (header)), file=f)
-
-                        tf = os.path.join(args.rel_area, packages[p].path, t)
-                        if not os.path.exists(tf):
-                            # XXX: this shouldn't happen with a full mirror...
-                            print('tarfile %s not found' % tf, file=f)
-                        elif os.path.getsize(tf) <= 32:
-                            # compressed empty files aren't a valid tar file,
-                            # but we can just ignore them
-                            pass
-                        else:
-                            with tarfile.open(tf) as a:
-                                for i in a:
-                                    print('    %-16s%12d %s' % (time.strftime('%Y-%m-%d %H:%M', time.gmtime(i.mtime)), i.size, i.name), file=f, end='')
-                                    if i.isdir():
-                                        print('/', file=f, end='')
-                                    if i.issym() or i.islnk():
-                                        print(' -> %s' % i.linkname, file=f, end='')
-                                    print('', file=f)
-
-                        print(textwrap.dedent('''\
-                                                 </pre></tt>
-                                                 </html>'''), file=f)
-            else:
-                logging.log(5, 'not writing %s, already exists' % html)
-
-            # this file should exist, so remove from the toremove list
-            if html in toremove:
-                toremove.remove(html)
-
-    #
-    # write packages.inc
-    #
-
-    packages_inc = os.path.join(base, 'packages.inc')
-    logging.debug('writing %s' % packages_inc)
-    if not args.dryrun:
-        with open(packages_inc, 'w') as index:
-            os.fchmod(index.fileno(), 0o755)
-            print(textwrap.dedent('''\
-                                     <div id="%s">
-                                     <div id="background">
-                                     <b class="rtop"><b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b></b>
-                                     <h2>Available Packages for %s</h2>
-                                     <b class="rbottom"><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b></b>
-                                     </div>
-                                     <br>
-                                     <table class="pkglist">''') % (arch, arch), file=index)
-
-            for p in sorted(packages.keys(), key=package.sort_key):
-                # don't write anything if 'skip'
-                if 'skip' in packages[p].hints:
-                    continue
-
-                header = packages[p].hints['sdesc'].replace('"', '')
-
-                print('<tr><td><a href="' + arch + '/' + p + '">' + p + '</a></td><td>' + header + '</td></tr>', file=index)
-
-            print(textwrap.dedent('''\
-                                     </table>
-                                     </div>'''), file=index)
-
-    #
-    # remove any remaining listing files for which there was no corresponding package
-    #
-
-    for r in toremove:
-        logging.debug('rm %s' % r)
-        if not args.dryrun:
-            os.unlink(r)
-
-if __name__ == "__main__":
-    htdocs_default = os.path.join(common_constants.HTDOCS, 'packages')
-    relarea_default = common_constants.FTP
-
-    parser = argparse.ArgumentParser(description='Write HTML package listings')
-    parser.add_argument('--arch', action='store', required=True, choices=common_constants.ARCHES)
-    parser.add_argument('--force', action='store_true', help="overwrite existing files")
-    parser.add_argument('--htdocs', action='store', metavar='DIR', help="htdocs output directory (default: " + htdocs_default + ")", default=htdocs_default)
-    parser.add_argument('--releasearea', action='store', metavar='DIR', help="release directory (default: " + relarea_default + ")", default=relarea_default, dest='rel_area')
-    parser.add_argument('-n', '--dry-run', action='store_true', dest='dryrun', help="don't do anything")
-    parser.add_argument('-v', '--verbose', action='count', dest='verbose', help='verbose output')
-    (args) = parser.parse_args()
-
-    if args.verbose:
-        logging.getLogger().setLevel(logging.INFO)
-
-    logging.basicConfig(format=os.path.basename(sys.argv[0])+': %(message)s')
-
-    packages = package.read_packages(args.rel_area, args.arch)
-    update_package_listings(args, packages, args.arch)
diff --git a/queue.py b/queue.py
deleted file mode 100644
index 1d352e2..0000000
--- a/queue.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2016 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.
-#
-
-from dirq.QueueSimple import QueueSimple
-import logging
-import os
-import re
-
-import uploads
-
-QUEUE = 'package_queue'
-
-
-#
-#
-#
-
-def add(args, movelist, fromdir):
-    if not hasattr(args, 'queuedir'):
-        return
-
-    queue_root = os.path.join(args.queuedir, 'dirq')
-    upload_root = os.path.join(args.queuedir, 'uploads')
-
-    dirq = QueueSimple(os.path.join(queue_root, QUEUE))
-
-    # clean up empty directories
-    dirq.purge()
-    os.system('find %s -depth -mindepth 1 -type d -empty -delete' % upload_root)
-
-    # are there any source packages in the filelist?
-    srcpkgs = []
-    for p in movelist:
-        for f in movelist[p]:
-            if re.search(r'-src.tar.(bz2|gz|lzma|xz)$', f):
-                srcpkgs.append(os.path.join(p, f))
-
-    # if so...
-    #
-    # XXX: really this should break things up into the set of files for each
-    # source file
-    if len(srcpkgs) >= 1:
-        # keep all the files for comparison
-        uploads.copy(args, movelist, fromdir, upload_root)
-
-        # queue any srcpkgs
-        for p in srcpkgs:
-            if not args.dryrun:
-                logging.debug("queuing source package %s for validation" % (p))
-                dirq.add(p)
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..9f7f513
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,21 @@
+from setuptools import setup
+
+setup(
+    name='calm',
+    version='20160512',
+    description='Cygwin packaging maintenance tool',
+    long_description=open('README.md').read(),
+    author='Jon Turney',
+    author_email='jon.turney@dronecode.org.uk',
+    license='MIT',
+    packages=['calm'],
+    install_requires=['dirq'],
+    entry_points= {
+        'console_scripts': [
+            'calm = calm.calm:main',
+            'mksetupini = calm.mksetupini:main',
+        ],
+    },
+    url='https://cygwin.com/git/?p=cygwin-apps/calm.git',
+    test_suite='tests',
+)
diff --git a/setup_exe.py b/setup_exe.py
deleted file mode 100755
index d9d85be..0000000
--- a/setup_exe.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# extract version from setup executable
-#
-
-import argparse
-import os
-import re
-
-
-#
-# the setup binary contains a '%%% setup-version ' string identifying the
-# version, but it's hard to read that when it's UPX packed.
-#
-# so instead, we expect the exe file to be a symlink to a file which encodes
-# the version in it's name
-#
-# XXX: possibly we could work around this by placing the version string into
-# a string resource and using upx's --keep-resource flag to keep that resource
-# uncompressed
-#
-
-def extract_version(fn):
-    # check the file exists
-    if not os.path.exists(fn):
-        raise FileNotFoundError
-
-    # canonicalize the pathname
-    fn = os.path.realpath(fn)
-
-    match = re.search(r'setup-([\d\.]+).x86', fn)
-    if match:
-        return match.group(1)
-    else:
-        return None
-
-if __name__ == "__main__":
-    parser = argparse.ArgumentParser(description='Extract version from setup executable')
-    parser.add_argument('exe', action='store', nargs='?', metavar='filename', help='executable file')
-    (args) = parser.parse_args()
-
-    if args.exe:
-        v = extract_version(args.exe)
-        if v:
-            print(v)
-            exit(0)
-        exit(1)
-
-    parser.print_help()
-
-# XXX:maybe this could make the filename from /www/sourceware/htdocs/cygwin and arch?
diff --git a/spelling.py b/spelling.py
deleted file mode 100644
index 2b477c1..0000000
--- a/spelling.py
+++ /dev/null
@@ -1,134 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-import logging
-import re
-from enchant import DictWithPWL
-from enchant.checker import SpellChecker
-from enchant.tokenize import Filter
-
-
-#
-#
-#
-
-class DescFilter(Filter):
-    # acronym may start with a digit (e.g. 3GPP), contains two or more capital
-    # letters (e.g. IP), may also end with a digit (e.g. MP3), and may be
-    # pluralized (e.g. DLLs)
-    _acronym_pattern = re.compile(r'^\d?[A-Z]{2,}\d?(|s)')
-    _url_pattern = re.compile(r'.+://.+')
-    _module_pattern = re.compile(r'.+::.+')
-    _path_pattern = re.compile(r'^/.+')
-
-    _commands = ['apng2gif', 'gif2apng']
-
-    #
-    def _skip(self, word):
-        # skip acronyms
-        if self._acronym_pattern.match(word):
-            # print("%s is an acronyn" % word)
-            return True
-
-        # ignore things which look like URLs
-        if self._url_pattern.match(word):
-            # print("%s is a URL" % word)
-            return True
-
-        # ignore things which look like perl/ruby module names (contain ::)
-        if self._module_pattern.match(word):
-            # print("%s is a module name" % word)
-            return True
-
-        # ignore things which look like paths
-        if self._path_pattern.match(word):
-            # print("%s is a path name" % word)
-            return True
-
-        # commands containing digits won't be recognized as single words, so we
-        # arrange to skip those also
-        if word in self._commands:
-            return True
-
-        return False
-
-
-def spellcheck_hints(args, packages):
-    spelldict = DictWithPWL('en-US')
-    chkr = SpellChecker(spelldict, filters=[DescFilter])
-    misspellings = {}
-
-    # add technical words not in spell-checking dictionary
-    wordlist = []
-    with open('words.txt') as f:
-        for w in f:
-            # strip any trailing comment
-            w = re.sub(r'#.*$', '', w)
-            # strip any whitespace
-            w = w.strip()
-            spelldict.add(w)
-            wordlist.append(w.lower())
-            # XXX: for the moment, to reduce the set of errors, ignore the fact
-            # that words.txt gives a canonical capitalization, and accept any
-            # capitalization
-            spelldict.add(w.lower())
-            spelldict.add(w.capitalize())
-
-    # add all package names as valid words
-    for p in packages:
-        for w in re.split('[_-]', p):
-            # remove punctuation characters
-            w = re.sub(r'[+]', '', w)
-            # strip off any trailing numbers
-            w = re.sub(r'[\d.]*$', '', w)
-
-            # both with and without any lib prefix
-            for w1 in [w, re.sub(r'^lib', '', w)]:
-                # add the package name unless it exists in the list above, which
-                # will give a canonical capitalization
-                if w.lower() not in wordlist:
-                    spelldict.add(w.lower())
-                    spelldict.add(w)
-                    spelldict.add(w.capitalize())
-
-    # for each package
-    for p in sorted(packages.keys()):
-        # debuginfo packages have uninteresting, auto-generated text which
-        # contains the package name
-        if p.endswith('-debuginfo'):
-            continue
-
-        # spell-check the spell-checkable keys
-        for k in ['sdesc', 'ldesc', 'message']:
-            if k in packages[p].hints:
-                chkr.set_text(packages[p].hints[k])
-                # XXX: this is doing all the work to generate suggestions, which
-                # we then ignore, so could be written much more efficiently
-                for err in chkr:
-                    # logging.error("package '%s', hint '%s': Is '%s' a word?" % (p, k, err.word))
-                    misspellings.setdefault(err.word, 0)
-                    misspellings[err.word] += 1
-
-    # summarize
-    for c in sorted(misspellings, key=misspellings.get, reverse=True):
-        print('%16s: %4d' % (c, misspellings[c]))
diff --git a/test.sh b/test.sh
new file mode 100755
index 0000000..b4f1c39
--- /dev/null
+++ b/test.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/bash
+exec python3 -m unittest discover
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000..2e574c0
--- /dev/null
+++ b/test/__init__.py
@@ -0,0 +1,2 @@
+from . import test_calm
+
diff --git a/test/test_calm.py b/test/test_calm.py
new file mode 100755
index 0000000..b97b4b7
--- /dev/null
+++ b/test/test_calm.py
@@ -0,0 +1,294 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2015 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.
+#
+
+#
+# tests
+#
+
+import filecmp
+import logging
+import os
+import pprint
+import re
+import shutil
+import tempfile
+import types
+import unittest
+
+from calm.version import SetupVersion
+import calm.calm
+import calm.hint as hint
+import calm.maintainers as maintainers
+import calm.package as package
+import calm.pkg2html as pkg2html
+import calm.uploads as uploads
+
+
+#
+# helper functions
+#
+# write results to the file 'results'
+# read expected from the file 'expected'
+# compare them
+#
+
+def compare_with_expected_file(test, dirpath, results, basename=None):
+    results_str = pprint.pformat(results, width=120)
+
+    if basename:
+        results_fn = basename + '.results'
+        expected_fn = basename + '.expected'
+    else:
+        results_fn = 'results'
+        expected_fn = 'expected'
+
+    # save results in a file
+    with open(os.path.join(dirpath, results_fn), 'w') as f:
+        print(results_str, file=f)
+
+    # read expected from a file
+    with open(os.path.join(dirpath, expected_fn)) as f:
+        expected = f.read().rstrip()
+
+    test.assertMultiLineEqual(expected, results_str)
+
+
+#
+# capture a directory tree as a dict 'tree', where each key is a directory path
+# and the value is a sorted list of filenames
+#
+
+def capture_dirtree(basedir):
+    tree = {}
+    for dirpath, dirnames, filenames in os.walk(basedir):
+        tree[os.path.relpath(dirpath, basedir)] = sorted(filenames)
+
+    return tree
+
+
+#
+#
+#
+
+class CalmTest(unittest.TestCase):
+    def test_hint_parser(self):
+        self.maxDiff = None
+
+        basedir = 'testdata/relarea'
+        for (dirpath, subdirs, files) in os.walk(basedir):
+            relpath = os.path.relpath(dirpath, basedir)
+            if 'setup.hint' in files:
+                with self.subTest(package=os.path.basename(dirpath)):
+                    logging.info('Reading %s' % os.path.join(dirpath, 'setup.hint'))
+                    results = hint.setup_hint_parse(os.path.join(dirpath, 'setup.hint'))
+                    compare_with_expected_file(self, os.path.join('testdata/hints', relpath), results)
+
+#
+# something like "find -name results -exec sh -c 'cd `dirname {}` ; cp results
+# expected' \;" can be used to update the expected output (after you have
+# checking it to make sure it is really correct, of course :) )
+#
+
+    def test_html_writer(self):
+        self.maxDiff = None
+
+        htdocs = 'testdata/htdocs'
+        args = types.SimpleNamespace()
+        setattr(args, 'arch', 'x86')
+        setattr(args, 'htdocs', htdocs)
+        setattr(args, 'rel_area', 'testdata/relarea')
+        setattr(args, 'dryrun', False)
+        setattr(args, 'force', True)
+        setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
+
+        packages = package.read_packages(args.rel_area, args.arch)
+        package.validate_packages(args, packages)
+        pkg2html.update_package_listings(args, packages, args.arch)
+
+        # compare the output files with expected
+        for (dirpath, subdirs, files) in os.walk(htdocs):
+            relpath = os.path.relpath(dirpath, htdocs)
+            for f in files:
+                results = os.path.join(htdocs, relpath, f)
+                expected = os.path.join('testdata/htdocs.expected', relpath, f)
+                if not filecmp.cmp(results, expected, shallow=False):
+                    logging.info("%s different", os.path.join(relpath, f))
+                    with open(results) as r, open(expected) as e:
+                        self.assertMultiLineEqual(e.read(), r.read())
+                else:
+                    logging.info("%s identical", os.path.join(relpath, f))
+
+    def test_version_sort(self):
+        test_data = [
+            ["1.0.0", "2.0.0", -1],
+            [".0.0", "2.0.0", -1],
+            ["alpha", "beta", -1],
+            ["1.0", "1.0.0", -1],
+            ["2.456", "2.1000", -1],
+            ["2.1000", "3.111", -1],
+            ["2.001", "2.1", 0],
+            ["2.34", "2.34", 0],
+            ["6.1.2-4", "6.3.8-1", -1],
+            ["1.7.3.0-2", "2.0.0-b8-1", -1],
+            ["1.3.30c-2", "1.3.30c-10", -1],
+            ["2.24.51-1", "2.25-1", -1],
+            ["2.1.5+20120813+gitdcbe778-1", "2.1.5-3", 1],
+            ["3.4.1-1", "3.4b1-1", -1],
+            ["041206-1", "200090325-1", -1],
+            ["0.6.2+git20130413-2", "0.6.2-1", 1],
+            ["2.6.0+bzr6602-1", "2.6.0-2", 1],
+            ["2.6.0-2", "2.6b2-1", -1],
+            ["2.6.0+bzr6602-1", "2.6b2-1", -1],
+            ["0.6.7+20150214+git3a710f9-1", "0.6.7-1", 1],
+        ]
+
+        for d in test_data:
+            a = SetupVersion(d[0])
+            b = SetupVersion(d[1])
+            e = d[2]
+            # logging.info("%s %s %d" % (a, b, e))
+            self.assertEqual(SetupVersion.__cmp__(a, b), e, msg='%s %s %d' % (a, b, e))
+            self.assertEqual(SetupVersion.__cmp__(b, a), -e, msg='%s %s %d' % (a, b, -e))
+
+    def test_maint_pkglist(self):
+        self.maxDiff = None
+
+        mlist = {}
+        mlist = maintainers.Maintainer.add_directories(mlist, 'testdata/homes')
+        mlist = maintainers.Maintainer.add_packages(mlist, 'testdata/pkglist/cygwin-pkg-maint', None)
+
+        compare_with_expected_file(self, 'testdata/pkglist', mlist)
+
+    def test_scan_uploads(self):
+        self.maxDiff = None
+
+        args = types.SimpleNamespace()
+        setattr(args, 'arch', 'x86')
+        setattr(args, 'rel_area', 'testdata/relarea')
+        setattr(args, 'dryrun', False)
+
+        pkglist = ['after-ready', 'not-ready', 'testpackage', 'testpackage2']
+
+        mlist = {}
+        mlist = maintainers.Maintainer.add_directories(mlist, 'testdata/homes')
+        m = mlist['Blooey McFooey']
+        m.pkgs.extend(pkglist + ['not-on-package-list'])
+
+        ready_fns = [(os.path.join(m.homedir(), 'x86', 'release', 'testpackage', '!ready'), ''),
+                     (os.path.join(m.homedir(), 'x86', 'release', 'testpackage2', 'testpackage2-subpackage', '!ready'), ''),
+                     (os.path.join(m.homedir(), 'x86', 'release', 'after-ready', '!ready'), '-t 198709011700')]
+        for (f, t) in ready_fns:
+            os.system('touch %s "%s"' % (t, f))
+
+        scan_result = uploads.scan(m, pkglist + ['not-on-maintainer-list'], args.arch, args)
+
+        self.assertEqual(scan_result.error, False)
+        compare_with_expected_file(self, 'testdata/uploads', scan_result.to_relarea, 'move')
+        self.assertCountEqual(scan_result.to_vault, {'x86/release/testpackage': ['x86/release/testpackage/testpackage-0.1-1.tar.bz2']})
+        self.assertCountEqual(scan_result.remove_always, [f for (f, t) in ready_fns])
+        self.assertEqual(scan_result.remove_success, ['testdata/homes/Blooey McFooey/x86/release/testpackage/-testpackage-0.1-1.tar.bz2'])
+        compare_with_expected_file(self, 'testdata/uploads', scan_result.packages, 'pkglist')
+
+    def test_package_set(self):
+        self.maxDiff = None
+
+        args = types.SimpleNamespace()
+        setattr(args, 'arch', 'x86')
+        setattr(args, 'dryrun', False)
+        setattr(args, 'force', True)
+        setattr(args, 'inifile', 'testdata/inifile/setup.ini')
+        setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
+        setattr(args, 'rel_area', 'testdata/relarea')
+        setattr(args, 'release', 'testing')
+        setattr(args, 'setup_version', '4.321')
+
+        packages = package.read_packages(args.rel_area, args.arch)
+        package.delete(packages, 'x86/release/nonexistent', 'nosuchfile-1.0.0.tar.xz')
+        self.assertEqual(package.validate_packages(args, packages), True)
+        package.write_setup_ini(args, packages, args.arch)
+        with open(args.inifile) as inifile:
+            results = inifile.read()
+            # fix the timestamp to match expected
+            results = re.sub('setup-timestamp: .*', 'setup-timestamp: 1458221800', results, 1)
+            compare_with_expected_file(self, 'testdata/inifile', (results,), 'setup.ini')
+
+        # XXX: delete a needed package, and check validate fails
+
+    def test_process(self):
+        self.maxDiff = None
+
+        args = types.SimpleNamespace()
+
+        for d in ['rel_area', 'homedir', 'htdocs', 'vault']:
+            setattr(args, d, tempfile.mktemp())
+            logging.info('%s = %s', d, getattr(args, d))
+
+        setattr(args, 'dryrun', False)
+        setattr(args, 'email', None)
+        setattr(args, 'force', False)
+        setattr(args, 'inifile', os.path.join(getattr(args, 'rel_area'), 'setup.ini'))
+        setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
+        setattr(args, 'release', 'trial')
+        setattr(args, 'setup_version', '3.1415')
+
+        shutil.copytree('testdata/relarea', getattr(args, 'rel_area'))
+        shutil.copytree('testdata/homes', getattr(args, 'homedir'))
+
+        # set appropriate !readys
+        m_homedir = os.path.join(getattr(args, 'homedir'), 'Blooey McFooey')
+        ready_fns = [(os.path.join(m_homedir, 'x86', 'release', 'testpackage', '!ready'), ''),
+                     (os.path.join(m_homedir, 'x86', 'release', 'testpackage2', 'testpackage2-subpackage', '!ready'), ''),
+                     (os.path.join(m_homedir, 'x86', 'release', 'after-ready', '!ready'), '-t 198709011700'),
+                     (os.path.join(m_homedir, 'noarch', 'release', 'perl-Net-SMTP-SSL', '!ready'), '')]
+        for (f, t) in ready_fns:
+            os.system('touch %s "%s"' % (t, f))
+
+        packages = calm.calm.process(args)
+        self.assertTrue(packages)
+
+        pkg2html.update_package_listings(args, packages['x86'], 'x86')
+        package.write_setup_ini(args, packages['x86'], 'x86')
+
+        for d in ['rel_area', 'homedir', 'htdocs', 'vault']:
+            with self.subTest(directory=d):
+                dirlist = capture_dirtree(getattr(args, d))
+                compare_with_expected_file(self, 'testdata/process_arch', dirlist, d)
+                shutil.rmtree(getattr(args, d))
+
+    @classmethod
+    def setUpClass(cls):
+        # testdata is located in the same directory as this file
+        os.chdir(os.path.dirname(os.path.abspath(__file__)))
+
+        # ensure sha512.sum files exist
+        os.system("find testdata/relarea/x86 testdata/relarea/noarch -type d -exec sh -c 'cd {} ; sha512sum * >sha512.sum 2>/dev/null' \;")
+        # should remove a sha512.sum file so that we test functioning when it's absent
+        os.unlink('testdata/relarea/x86/release/naim/sha512.sum')
+        # remove !ready files
+        os.system("find testdata/homes -name !ready -exec rm {} \;")
+
+
+if __name__ == '__main__':
+    logging.getLogger().setLevel(logging.INFO)
+    logging.basicConfig(format='%(message)s')
+    unittest.main()
diff --git a/test/testdata/.gitignore b/test/testdata/.gitignore
new file mode 100644
index 0000000..2dada27
--- /dev/null
+++ b/test/testdata/.gitignore
@@ -0,0 +1,7 @@
+htdocs
+results
+*.results
+setup.ini
+sha512.sum
+\!ready
+\!reminder-timestamp
diff --git a/test/testdata/hints/noarch/release/perl-Net-SMTP-SSL/expected b/test/testdata/hints/noarch/release/perl-Net-SMTP-SSL/expected
new file mode 100644
index 0000000..9516e05
--- /dev/null
+++ b/test/testdata/hints/noarch/release/perl-Net-SMTP-SSL/expected
@@ -0,0 +1,5 @@
+{'category': 'Perl',
+ 'requires': '',
+ 'sdesc': '"Perl distribution Net-SMTP-SSL"',
+ 'ldesc': '"Implements the same API as Net::SMTP, but uses IO::Socket::SSL for\n'
+          'its network operations in order to support encrypted connections."'}
diff --git a/test/testdata/hints/x86/release/arc/expected b/test/testdata/hints/x86/release/arc/expected
new file mode 100644
index 0000000..d0cd27b
--- /dev/null
+++ b/test/testdata/hints/x86/release/arc/expected
@@ -0,0 +1,8 @@
+{'sdesc': '"The ARC archive utility"',
+ 'ldesc': '"This program is based on the MSDOS ARC program, version 5.21, plus a\n'
+          'few enhancements. ARC performs Huffman Squeezing on data. The Huffman\n'
+          'Squeeze algorithm was removed from MSDOS ARC after version 5.12. It\n'
+          'turns out to be more efficient than Lempel-Ziv style compression when\n'
+          'compressing graphic images. Squeeze analysis is always done now, and\n'
+          'the best of packing, squeezing, or crunching is used."',
+ 'category': 'Archive'}
diff --git a/test/testdata/hints/x86/release/base-cygwin/expected b/test/testdata/hints/x86/release/base-cygwin/expected
new file mode 100644
index 0000000..7505632
--- /dev/null
+++ b/test/testdata/hints/x86/release/base-cygwin/expected
@@ -0,0 +1,5 @@
+{'sdesc': '"Initial base installation helper script"',
+ 'ldesc': '"Initial base installation helper script."',
+ 'category': 'Base',
+ 'requires': '',
+ 'parse-warnings': ["sdesc ends with '.'"]}
diff --git a/test/testdata/hints/x86/release/cygwin/cygwin-debuginfo/expected b/test/testdata/hints/x86/release/cygwin/cygwin-debuginfo/expected
new file mode 100644
index 0000000..7359321
--- /dev/null
+++ b/test/testdata/hints/x86/release/cygwin/cygwin-debuginfo/expected
@@ -0,0 +1,8 @@
+{'category': 'Debug',
+ 'requires': 'cygwin-debuginfo',
+ 'external-source': 'cygwin',
+ 'sdesc': '"Debug info for cygwin"',
+ 'ldesc': '"This package contains files necessary for debugging the\ncygwin package with gdb."',
+ 'prev': '2.2.0-1',
+ 'curr': '2.2.1-1',
+ 'test': '2.3.0-0.3'}
diff --git a/test/testdata/hints/x86/release/cygwin/cygwin-devel/expected b/test/testdata/hints/x86/release/cygwin/cygwin-devel/expected
new file mode 100644
index 0000000..19c0b1e
--- /dev/null
+++ b/test/testdata/hints/x86/release/cygwin/cygwin-devel/expected
@@ -0,0 +1,8 @@
+{'category': 'Devel',
+ 'requires': '',
+ 'sdesc': '"Core development files"',
+ 'ldesc': '"Core development files required to build Cygwin packages"',
+ 'external-source': 'cygwin',
+ 'prev': '2.2.0-1',
+ 'curr': '2.2.1-1',
+ 'test': '2.3.0-0.3'}
diff --git a/test/testdata/hints/x86/release/cygwin/expected b/test/testdata/hints/x86/release/cygwin/expected
new file mode 100644
index 0000000..e2f3476
--- /dev/null
+++ b/test/testdata/hints/x86/release/cygwin/expected
@@ -0,0 +1,7 @@
+{'sdesc': '"The UNIX emulation engine"',
+ 'ldesc': '"The UNIX emulation engine"',
+ 'category': 'Base',
+ 'requires': 'base-cygwin',
+ 'prev': '2.2.0-1',
+ 'curr': '2.2.1-1',
+ 'test': '2.3.0-0.3'}
diff --git a/test/testdata/hints/x86/release/invalid/expected b/test/testdata/hints/x86/release/invalid/expected
new file mode 100644
index 0000000..95681a8
--- /dev/null
+++ b/test/testdata/hints/x86/release/invalid/expected
@@ -0,0 +1,4 @@
+{'parse-errors': ['unknown setup key unknown-key at line 0',
+                  "unknown setup construct 'invalid-construct' at line 1",
+                  "required key 'category' missing",
+                  "required key 'sdesc' missing"]}
diff --git a/test/testdata/hints/x86/release/keychain/expected b/test/testdata/hints/x86/release/keychain/expected
new file mode 100644
index 0000000..4113a2d
--- /dev/null
+++ b/test/testdata/hints/x86/release/keychain/expected
@@ -0,0 +1,12 @@
+{'sdesc': '"Key manager for OpenSSH"',
+ 'ldesc': '"Keychain is an OpenSSH key manager, typically run from\n'
+          '~/.bash_profile. When keychain is run, it checks for a running\n'
+          'ssh-agent, otherwise it starts one. It saves the ssh-agent environment\n'
+          'variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins\n'
+          'and non-interactive shells such as cron jobs can source the file and\n'
+          'make passwordless ssh connections. In addition, when keychain runs, it\n'
+          'verifies that the key files specified on the command-line are known to\n'
+          'ssh-agent, otherwise it loads them, prompting you for a password if\n'
+          'necessary"',
+ 'category': 'Utils',
+ 'requires': 'openssh'}
diff --git a/test/testdata/hints/x86/release/libspiro/expected b/test/testdata/hints/x86/release/libspiro/expected
new file mode 100644
index 0000000..b16efe0
--- /dev/null
+++ b/test/testdata/hints/x86/release/libspiro/expected
@@ -0,0 +1 @@
+OrderedDict([('parse-errors', ['invalid UTF-8'])])
diff --git a/test/testdata/hints/x86/release/libspiro/libspiro-devel/expected b/test/testdata/hints/x86/release/libspiro/libspiro-devel/expected
new file mode 100644
index 0000000..b16efe0
--- /dev/null
+++ b/test/testdata/hints/x86/release/libspiro/libspiro-devel/expected
@@ -0,0 +1 @@
+OrderedDict([('parse-errors', ['invalid UTF-8'])])
diff --git a/test/testdata/hints/x86/release/libspiro/libspiro0/expected b/test/testdata/hints/x86/release/libspiro/libspiro0/expected
new file mode 100644
index 0000000..b16efe0
--- /dev/null
+++ b/test/testdata/hints/x86/release/libspiro/libspiro0/expected
@@ -0,0 +1 @@
+OrderedDict([('parse-errors', ['invalid UTF-8'])])
diff --git a/test/testdata/hints/x86/release/libtextcat/expected b/test/testdata/hints/x86/release/libtextcat/expected
new file mode 100644
index 0000000..498e7e5
--- /dev/null
+++ b/test/testdata/hints/x86/release/libtextcat/expected
@@ -0,0 +1,11 @@
+{'sdesc': '"Text Classification Library (language guessing in C)"',
+ 'ldesc': '"Libtextcat is a library with functions that implement the\n'
+          'classification technique described in Cavnar & Trenkle, "N-Gram-Based\n'
+          'Text Categorization". It was primarily developed for language\n'
+          'guessing, a task on which it is known to perform with near-perfect\n'
+          'accuracy.\n'
+          'BSD License.\n'
+          'http://software.wise-guys.nl/libtextcat/";',
+ 'category': 'Text',
+ 'requires': 'libtextcat0',
+ 'parse-errors': ['embedded quote at line 7']}
diff --git a/test/testdata/hints/x86/release/libtextcat/libtextcat-devel/expected b/test/testdata/hints/x86/release/libtextcat/libtextcat-devel/expected
new file mode 100644
index 0000000..aca0db6
--- /dev/null
+++ b/test/testdata/hints/x86/release/libtextcat/libtextcat-devel/expected
@@ -0,0 +1,12 @@
+{'sdesc': '"Helper, header and library for libtextcat"',
+ 'ldesc': '"Libtextcat is a library with functions that implement the\n'
+          'classification technique described in Cavnar & Trenkle, "N-Gram-Based\n'
+          'Text Categorization". It was primarily developed for language\n'
+          'guessing, a task on which it is known to perform with near-perfect\n'
+          'accuracy.\n'
+          'BSD License.\n'
+          'http://software.wise-guys.nl/libtextcat/";',
+ 'category': 'Devel Text',
+ 'requires': 'libtextcat libtextcat0',
+ 'external-source': 'libtextcat',
+ 'parse-errors': ['embedded quote at line 7']}
diff --git a/test/testdata/hints/x86/release/libtextcat/libtextcat0/expected b/test/testdata/hints/x86/release/libtextcat/libtextcat0/expected
new file mode 100644
index 0000000..7f186d6
--- /dev/null
+++ b/test/testdata/hints/x86/release/libtextcat/libtextcat0/expected
@@ -0,0 +1,12 @@
+{'sdesc': '"Text Classification Library dll"',
+ 'ldesc': '"Libtextcat is a library with functions that implement the\n'
+          'classification technique described in Cavnar & Trenkle, "N-Gram-Based\n'
+          'Text Categorization". It was primarily developed for language\n'
+          'guessing, a task on which it is known to perform with near-perfect\n'
+          'accuracy.\n'
+          'BSD License.\n'
+          'http://software.wise-guys.nl/libtextcat/";',
+ 'category': 'Text',
+ 'requires': 'cygwin',
+ 'external-source': 'libtextcat',
+ 'parse-errors': ['embedded quote at line 7']}
diff --git a/test/testdata/hints/x86/release/mDNSResponder/expected b/test/testdata/hints/x86/release/mDNSResponder/expected
new file mode 100644
index 0000000..f02a324
--- /dev/null
+++ b/test/testdata/hints/x86/release/mDNSResponder/expected
@@ -0,0 +1,10 @@
+{'category': 'Net',
+ 'requires': 'libdns_sd1',
+ 'sdesc': '"Bonjour Zeroconf implementation"',
+ 'ldesc': '"Bonjour, also known as zero-configuration networking, enables\n'
+          'automatic discovery of computers, devices, and services on IP networks using\n'
+          'industry standard IP protocols."',
+ 'message': 'mDNSResponder "The Cygwin mDNSResponder package contains only clients.\n'
+            "If you do not already have the 'Bonjour Service' installed (it comes with\n"
+            'a number of popular Windows programs), then you can download it at\n'
+            'http://support.apple.com/kb/DL999";'}
diff --git a/test/testdata/hints/x86/release/mDNSResponder/libdns_sd-devel/expected b/test/testdata/hints/x86/release/mDNSResponder/libdns_sd-devel/expected
new file mode 100644
index 0000000..8e93797
--- /dev/null
+++ b/test/testdata/hints/x86/release/mDNSResponder/libdns_sd-devel/expected
@@ -0,0 +1,7 @@
+{'category': 'Net',
+ 'requires': 'libdns_sd1',
+ 'sdesc': '"Bonjour Zeroconf implementation"',
+ 'ldesc': '"Bonjour, also known as zero-configuration networking, enables\n'
+          'automatic discovery of computers, devices, and services on IP networks using\n'
+          'industry standard IP protocols."',
+ 'external-source': 'mDNSResponder'}
diff --git a/test/testdata/hints/x86/release/mDNSResponder/libdns_sd1/expected b/test/testdata/hints/x86/release/mDNSResponder/libdns_sd1/expected
new file mode 100644
index 0000000..45d0032
--- /dev/null
+++ b/test/testdata/hints/x86/release/mDNSResponder/libdns_sd1/expected
@@ -0,0 +1,7 @@
+{'category': 'Net',
+ 'requires': '',
+ 'sdesc': '"Bonjour Zeroconf implementation"',
+ 'ldesc': '"Bonjour, also known as zero-configuration networking, enables\n'
+          'automatic discovery of computers, devices, and services on IP networks using\n'
+          'industry standard IP protocols."',
+ 'external-source': 'mDNSResponder'}
diff --git a/test/testdata/hints/x86/release/mingw64-i686-binutils/expected b/test/testdata/hints/x86/release/mingw64-i686-binutils/expected
new file mode 100644
index 0000000..114e53c
--- /dev/null
+++ b/test/testdata/hints/x86/release/mingw64-i686-binutils/expected
@@ -0,0 +1,6 @@
+{'category': 'Devel',
+ 'requires': 'cygwin libintl8 zlib0',
+ 'sdesc': '"The GNU Binutils are a collection of binary tools. This package\n is capable of targeting win32"',
+ 'ldesc': '"Binutils for MinGW-w64 Win32 toolchain"',
+ 'parse-errors': ['key sdesc has multi-line value'],
+ 'parse-warnings': ["sdesc ends with '.'", 'sdesc is much longer than ldesc']}
diff --git a/test/testdata/hints/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/expected b/test/testdata/hints/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/expected
new file mode 100644
index 0000000..c936ff6
--- /dev/null
+++ b/test/testdata/hints/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/expected
@@ -0,0 +1,7 @@
+{'category': 'Debug',
+ 'requires': 'cygwin-debuginfo',
+ 'external-source': 'mingw64-i686-binutils',
+ 'ldesc': '"Debug info for mingw64-i686-binutils"',
+ 'sdesc': '"This package contains files necessary for debugging the\nmingw64-i686-binutils package with gdb"',
+ 'parse-errors': ['key sdesc has multi-line value'],
+ 'parse-warnings': ["sdesc ends with '.'", 'sdesc is much longer than ldesc']}
diff --git a/test/testdata/hints/x86/release/naim/expected b/test/testdata/hints/x86/release/naim/expected
new file mode 100644
index 0000000..9f7710c
--- /dev/null
+++ b/test/testdata/hints/x86/release/naim/expected
@@ -0,0 +1,6 @@
+{'category': 'Net',
+ 'requires': '',
+ 'sdesc': '"Console AIM, ICQ, IRC, and Lily client"',
+ 'ldesc': '" naim is a console client for AOL Instant Messenger (AIM),\n'
+          'AOL I Seek You (ICQ), Internet Relay Chat (IRC), and The lily CMC."',
+ 'parse-warnings': ['value for key ldesc starts with quoted whitespace']}
diff --git a/test/testdata/hints/x86/release/openssh/expected b/test/testdata/hints/x86/release/openssh/expected
new file mode 100644
index 0000000..8eeefad
--- /dev/null
+++ b/test/testdata/hints/x86/release/openssh/expected
@@ -0,0 +1,5 @@
+{'category': 'Net',
+ 'sdesc': '"The OpenSSH server and client programs"',
+ 'ldesc': '"OpenSSH is a program for logging into a remote machine and for\n'
+          '\texecuting commands on a remote machine.  It can replace rlogin and rsh,\n'
+          '\tproviding encrypted communication between two machines."'}
diff --git a/test/testdata/hints/x86/release/proj/expected b/test/testdata/hints/x86/release/proj/expected
new file mode 100644
index 0000000..40db455
--- /dev/null
+++ b/test/testdata/hints/x86/release/proj/expected
@@ -0,0 +1,5 @@
+{'category': 'Graphics Libs',
+ 'requires': 'libproj1',
+ 'sdesc': '""The PROJ Cartographic Projections Software (utilities)"\n'
+          'ldesc: "Cartographic projection library and utilities"',
+ 'parse-errors': ['embedded quote at line 3', 'key sdesc has multi-line value']}
diff --git a/test/testdata/hints/x86/release/proj/libproj-devel/expected b/test/testdata/hints/x86/release/proj/libproj-devel/expected
new file mode 100644
index 0000000..620f019
--- /dev/null
+++ b/test/testdata/hints/x86/release/proj/libproj-devel/expected
@@ -0,0 +1,6 @@
+{'category': 'Graphics Libs',
+ 'requires': 'libproj1',
+ 'sdesc': '""The PROJ Cartographic Projections Software (devel)"\n'
+          'ldesc: "Cartographic projection library and utilities"',
+ 'external-source': 'proj',
+ 'parse-errors': ['embedded quote at line 3', 'key sdesc has multi-line value']}
diff --git a/test/testdata/hints/x86/release/proj/libproj1/expected b/test/testdata/hints/x86/release/proj/libproj1/expected
new file mode 100644
index 0000000..cc05b73
--- /dev/null
+++ b/test/testdata/hints/x86/release/proj/libproj1/expected
@@ -0,0 +1,6 @@
+{'category': 'Graphics Libs',
+ 'requires': '',
+ 'sdesc': '""The PROJ Cartographic Projections Software (runtime)"\n'
+          'ldesc: "Cartographic projection library and utilities"',
+ 'external-source': 'proj',
+ 'parse-errors': ['embedded quote at line 3', 'key sdesc has multi-line value']}
diff --git a/test/testdata/hints/x86/release/proj/proj-debuginfo/expected b/test/testdata/hints/x86/release/proj/proj-debuginfo/expected
new file mode 100644
index 0000000..6af3a7b
--- /dev/null
+++ b/test/testdata/hints/x86/release/proj/proj-debuginfo/expected
@@ -0,0 +1,5 @@
+{'category': 'Debug',
+ 'requires': 'cygwin-debuginfo',
+ 'external-source': 'proj',
+ 'sdesc': '"Debug info for proj"',
+ 'ldesc': '"This package contains files necessary for debugging the\nproj package with gdb."'}
diff --git a/test/testdata/hints/x86/release/rpm-doc/expected b/test/testdata/hints/x86/release/rpm-doc/expected
new file mode 100644
index 0000000..db48c82
--- /dev/null
+++ b/test/testdata/hints/x86/release/rpm-doc/expected
@@ -0,0 +1,2 @@
+{'sdesc': '"Obsolete package for RPM package management system manual pages"',
+ 'category': '_obsolete'}
diff --git a/test/testdata/hints/x86/release/splint/expected b/test/testdata/hints/x86/release/splint/expected
new file mode 100644
index 0000000..5667e4b
--- /dev/null
+++ b/test/testdata/hints/x86/release/splint/expected
@@ -0,0 +1,15 @@
+{'sdesc': '"Check C programs for security vulnerabilities and programming\nmistakes"',
+ 'ldesc': '"Program does many of the traditional lint checks including\n'
+          'unused declarations, type inconsistencies, use before definition,\n'
+          'unreachable code, ignored return values, execution paths with no\n'
+          'return, likely infinite loops, and fall through cases. More powerful\n'
+          'checks are made possible by additional information given in source\n'
+          'code annotations. Annotations are stylized comments that document\n'
+          'assumptions about functions, variables, parameters and types. In\n'
+          'addition to the checks specifically enabled by annotations, many of\n'
+          'the traditional lint checks are improved by exploiting this additional\n'
+          'setinformation."',
+ 'category': 'Devel',
+ 'requires': 'cygwin',
+ 'parse-errors': ['key sdesc has multi-line value'],
+ 'parse-warnings': ["sdesc ends with '.'"]}
diff --git a/test/testdata/hints/x86/release/testpackage/expected b/test/testdata/hints/x86/release/testpackage/expected
new file mode 100644
index 0000000..de11656
--- /dev/null
+++ b/test/testdata/hints/x86/release/testpackage/expected
@@ -0,0 +1 @@
+OrderedDict([('sdesc', '"A test package"'), ('ldesc', '"A test package"'), ('category', 'Devel')])
diff --git a/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2-src.tar.xz b/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2-src.tar.xz
new file mode 100644
index 0000000..9e7f93d
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2-src.tar.xz differ
diff --git a/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2.tar.xz b/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2.tar.xz
new file mode 100644
index 0000000..d986060
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2.tar.xz differ
diff --git a/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/setup.hint b/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/setup.hint
new file mode 100644
index 0000000..f91a0e1
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/setup.hint	
@@ -0,0 +1,5 @@
+category: Perl
+requires:
+sdesc: "Perl distribution Net-SMTP-SSL"
+ldesc: "Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
+its network operations in order to support encrypted connections."
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/after-ready/after-ready-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/after-ready/after-ready-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/after-ready/after-ready-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/after-ready/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/after-ready/setup.hint
new file mode 100644
index 0000000..676f218
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/after-ready/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test package which is ignored because it's uploaded after ready"
+ldesc: "A test package which is ignored because it's uploaded after ready"
+category: Devel
+
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/not-on-maintainer-list-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/not-on-maintainer-list-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/not-on-maintainer-list-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/setup.hint
new file mode 100644
index 0000000..c5cf25f
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test package which is ignored because it's not on the maintainer list"
+ldesc: "A test package which is ignored because it's not on the maintainer list"
+category: Devel
+
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/not-on-package-list-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/not-on-package-list-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/not-on-package-list-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/setup.hint
new file mode 100644
index 0000000..3a5d066
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test package which is ignored because it's not in the package list"
+ldesc: "A test package which is ignored because it's not in the package list"
+category: Devel
+
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-ready/-not-ready-0.9-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/not-ready/-not-ready-0.9-1.tar.bz2
new file mode 100644
index 0000000..e69de29
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-ready/not-ready-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/not-ready/not-ready-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/not-ready/not-ready-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/not-ready/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/not-ready/setup.hint
new file mode 100644
index 0000000..f459a37
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/not-ready/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test package which is ignored because it's not ready"
+ldesc: "A test package which is ignored because it's not ready"
+category: Devel
+
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage/-testpackage-0.1-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/-testpackage-0.1-1.tar.bz2
new file mode 100644
index 0000000..e69de29
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/setup.hint
new file mode 100644
index 0000000..290111b
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/setup.hint	
@@ -0,0 +1,6 @@
+sdesc: "A test package"
+ldesc: "A test package
+It's description might contains some unicode gibberish
+Like itâ??s youâ??re Markup Languageâ?¢ Nokogiriâ??s toolâ??that Bézier."
+category: Devel
+requires: cygwin
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1-src.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1-src.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1-src.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/setup.hint
new file mode 100644
index 0000000..90f7384
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test subpackage"
+ldesc: "A test subpackage"
+category: Devel
+external-source: testpackage
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/testpackage-subpackage-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/testpackage-subpackage-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/testpackage-subpackage-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/setup.hint
new file mode 100644
index 0000000..5ac3a09
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test package 2"
+ldesc: "A test package 2"
+category: Devel
+
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/inprogress.SftpXFR.1234 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/inprogress.SftpXFR.1234
new file mode 100644
index 0000000..e69de29
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/setup.hint b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/setup.hint
new file mode 100644
index 0000000..6871ea5
--- /dev/null
+++ b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/setup.hint	
@@ -0,0 +1,4 @@
+sdesc: "A test subpackage 2"
+ldesc: "A test subpackage 2"
+category: Devel
+
diff --git a/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/testpackage2-subpackage-1.0-1.tar.bz2 b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/testpackage2-subpackage-1.0-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/testpackage2-subpackage-1.0-1.tar.bz2 differ
diff --git a/test/testdata/homes/Jon Turney/!email b/test/testdata/homes/Jon Turney/!email
new file mode 100644
index 0000000..1c1f109
--- /dev/null
+++ b/test/testdata/homes/Jon Turney/!email	
@@ -0,0 +1 @@
+jon@invalid.local
diff --git a/test/testdata/homes/an_unexpected_file b/test/testdata/homes/an_unexpected_file
new file mode 100644
index 0000000..e69de29
diff --git a/test/testdata/htdocs.expected/x86/.htaccess b/test/testdata/htdocs.expected/x86/.htaccess
new file mode 100644
index 0000000..1ea7b18
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/.htaccess
@@ -0,0 +1 @@
+Redirect temp /packages/x86/index.html https://cygwin.com/packages/package_list.html
diff --git a/test/testdata/htdocs.expected/x86/arc/.htaccess b/test/testdata/htdocs.expected/x86/arc/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/arc/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/arc/arc-4.32.7-10 b/test/testdata/htdocs.expected/x86/arc/arc-4.32.7-10
new file mode 100644
index 0000000..caaa863
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/arc/arc-4.32.7-10
@@ -0,0 +1,5 @@
+<html>
+<h1>arc: The ARC archive utility (installed binaries and support files)</h1>
+<tt><pre>
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src b/test/testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src
new file mode 100644
index 0000000..d5ad98a
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src
@@ -0,0 +1,5 @@
+<html>
+<h1>arc: The ARC archive utility (source code)</h1>
+<tt><pre>
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/base-cygwin/.htaccess b/test/testdata/htdocs.expected/x86/base-cygwin/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/base-cygwin/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.6-1 b/test/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.6-1
new file mode 100644
index 0000000..a6c9d6c
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.6-1
@@ -0,0 +1,7 @@
+<html>
+<h1>base-cygwin: Initial base installation helper script (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.8-1 b/test/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.8-1
new file mode 100644
index 0000000..a6c9d6c
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.8-1
@@ -0,0 +1,7 @@
+<html>
+<h1>base-cygwin: Initial base installation helper script (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin-debuginfo/.htaccess b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1 b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1
new file mode 100644
index 0000000..df6375b
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1 b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1
new file mode 100644
index 0000000..df6375b
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3 b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3
new file mode 100644
index 0000000..df6375b
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin-devel/.htaccess b/test/testdata/htdocs.expected/x86/cygwin-devel/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-devel/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.0-1 b/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.0-1
new file mode 100644
index 0000000..fe87025
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.0-1
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin-devel: Core development files (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.1-1 b/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.1-1
new file mode 100644
index 0000000..fe87025
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.1-1
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin-devel: Core development files (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.3.0-0.3 b/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.3.0-0.3
new file mode 100644
index 0000000..fe87025
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.3.0-0.3
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin-devel: Core development files (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin/.htaccess b/test/testdata/htdocs.expected/x86/cygwin/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1 b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1
new file mode 100644
index 0000000..11bb5f6
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin: The UNIX emulation engine (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src
new file mode 100644
index 0000000..ab98562
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin: The UNIX emulation engine (source code)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1 b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1
new file mode 100644
index 0000000..11bb5f6
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin: The UNIX emulation engine (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src
new file mode 100644
index 0000000..ab98562
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin: The UNIX emulation engine (source code)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3 b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3
new file mode 100644
index 0000000..11bb5f6
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin: The UNIX emulation engine (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3-src b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3-src
new file mode 100644
index 0000000..ab98562
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3-src
@@ -0,0 +1,7 @@
+<html>
+<h1>cygwin: The UNIX emulation engine (source code)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/keychain/.htaccess b/test/testdata/htdocs.expected/x86/keychain/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/keychain/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1 b/test/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1
new file mode 100644
index 0000000..543226a
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1
@@ -0,0 +1,19 @@
+<html>
+<h1>keychain: Key manager for OpenSSH (installed binaries and support files)</h1>
+<tt><pre>
+    2006-11-09 04:58           0 usr/
+    2006-11-09 04:58           0 usr/bin/
+    2006-11-09 04:58       53740 usr/bin/keychain
+    2006-11-09 04:58           0 usr/share/
+    2006-11-09 04:58           0 usr/share/doc/
+    2006-11-09 04:58           0 usr/share/doc/Cygwin/
+    2006-11-09 04:58        1534 usr/share/doc/Cygwin/keychain-2.6.8.README
+    2006-11-09 04:58           0 usr/share/doc/keychain-2.6.8/
+    2006-11-09 04:58       19017 usr/share/doc/keychain-2.6.8/ChangeLog
+    2006-11-09 04:58       18009 usr/share/doc/keychain-2.6.8/COPYING
+    2006-11-09 04:58         787 usr/share/doc/keychain-2.6.8/README
+    2006-11-09 04:58           0 usr/share/man/
+    2006-11-09 04:58           0 usr/share/man/man1/
+    2006-11-09 04:58       13240 usr/share/man/man1/keychain.1
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1-src b/test/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1-src
new file mode 100644
index 0000000..0b4f281
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1-src
@@ -0,0 +1,8 @@
+<html>
+<h1>keychain: Key manager for OpenSSH (source code)</h1>
+<tt><pre>
+    2006-11-09 04:59        3051 keychain-2.6.8-1.patch
+    2006-11-09 04:59        5621 keychain-2.6.8-1.sh
+    2006-11-09 04:59       31531 keychain-2.6.8.tar.bz2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1 b/test/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1
new file mode 100644
index 0000000..c6bfe4f
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1
@@ -0,0 +1,19 @@
+<html>
+<h1>keychain: Key manager for OpenSSH (installed binaries and support files)</h1>
+<tt><pre>
+    2012-10-10 05:40           0 usr/
+    2012-10-10 05:40           0 usr/bin/
+    2012-10-10 05:40       50490 usr/bin/keychain
+    2012-10-10 05:40           0 usr/share/
+    2012-10-10 05:40           0 usr/share/doc/
+    2012-10-10 05:40           0 usr/share/doc/Cygwin/
+    2012-10-10 05:40        2120 usr/share/doc/Cygwin/keychain-2.7.1.README
+    2012-10-10 05:40           0 usr/share/doc/keychain/
+    2012-10-10 05:40       17921 usr/share/doc/keychain/COPYING.txt
+    2012-10-10 05:40        8980 usr/share/doc/keychain/keychain.txt
+    2012-10-10 05:40       14144 usr/share/doc/keychain/README.rst
+    2012-10-10 05:40           0 usr/share/man/
+    2012-10-10 05:40           0 usr/share/man/man1/
+    2012-10-10 05:40        5326 usr/share/man/man1/keychain.1.gz
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1-src b/test/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1-src
new file mode 100644
index 0000000..ce348ee
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1-src
@@ -0,0 +1,10 @@
+<html>
+<h1>keychain: Key manager for OpenSSH (source code)</h1>
+<tt><pre>
+    2012-10-10 05:40       24455 keychain-2.7.1-1-cygwin.patch
+    2012-10-10 05:40         270 keychain-2.7.1-1-cygwin.patch.sig
+    2012-10-10 05:40      320093 keychain-2.7.1-1.sh
+    2012-10-10 05:40         260 keychain-2.7.1-1.sh.sig
+    2012-10-10 05:40       65211 keychain_2.7.1.orig.tar.gz
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/libdns_sd-devel/.htaccess b/test/testdata/htdocs.expected/x86/libdns_sd-devel/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libdns_sd-devel/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1 b/test/testdata/htdocs.expected/x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1
new file mode 100644
index 0000000..487ca66
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1
@@ -0,0 +1,7 @@
+<html>
+<h1>libdns_sd-devel: Bonjour Zeroconf implementation (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/libdns_sd1/.htaccess b/test/testdata/htdocs.expected/x86/libdns_sd1/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libdns_sd1/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/libdns_sd1/libdns_sd1-379.32.1-1 b/test/testdata/htdocs.expected/x86/libdns_sd1/libdns_sd1-379.32.1-1
new file mode 100644
index 0000000..ef59595
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libdns_sd1/libdns_sd1-379.32.1-1
@@ -0,0 +1,7 @@
+<html>
+<h1>libdns_sd1: Bonjour Zeroconf implementation (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/libtextcat-devel/.htaccess b/test/testdata/htdocs.expected/x86/libtextcat-devel/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libtextcat-devel/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/libtextcat-devel/libtextcat-devel-2.2-2 b/test/testdata/htdocs.expected/x86/libtextcat-devel/libtextcat-devel-2.2-2
new file mode 100644
index 0000000..03d1ee6
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libtextcat-devel/libtextcat-devel-2.2-2
@@ -0,0 +1,7 @@
+<html>
+<h1>libtextcat-devel: Helper, header and library for libtextcat (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/libtextcat0/.htaccess b/test/testdata/htdocs.expected/x86/libtextcat0/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libtextcat0/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/libtextcat0/libtextcat0-2.2-2 b/test/testdata/htdocs.expected/x86/libtextcat0/libtextcat0-2.2-2
new file mode 100644
index 0000000..076ed7a
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/libtextcat0/libtextcat0-2.2-2
@@ -0,0 +1,7 @@
+<html>
+<h1>libtextcat0: Text Classification Library dll (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/mDNSResponder/.htaccess b/test/testdata/htdocs.expected/x86/mDNSResponder/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/mDNSResponder/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1 b/test/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1
new file mode 100644
index 0000000..67c4449
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1
@@ -0,0 +1,7 @@
+<html>
+<h1>mDNSResponder: Bonjour Zeroconf implementation (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1-src b/test/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1-src
new file mode 100644
index 0000000..9a7db69
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1-src
@@ -0,0 +1,7 @@
+<html>
+<h1>mDNSResponder: Bonjour Zeroconf implementation (source code)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/naim/.htaccess b/test/testdata/htdocs.expected/x86/naim/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/naim/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/openssh/.htaccess b/test/testdata/htdocs.expected/x86/openssh/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/openssh/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1 b/test/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1
new file mode 100644
index 0000000..cb2b272
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1
@@ -0,0 +1,7 @@
+<html>
+<h1>openssh: The OpenSSH server and client programs (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1-src b/test/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1-src
new file mode 100644
index 0000000..e85cbee
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1-src
@@ -0,0 +1,7 @@
+<html>
+<h1>openssh: The OpenSSH server and client programs (source code)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/packages.inc b/test/testdata/htdocs.expected/x86/packages.inc
new file mode 100755
index 0000000..289a07e
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/packages.inc
@@ -0,0 +1,23 @@
+<div id="x86">
+<div id="background">
+<b class="rtop"><b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b></b>
+<h2>Available Packages for x86</h2>
+<b class="rbottom"><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b></b>
+</div>
+<br>
+<table class="pkglist">
+<tr><td><a href="x86/arc">arc</a></td><td>The ARC archive utility</td></tr>
+<tr><td><a href="x86/base-cygwin">base-cygwin</a></td><td>Initial base installation helper script</td></tr>
+<tr><td><a href="x86/cygwin">cygwin</a></td><td>The UNIX emulation engine</td></tr>
+<tr><td><a href="x86/cygwin-debuginfo">cygwin-debuginfo</a></td><td>Debug info for cygwin</td></tr>
+<tr><td><a href="x86/cygwin-devel">cygwin-devel</a></td><td>Core development files</td></tr>
+<tr><td><a href="x86/keychain">keychain</a></td><td>Key manager for OpenSSH</td></tr>
+<tr><td><a href="x86/libdns_sd-devel">libdns_sd-devel</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr><td><a href="x86/libdns_sd1">libdns_sd1</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr><td><a href="x86/mDNSResponder">mDNSResponder</a></td><td>Bonjour Zeroconf implementation</td></tr>
+<tr><td><a href="x86/openssh">openssh</a></td><td>The OpenSSH server and client programs</td></tr>
+<tr><td><a href="x86/perl-Net-SMTP-SSL">perl-Net-SMTP-SSL</a></td><td>Perl distribution Net-SMTP-SSL</td></tr>
+<tr><td><a href="x86/rpm-doc">rpm-doc</a></td><td>Obsolete package for RPM package management system manual pages</td></tr>
+<tr><td><a href="x86/testpackage">testpackage</a></td><td>A test package</td></tr>
+</table>
+</div>
diff --git a/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/.htaccess b/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1 b/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1
new file mode 100644
index 0000000..0f6212c
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1
@@ -0,0 +1,21 @@
+<html>
+<h1>perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (installed binaries and support files)</h1>
+<tt><pre>
+    2015-06-26 19:10           0 usr/
+    2015-06-26 19:10           0 usr/lib/
+    2015-06-26 19:10           0 usr/lib/perl5/
+    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/
+    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/5.22/
+    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/5.22/Net/
+    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/5.22/Net/SMTP/
+    2015-06-21 01:58        1462 usr/lib/perl5/vendor_perl/5.22/Net/SMTP/SSL.pm
+    2015-06-26 19:10           0 usr/share/
+    2015-06-26 19:10           0 usr/share/doc/
+    2015-06-26 19:10           0 usr/share/doc/perl-Net-SMTP-SSL/
+    2015-06-26 19:10         199 usr/share/doc/perl-Net-SMTP-SSL/Changes
+    2015-06-26 19:10         867 usr/share/doc/perl-Net-SMTP-SSL/README
+    2015-06-26 19:10           0 usr/share/man/
+    2015-06-26 19:10           0 usr/share/man/man3/
+    2015-06-26 19:10        1619 usr/share/man/man3/Net.SMTP.SSL.3pm.gz
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src b/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src
new file mode 100644
index 0000000..76e9a50
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src
@@ -0,0 +1,8 @@
+<html>
+<h1>perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (source code)</h1>
+<tt><pre>
+    2015-06-26 19:10           0 perl-Net-SMTP-SSL-1.03-1.src/
+    2015-06-26 19:10        2271 perl-Net-SMTP-SSL-1.03-1.src/Net-SMTP-SSL-1.03.tar.gz
+    2015-06-26 19:10         296 perl-Net-SMTP-SSL-1.03-1.src/perl-Net-SMTP-SSL.cygport
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/proj-debuginfo/.htaccess b/test/testdata/htdocs.expected/x86/proj-debuginfo/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/proj-debuginfo/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/proj-debuginfo/proj-debuginfo-4.8.0-1 b/test/testdata/htdocs.expected/x86/proj-debuginfo/proj-debuginfo-4.8.0-1
new file mode 100644
index 0000000..d8a0fc4
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/proj-debuginfo/proj-debuginfo-4.8.0-1
@@ -0,0 +1,7 @@
+<html>
+<h1>proj-debuginfo: Debug info for proj (installed binaries and support files)</h1>
+<tt><pre>
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/rpm-doc/.htaccess b/test/testdata/htdocs.expected/x86/rpm-doc/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/rpm-doc/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2 b/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2
new file mode 100644
index 0000000..8ffbe70
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2
@@ -0,0 +1,18 @@
+<html>
+<h1>rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)</h1>
+<tt><pre>
+    2003-05-02 11:46       25562 usr/man/fr/man8/rpm.8
+    2003-05-02 11:46       39721 usr/man/ja/man8/rpm.8
+    2003-05-02 11:46         962 usr/man/ja/man8/rpm2cpio.8
+    2003-05-02 11:46       10925 usr/man/ko/man8/rpm.8
+    2003-05-02 11:46         675 usr/man/ko/man8/rpm2cpio.8
+    2003-05-02 11:46        1642 usr/man/man1/gendiff.1
+    2003-05-02 11:46       28286 usr/man/man8/rpm.8
+    2003-05-02 11:46         603 usr/man/man8/rpm2cpio.8
+    2003-05-02 11:46       21387 usr/man/pl/man8/rpm.8
+    2003-05-02 11:46         657 usr/man/pl/man8/rpm2cpio.8
+    2003-05-02 11:46       22681 usr/man/ru/man8/rpm.8
+    2003-05-02 11:46         603 usr/man/ru/man8/rpm2cpio.8
+    2003-05-02 11:46       23159 usr/man/sk/man8/rpm.8
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src b/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src
new file mode 100644
index 0000000..3566e39
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src
@@ -0,0 +1,5 @@
+<html>
+<h1>rpm-doc: Obsolete package for RPM package management system manual pages (source code)</h1>
+<tt><pre>
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1 b/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1
new file mode 100644
index 0000000..b5b04ec
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1
@@ -0,0 +1,5 @@
+<html>
+<h1>rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)</h1>
+<tt><pre>
+</pre></tt>
+</html>
diff --git a/test/testdata/htdocs.expected/x86/testpackage/.htaccess b/test/testdata/htdocs.expected/x86/testpackage/.htaccess
new file mode 100644
index 0000000..3196d64
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/testpackage/.htaccess
@@ -0,0 +1,3 @@
+Options Indexes
+IndexOptions -FancyIndexing
+AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/test/testdata/htdocs.expected/x86/testpackage/testpackage-0.1-1 b/test/testdata/htdocs.expected/x86/testpackage/testpackage-0.1-1
new file mode 100644
index 0000000..76208aa
--- /dev/null
+++ b/test/testdata/htdocs.expected/x86/testpackage/testpackage-0.1-1
@@ -0,0 +1,5 @@
+<html>
+<h1>testpackage: A test package (installed binaries and support files)</h1>
+<tt><pre>
+</pre></tt>
+</html>
diff --git a/test/testdata/inifile/setup.ini.expected b/test/testdata/inifile/setup.ini.expected
new file mode 100644
index 0000000..c41865a
--- /dev/null
+++ b/test/testdata/inifile/setup.ini.expected
@@ -0,0 +1,215 @@
+('# This file is automatically generated.  If you edit it, your\n'
+ '# edits will be discarded next time the file is generated.\n'
+ '# See http://cygwin.com/setup.html for details.\n'
+ '#\n'
+ 'release: testing\n'
+ 'arch: x86\n'
+ 'setup-timestamp: 1458221800\n'
+ 'setup-version: 4.321\n'
+ '\n'
+ '@ arc\n'
+ 'sdesc: "The ARC archive utility"\n'
+ 'ldesc: "This program is based on the MSDOS ARC program, version 5.21, plus a\n'
+ 'few enhancements. ARC performs Huffman Squeezing on data. The Huffman\n'
+ 'Squeeze algorithm was removed from MSDOS ARC after version 5.12. It\n'
+ 'turns out to be more efficient than Lempel-Ziv style compression when\n'
+ 'compressing graphic images. Squeeze analysis is always done now, and\n'
+ 'the best of packing, squeezing, or crunching is used."\n'
+ 'category: Archive\n'
+ 'version: 4.32.7-10\n'
+ 'install: x86/release/arc/arc-4.32.7-10.tar.bz2 14 '
+ '6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348\n'
+ 'source: x86/release/arc/arc-4.32.7-10-src.tar.bz2 14 '
+ '6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348\n'
+ '\n'
+ '@ base-cygwin\n'
+ 'sdesc: "Initial base installation helper script"\n'
+ 'ldesc: "Initial base installation helper script."\n'
+ 'category: Base\n'
+ 'version: 3.8-1\n'
+ 'install: x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
+ 'version: 3.6-1\n'
+ 'install: x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '\n'
+ '@ cygwin\n'
+ 'sdesc: "The UNIX emulation engine"\n'
+ 'ldesc: "The UNIX emulation engine"\n'
+ 'category: Base\n'
+ 'requires: base-cygwin\n'
+ 'version: 2.2.1-1\n'
+ 'install: x86/release/cygwin/cygwin-2.2.1-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
+ 'version: 2.2.0-1\n'
+ 'install: x86/release/cygwin/cygwin-2.2.0-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[test]\n'
+ 'version: 2.3.0-0.3\n'
+ 'install: x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '\n'
+ '@ cygwin-debuginfo\n'
+ 'sdesc: "Debug info for cygwin"\n'
+ 'ldesc: "This package contains files necessary for debugging the\n'
+ 'cygwin package with gdb."\n'
+ 'category: Debug\n'
+ 'requires: cygwin-debuginfo\n'
+ 'version: 2.2.1-1\n'
+ 'install: x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
+ 'version: 2.2.0-1\n'
+ 'install: x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[test]\n'
+ 'version: 2.3.0-0.3\n'
+ 'install: x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '\n'
+ '@ cygwin-devel\n'
+ 'sdesc: "Core development files"\n'
+ 'ldesc: "Core development files required to build Cygwin packages"\n'
+ 'category: Devel\n'
+ 'version: 2.2.1-1\n'
+ 'install: x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[prev]\n'
+ 'version: 2.2.0-1\n'
+ 'install: x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '[test]\n'
+ 'version: 2.3.0-0.3\n'
+ 'install: x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '\n'
+ '@ keychain\n'
+ 'sdesc: "Key manager for OpenSSH"\n'
+ 'ldesc: "Keychain is an OpenSSH key manager, typically run from\n'
+ '~/.bash_profile. When keychain is run, it checks for a running\n'
+ 'ssh-agent, otherwise it starts one. It saves the ssh-agent environment\n'
+ 'variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins\n'
+ 'and non-interactive shells such as cron jobs can source the file and\n'
+ 'make passwordless ssh connections. In addition, when keychain runs, it\n'
+ 'verifies that the key files specified on the command-line are known to\n'
+ 'ssh-agent, otherwise it loads them, prompting you for a password if\n'
+ 'necessary"\n'
+ 'category: Utils\n'
+ 'requires: openssh\n'
+ 'version: 2.7.1-1\n'
+ 'install: x86/release/keychain/keychain-2.7.1-1.tar.bz2 32219 '
+ '0c7b7ad2636b6e23e40e8cb593196b3fabe9c44f7618ea9b2021b89ecdc08720a7f824be0beaa75c9e62dda9a7b5ed7e9c1ed147a1875c582e80866ad09533a2\n'
+ 'source: x86/release/keychain/keychain-2.7.1-1-src.tar.bz2 134875 '
+ 'cef733c5f1ba7380088ce4b12be0a70c3d657fd0e26beae11cf96bbbc2a02c492dafef700adac1059ee643208d76b5f19042e01d9628b2463b916b3dea13aa54\n'
+ '[prev]\n'
+ 'version: 2.6.8-1\n'
+ 'install: x86/release/keychain/keychain-2.6.8-1.tar.bz2 30476 '
+ '05af40c0fabbd2ea8f8b74719434371a47c7751986fe6411c17e18cda7d03947c5785ed164dfe59b7238831cc10d8e29f4f88bf3414420bd3231423f424c00bd\n'
+ 'source: x86/release/keychain/keychain-2.6.8-1-src.tar.bz2 36347 '
+ '2151b73a9ec2ece63a842ddad6de19bcfdf097b86d4cae932eeadfc64640997051254001f31081e80272e020887b9599188990368c833ba10886f0ba32a3415e\n'
+ '\n'
+ '@ libdns_sd-devel\n'
+ 'sdesc: "Bonjour Zeroconf implementation"\n'
+ 'ldesc: "Bonjour, also known as zero-configuration networking, enables\n'
+ 'automatic discovery of computers, devices, and services on IP networks using\n'
+ 'industry standard IP protocols."\n'
+ 'category: Net\n'
+ 'requires: libdns_sd1\n'
+ 'version: 379.32.1-1\n'
+ 'install: x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2 195 '
+ 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
+ 'source: x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 195 '
+ 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
+ '\n'
+ '@ libdns_sd1\n'
+ 'sdesc: "Bonjour Zeroconf implementation"\n'
+ 'ldesc: "Bonjour, also known as zero-configuration networking, enables\n'
+ 'automatic discovery of computers, devices, and services on IP networks using\n'
+ 'industry standard IP protocols."\n'
+ 'category: Net\n'
+ 'version: 379.32.1-1\n'
+ 'install: x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2 195 '
+ 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
+ 'source: x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 195 '
+ 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
+ '\n'
+ '@ mDNSResponder\n'
+ 'sdesc: "Bonjour Zeroconf implementation"\n'
+ 'ldesc: "Bonjour, also known as zero-configuration networking, enables\n'
+ 'automatic discovery of computers, devices, and services on IP networks using\n'
+ 'industry standard IP protocols."\n'
+ 'category: Net\n'
+ 'requires: libdns_sd1\n'
+ 'version: 379.32.1-1\n'
+ 'install: x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 195 '
+ 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
+ 'source: x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 195 '
+ 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
+ 'message: mDNSResponder "The Cygwin mDNSResponder package contains only clients.\n'
+ "If you do not already have the 'Bonjour Service' installed (it comes with\n"
+ 'a number of popular Windows programs), then you can download it at\n'
+ 'http://support.apple.com/kb/DL999"\n'
+ '\n'
+ '@ openssh\n'
+ 'sdesc: "The OpenSSH server and client programs"\n'
+ 'ldesc: "OpenSSH is a program for logging into a remote machine and for\n'
+ '\texecuting commands on a remote machine.  It can replace rlogin and rsh,\n'
+ '\tproviding encrypted communication between two machines."\n'
+ 'category: Net\n'
+ 'version: 7.2p2-1\n'
+ 'install: x86/release/openssh/openssh-7.2p2-1.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ 'source: x86/release/openssh/openssh-7.2p2-1-src.tar.xz 228 '
+ 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
+ '\n'
+ '@ perl-Net-SMTP-SSL\n'
+ 'sdesc: "Perl distribution Net-SMTP-SSL"\n'
+ 'ldesc: "Implements the same API as Net::SMTP, but uses IO::Socket::SSL for\n'
+ 'its network operations in order to support encrypted connections."\n'
+ 'category: Perl\n'
+ 'version: 1.03-1\n'
+ 'install: noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz 3180 '
+ 'aac6428f56fed431da1430242a327f36f1ec1ca6106366acb6752dd87f1b9adb87767709be9279b2f9435d16cee003f119a5ed4519c7365c8411404555618e66\n'
+ 'source: noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz 2752 '
+ '4de528554acb0b63f2a964bc8a0421118f96ce05cb4c9d111983aaea1a4a93025b31627fd66875fa09c2dfaecc11a89f2a294bdd3c77055bfaa93a27fdfc1f07\n'
+ '\n'
+ '@ rpm-doc\n'
+ 'sdesc: "Obsolete package for RPM package management system manual pages"\n'
+ 'category: _obsolete\n'
+ 'version: 999-1\n'
+ 'install: x86/release/rpm-doc/rpm-doc-999-1.tar.bz2 42 '
+ '28c70b843fe01d90a3eeab4a3617551d236cd0b7d69668d1b1b6c8b14a9fd050e4039c192894c93bdf31575771c58c1fea2a41c24c8da22d10080d8b032b6369\n'
+ '[prev]\n'
+ 'version: 4.1-2\n'
+ 'install: x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2 50941 '
+ '7cc9db802364252e3206ce9f75c8ca53813d8308a22a425b50ef695dd8e51568740b06739d3aa3399a83fb3d3e1345ab7e2ad03a1e9d47c02dded3363bf4f493\n'
+ 'source: x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2 42 '
+ '28c70b843fe01d90a3eeab4a3617551d236cd0b7d69668d1b1b6c8b14a9fd050e4039c192894c93bdf31575771c58c1fea2a41c24c8da22d10080d8b032b6369\n'
+ '\n'
+ '@ testpackage\n'
+ 'sdesc: "A test package"\n'
+ 'ldesc: "A test package"\n'
+ 'category: Devel\n'
+ 'version: 0.1-1\n'
+ 'install: x86/release/testpackage/testpackage-0.1-1.tar.bz2 0 '
+ 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e\n',)
diff --git a/test/testdata/pkglist/cygwin-pkg-maint b/test/testdata/pkglist/cygwin-pkg-maint
new file mode 100644
index 0000000..c157e17
--- /dev/null
+++ b/test/testdata/pkglist/cygwin-pkg-maint
@@ -0,0 +1,2501 @@
+4ti2                                         Yue Ren/Marco Atzeri
+a2ps                                         Yaakov Selkowitz
+aalib                                        Dr. Volker Zell
+abook                                        Jari Aalto
+accerciser                                   Yaakov Selkowitz
+activity-log-manager                         Yaakov Selkowitz
+adobe-source-code-pro-fonts                  Yaakov Selkowitz
+adobe-source-sans-pro-fonts                  Yaakov Selkowitz
+adobe-source-serif-pro-fonts                 Yaakov Selkowitz
+adwaita-icon-theme                           Yaakov Selkowitz
+aewm++                                       Jari Aalto
+aewm++-goodies                               Jari Aalto
+afio                                         Jari Aalto
+akonadi                                      Yaakov Selkowitz
+alacarte                                     Yaakov Selkowitz
+alef-fonts                                   Yaakov Selkowitz
+algol68g                                     Thomas Wolff
+alternatives                                 ORPHANED (Charles Wilson)
+amd                                          Marco Atzeri
+amor                                         Yaakov Selkowitz
+analitza                                     Yaakov Selkowitz
+anjuta                                       Yaakov Selkowitz
+annoyance-filter                             Jari Aalto
+anthy                                        Yaakov Selkowitz
+antiword                                     Jari Aalto
+apng2gif                                     Jari Aalto
+apngasm                                      Jari Aalto
+apngdis                                      Jari Aalto
+apngopt                                      Jari Aalto
+apngtools                                    Jari Aalto
+appdata-tools                                Yaakov Selkowitz
+appres                                       Yaakov Selkowitz
+appstream-glib                               Yaakov Selkowitz
+arc                                          Jari Aalto
+archivemail                                  Jari Aalto
+aria2                                        ORPHANED
+arj                                          Jari Aalto
+ark                                          Yaakov Selkowitz
+arpack                                       Marco Atzeri
+artwiz-aleczapka-fonts                       Yaakov Selkowitz
+ascii                                        Yaakov Selkowitz
+asciidoc                                     ORPHANED (Eric Blake)
+aspell                                       Dr. Volker Zell
+aspell-de                                    Dr. Volker Zell
+aspell-en                                    Dr. Volker Zell
+aspell-pl                                    Dr. Volker Zell
+aspell-sv                                    Dr. Volker Zell
+astyle                                       ORPHANED (Chris Sutcliffe)
+asymptote                                    Ken Brown
+at-spi2-atk                                  Yaakov Selkowitz
+at-spi2-core                                 Yaakov Selkowitz
+atk1.0                                       Yaakov Selkowitz
+atkmm1.6                                     Yaakov Selkowitz
+AtomicParsley                                David Stacey
+atool                                        Andrew Schulman
+atril                                        Yaakov Selkowitz
+attica                                       Yaakov Selkowitz
+attr                                         Corinna Vinschen
+audiofile                                    Yaakov Selkowitz
+autobuild                                    ORPHANED (Charles Wilson)
+autoconf                                     Yaakov Selkowitz
+autoconf-archive                             Yaakov Selkowitz
+autoconf2.1                                  Yaakov Selkowitz
+autoconf2.5                                  Yaakov Selkowitz
+autogen                                      Yaakov Selkowitz
+automake                                     Yaakov Selkowitz
+automake1.10                                 Yaakov Selkowitz
+automake1.11                                 Yaakov Selkowitz
+automake1.12                                 Yaakov Selkowitz
+automake1.13                                 Yaakov Selkowitz
+automake1.14                                 Yaakov Selkowitz
+automake1.15                                 Yaakov Selkowitz
+automake1.4                                  Yaakov Selkowitz
+automake1.5                                  Yaakov Selkowitz
+automake1.6                                  Yaakov Selkowitz
+automake1.7                                  Yaakov Selkowitz
+automake1.8                                  Yaakov Selkowitz
+automake1.9                                  Yaakov Selkowitz
+automoc4                                     Yaakov Selkowitz
+autossh                                      Andrew Schulman
+autotrace                                    Marco Atzeri
+avahi                                        Yaakov Selkowitz
+aview                                        Jari Aalto
+balance                                      Dr. Volker Zell
+baloo                                        Yaakov Selkowitz
+baloo-widgets                                Yaakov Selkowitz
+baobab                                       Yaakov Selkowitz
+base-cygwin                                  Corinna Vinschen
+base-files                                   Achim Gratz
+bash                                         Eric Blake
+bash-completion                              Eric Blake
+bashdb                                       Eric Blake
+bc                                           Andrew Schulman
+bcrypt                                       Jari Aalto
+bdftopcf                                     Yaakov Selkowitz
+beforelight                                  Yaakov Selkowitz
+biber                                        Ken Brown
+bigreqsproto                                 Yaakov Selkowitz
+bind                                         Yaakov Selkowitz
+binutils                                     Jonathan Yong
+bison                                        Eric Blake
+bitmap                                       Yaakov Selkowitz
+blinken                                      Yaakov Selkowitz
+bmp2png                                      Jari Aalto
+bogofilter                                   Yaakov Selkowitz
+bomber                                       Yaakov Selkowitz
+bool                                         Jari Aalto
+boost                                        Yaakov Selkowitz
+botan1.10                                    Yaakov Selkowitz
+bovo                                         Yaakov Selkowitz
+boxes                                        Jari Aalto
+bsdiff                                       Marco Atzeri
+bsfilter                                     Jari Aalto
+bsflite                                      Dr. Volker Zell
+btf                                          Marco Atzeri
+build-docbook-catalog                        Yaakov Selkowitz
+buildbot-slave                               Jon Turney
+busybox                                      Christian Franke
+bvi                                          Jari Aalto
+byacc                                        ORPHANED
+bzip2                                        Yaakov Selkowitz
+bzr                                          Jari Aalto
+bzr-fastimport                               Ken Brown
+ca-certificates                              Yaakov Selkowitz
+cabextract                                   Stuart Caie
+cadaver                                      Dr. Volker Zell
+cairo                                        Yaakov Selkowitz
+cairomm1.0                                   Yaakov Selkowitz
+caja                                         Yaakov Selkowitz
+caja-actions                                 Yaakov Selkowitz
+caja-extensions                              Yaakov Selkowitz
+caja-follow-symlink                          Yaakov Selkowitz
+caja-python                                  Yaakov Selkowitz
+camd                                         Marco Atzeri
+cantarell-fonts                              Yaakov Selkowitz
+cantor                                       Yaakov Selkowitz
+caribou                                      Yaakov Selkowitz
+catdoc                                       Marco Atzeri
+catgets                                      Corinna Vinschen
+ccache                                       ORPHANED
+cccc                                         Jari Aalto
+ccdoc                                        ORPHANED (Joe Linoff)
+ccolamd                                      Marco Atzeri
+ccrypt                                       Marco Atzeri
+cdargs                                       Jari Aalto
+cddlib                                       Yue Ren/Marco Atzeri
+cdrkit                                       Christian Franke
+celt051                                      Yaakov Selkowitz
+cfget                                        Jari Aalto
+cfourcc                                      Jari Aalto
+cfv                                          Jari Aalto
+cgdb                                         Jari Aalto
+cgoban                                       ORPHANED (Teun Burgers)
+check                                        Yaakov Selkowitz
+checkbashisms                                Jari Aalto
+chere                                        Dave Kilroy
+chewmail                                     Jari Aalto
+chicken                                      Christian Kellermann
+chkconfig                                    Jari Aalto
+cholmod                                      Marco Atzeri
+choqok                                       Yaakov Selkowitz
+clamav                                       Yaakov Selkowitz
+clisp                                        Ken Brown
+cln                                          Yaakov Selkowitz
+cloog-isl                                    Achim Gratz
+clutter-gtk0.10                              Yaakov Selkowitz
+clutter-gtk1.0                               Yaakov Selkowitz
+clutter1.0                                   Yaakov Selkowitz
+cmake                                        Tony Kelman/William A. Hoffman
+cocom                                        Yaakov Selkowitz
+code2html                                    Jari Aalto
+codeville                                    Jari Aalto
+cogl                                         Yaakov Selkowitz
+colamd                                       Marco Atzeri
+colordiff                                    ORPHANED (Kostya Altukhov)
+colorgcc                                     Jari Aalto
+compface                                     Dr. Volker Zell
+compositeproto                               Yaakov Selkowitz
+connect-proxy                                Marco Atzeri
+connectagram                                 Yaakov Selkowitz
+convmv                                       Jari Aalto
+copyright-update                             Jari Aalto
+corebird                                     Yaakov Selkowitz
+coreutils                                    Eric Blake
+corkscrew                                    Jari Aalto
+cpio                                         Corinna Vinschen/Yaakov Selkowitz
+cppcheck                                     David Stacey
+cppi                                         Eric Blake
+cppunit                                      Yaakov Selkowitz
+cramfs                                       ORPHANED (Sam Robb)
+cron                                         Pierre A. Humblet
+crypt                                        Corinna Vinschen
+cscope                                       Jari Aalto
+csih                                         Corinna Vinschen
+ctags                                        Warren Young
+ctorrent                                     Jari Aalto
+ctris                                        ORPHANED
+culmus-fonts                                 Yaakov Selkowitz
+CUnit                                        Marco Atzeri
+curl                                         Yaakov Selkowitz
+cutemaze                                     Yaakov Selkowitz
+cvs                                          Marco Atzeri
+cvs2svn                                      Yaakov Selkowitz
+cvsps                                        ORPHANED (Eric Blake)
+cvsutils                                     Eric Blake
+cxsparse                                     Marco Atzeri
+cygcheck-dep                                 Mikhail Usenko
+cygport                                      Yaakov Selkowitz
+cygrunsrv                                    Corinna Vinschen
+cygutils                                     ORPHANED (Charles Wilson)
+cygwin                                       Corinna Vinschen/Yaakov Selkowitz
+cygwin-devel                                 Corinna Vinschen
+cygwin-doc                                   Jon Turney
+cygwin-x-doc                                 Jon Turney
+cygwin32                                     Yaakov Selkowitz
+cygwin32-binutils                            Yaakov Selkowitz
+cygwin32-bzip2                               Yaakov Selkowitz
+cygwin32-catgets                             Yaakov Selkowitz
+cygwin32-clang                               Yaakov Selkowitz
+cygwin32-cloog-isl                           Yaakov Selkowitz
+cygwin32-crypt                               Yaakov Selkowitz
+cygwin32-default-manifest                    Yaakov Selkowitz
+cygwin32-expat                               Yaakov Selkowitz
+cygwin32-freetype2                           Yaakov Selkowitz
+cygwin32-gcc                                 Yaakov Selkowitz
+cygwin32-gettext                             Yaakov Selkowitz
+cygwin32-gmp                                 Yaakov Selkowitz
+cygwin32-gnutls                              Yaakov Selkowitz
+cygwin32-isl                                 Yaakov Selkowitz
+cygwin32-jbigkit                             Yaakov Selkowitz
+cygwin32-libbfd                              Yaakov Selkowitz
+cygwin32-libedit                             Yaakov Selkowitz
+cygwin32-libffi                              Yaakov Selkowitz
+cygwin32-libiconv                            Yaakov Selkowitz
+cygwin32-libmpc                              Yaakov Selkowitz
+cygwin32-libpng                              Yaakov Selkowitz
+cygwin32-libtasn1                            Yaakov Selkowitz
+cygwin32-libtool                             Yaakov Selkowitz
+cygwin32-libX11                              Yaakov Selkowitz
+cygwin32-libXau                              Yaakov Selkowitz
+cygwin32-libxcb                              Yaakov Selkowitz
+cygwin32-libXdmcp                            Yaakov Selkowitz
+cygwin32-lzo2                                Yaakov Selkowitz
+cygwin32-mpfr                                Yaakov Selkowitz
+cygwin32-ncurses                             Yaakov Selkowitz
+cygwin32-nettle                              Yaakov Selkowitz
+cygwin32-openssl                             Yaakov Selkowitz
+cygwin32-p11-kit                             Yaakov Selkowitz
+cygwin32-pcre                                Yaakov Selkowitz
+cygwin32-pkg-config                          Yaakov Selkowitz
+cygwin32-readline                            Yaakov Selkowitz
+cygwin32-w32api-headers                      Yaakov Selkowitz
+cygwin32-w32api-runtime                      Yaakov Selkowitz
+cygwin32-xproto                              Yaakov Selkowitz
+cygwin32-zlib                                Yaakov Selkowitz
+cygwin64                                     Yaakov Selkowitz
+cygwin64-binutils                            Yaakov Selkowitz
+cygwin64-bzip2                               Yaakov Selkowitz
+cygwin64-catgets                             Yaakov Selkowitz
+cygwin64-clang                               Yaakov Selkowitz
+cygwin64-cloog-isl                           Yaakov Selkowitz
+cygwin64-crypt                               Yaakov Selkowitz
+cygwin64-db                                  Yaakov Selkowitz
+cygwin64-default-manifest                    Yaakov Selkowitz
+cygwin64-e2fsprogs                           Yaakov Selkowitz
+cygwin64-expat                               Yaakov Selkowitz
+cygwin64-fontconfig                          Yaakov Selkowitz
+cygwin64-freetype2                           Yaakov Selkowitz
+cygwin64-gcc                                 Yaakov Selkowitz
+cygwin64-gdbm                                Yaakov Selkowitz
+cygwin64-gettext                             Yaakov Selkowitz
+cygwin64-gmp                                 Yaakov Selkowitz
+cygwin64-gnutls                              Yaakov Selkowitz
+cygwin64-isl                                 Yaakov Selkowitz
+cygwin64-jbigkit                             Yaakov Selkowitz
+cygwin64-libarchive                          Yaakov Selkowitz
+cygwin64-libbfd                              Yaakov Selkowitz
+cygwin64-libdmx                              Yaakov Selkowitz
+cygwin64-libedit                             Yaakov Selkowitz
+cygwin64-libffi                              Yaakov Selkowitz
+cygwin64-libfontenc                          Yaakov Selkowitz
+cygwin64-libgcrypt                           Yaakov Selkowitz
+cygwin64-libgpg-error                        Yaakov Selkowitz
+cygwin64-libICE                              Yaakov Selkowitz
+cygwin64-libiconv                            Yaakov Selkowitz
+cygwin64-libjpeg-turbo                       Yaakov Selkowitz
+cygwin64-libmagic                            Yaakov Selkowitz
+cygwin64-libmpc                              Yaakov Selkowitz
+cygwin64-libpng                              Yaakov Selkowitz
+cygwin64-libSM                               Yaakov Selkowitz
+cygwin64-libssh2                             Yaakov Selkowitz
+cygwin64-libtasn1                            Yaakov Selkowitz
+cygwin64-libtool                             Yaakov Selkowitz
+cygwin64-libX11                              Yaakov Selkowitz
+cygwin64-libXau                              Yaakov Selkowitz
+cygwin64-libXaw                              Yaakov Selkowitz
+cygwin64-libxcb                              Yaakov Selkowitz
+cygwin64-libXcomposite                       Yaakov Selkowitz
+cygwin64-libXdamage                          Yaakov Selkowitz
+cygwin64-libXdmcp                            Yaakov Selkowitz
+cygwin64-libXext                             Yaakov Selkowitz
+cygwin64-libXfixes                           Yaakov Selkowitz
+cygwin64-libXft                              Yaakov Selkowitz
+cygwin64-libXi                               Yaakov Selkowitz
+cygwin64-libxml2                             Yaakov Selkowitz
+cygwin64-libXmu                              Yaakov Selkowitz
+cygwin64-libXpm                              Yaakov Selkowitz
+cygwin64-libXrandr                           Yaakov Selkowitz
+cygwin64-libXrender                          Yaakov Selkowitz
+cygwin64-libxslt                             Yaakov Selkowitz
+cygwin64-libXss                              Yaakov Selkowitz
+cygwin64-libXt                               Yaakov Selkowitz
+cygwin64-lzo2                                Yaakov Selkowitz
+cygwin64-mpfr                                Yaakov Selkowitz
+cygwin64-ncurses                             Yaakov Selkowitz
+cygwin64-nettle                              Yaakov Selkowitz
+cygwin64-openssl                             Yaakov Selkowitz
+cygwin64-p11-kit                             Yaakov Selkowitz
+cygwin64-pcre                                Yaakov Selkowitz
+cygwin64-pixman                              Yaakov Selkowitz
+cygwin64-pkg-config                          Yaakov Selkowitz
+cygwin64-popt                                Yaakov Selkowitz
+cygwin64-python                              Yaakov Selkowitz
+cygwin64-readline                            Yaakov Selkowitz
+cygwin64-sqlite3                             Yaakov Selkowitz
+cygwin64-tcl                                 Yaakov Selkowitz
+cygwin64-tiff                                Yaakov Selkowitz
+cygwin64-tk                                  Yaakov Selkowitz
+cygwin64-util-linux                          Yaakov Selkowitz
+cygwin64-w32api-headers                      Yaakov Selkowitz
+cygwin64-w32api-runtime                      Yaakov Selkowitz
+cygwin64-xcb-util                            Yaakov Selkowitz
+cygwin64-xcb-util-image                      Yaakov Selkowitz
+cygwin64-xcb-util-wm                         Yaakov Selkowitz
+cygwin64-xproto                              Yaakov Selkowitz
+cygwin64-zlib                                Yaakov Selkowitz
+cyrus-sasl                                   David Rothenberger
+damageproto                                  Yaakov Selkowitz
+dash                                         Eric Blake
+db                                           Dr. Volker Zell
+db4.5                                        Dr. Volker Zell
+db4.8                                        Dr. Volker Zell
+dblatex                                      Yaakov Selkowitz
+dbus                                         Yaakov Selkowitz
+dbus-glib                                    Yaakov Selkowitz
+dconf                                        Yaakov Selkowitz
+ddd                                          Jon Turney
+ddir                                         Jari Aalto
+ddrescue                                     Christian Franke
+dejagnu                                      Yaakov Selkowitz
+dejavu-fonts                                 Yaakov Selkowitz
+delta                                        Jari Aalto
+deroff                                       Jari Aalto
+desktop-file-utils                           Yaakov Selkowitz
+devhelp                                      Yaakov Selkowitz
+dhttpd                                       Jari Aalto
+dialog                                       Yaakov Selkowitz
+diffstat                                     Eric Blake
+diffutils                                    Eric Blake
+discus                                       Andrew Schulman
+distcc                                       ORPHANED (Harold L Hunt II)
+djvulibre                                    Yaakov Selkowitz
+dmalloc                                      Jon Turney
+dmtx-utils                                   Yaakov Selkowitz
+dmxproto                                     Yaakov Selkowitz
+docbook-dsssl                                Yaakov Selkowitz
+docbook-sgml30                               Yaakov Selkowitz
+docbook-sgml31                               Yaakov Selkowitz
+docbook-sgml40                               Yaakov Selkowitz
+docbook-sgml41                               Yaakov Selkowitz
+docbook-sgml42                               Yaakov Selkowitz
+docbook-sgml43                               Yaakov Selkowitz
+docbook-sgml44                               Yaakov Selkowitz
+docbook-sgml45                               Yaakov Selkowitz
+docbook-utils                                Yaakov Selkowitz
+docbook-xml-simple10                         Yaakov Selkowitz
+docbook-xml-simple11                         Yaakov Selkowitz
+docbook-xml412                               Yaakov Selkowitz
+docbook-xml42                                Yaakov Selkowitz
+docbook-xml43                                Yaakov Selkowitz
+docbook-xml44                                Yaakov Selkowitz
+docbook-xml45                                Yaakov Selkowitz
+docbook-xsl                                  Yaakov Selkowitz
+docbook-xsl-ns                               Yaakov Selkowitz
+docbook2X                                    Yaakov Selkowitz
+dog                                          Jari Aalto
+dos2unix                                     Erwin Waterlander
+doxygen                                      David Stacey
+duff                                         Jari Aalto
+e2fsimage                                    Yaakov Selkowitz
+e2fsprogs                                    Yaakov Selkowitz
+ebook-tools                                  Yaakov Selkowitz
+ed                                           Marco Atzeri
+editres                                      Yaakov Selkowitz
+editrights                                   Corinna Vinschen
+eekboard                                     Yaakov Selkowitz
+eigen3                                       Yaakov Selkowitz
+ELFIO                                        Serge Lamikhov-Center
+emacs                                        Ken Brown
+emacs-auctex                                 Ken Brown
+email                                        Corinna Vinschen
+empathy                                      Yaakov Selkowitz
+enchant                                      Yaakov Selkowitz
+engrampa                                     Yaakov Selkowitz
+enscript                                     Dr. Volker Zell
+eog                                          Yaakov Selkowitz
+eog-plugins                                  Yaakov Selkowitz
+eom                                          Yaakov Selkowitz
+epiphany                                     Yaakov Selkowitz
+epstool                                      Jari Aalto
+esound                                       Yaakov Selkowitz
+eventlog                                     Corinna Vinschen
+evince                                       Yaakov Selkowitz
+evolution                                    Yaakov Selkowitz
+evolution-data-server                        Yaakov Selkowitz
+evolution-ews                                Yaakov Selkowitz
+exempi                                       Yaakov Selkowitz
+exif                                         Yaakov Selkowitz
+exim                                         Pierre A. Humblet
+exiv2                                        Yaakov Selkowitz
+exo                                          Yaakov Selkowitz
+expat                                        Warren Young
+expect                                       Yaakov Selkowitz
+extra-cmake-modules                          Yaakov Selkowitz
+faience-icon-theme                           Yaakov Selkowitz
+farstream0.2                                 Yaakov Selkowitz
+fbpanel                                      Yaakov Selkowitz
+fbxkb                                        Yaakov Selkowitz
+fcgi                                         Ken Brown
+fcrackzip                                    Jari Aalto
+fdupes                                       Jari Aalto
+fetchmail                                    Corinna Vinschen
+ffcall                                       Ken Brown
+fftw3                                        Marco Atzeri
+figlet                                       Jari Aalto
+file                                         Corinna Vinschen/Yaakov Selkowitz
+file-roller                                  Yaakov Selkowitz
+findutils                                    Eric Blake
+fish                                         Andrew Schulman
+five-or-more                                 Yaakov Selkowitz
+fixesproto                                   Yaakov Selkowitz
+flac                                         David Rothenberger
+flawfinder                                   Jari Aalto
+flex                                         ORPHANED
+flexdll                                      Yaakov Selkowitz
+flint                                        Yue Ren/Marco Atzeri
+flip                                         Jari Aalto
+flog                                         Jari Aalto
+fltk                                         Yaakov Selkowitz
+fluidsynth                                   Yaakov Selkowitz
+focuswriter                                  Yaakov Selkowitz
+folks                                        Yaakov Selkowitz
+font-bitstream-vera-ttf                      Jon Turney
+font-util                                    Yaakov Selkowitz
+fontconfig                                   Yaakov Selkowitz
+fontforge                                    Yaakov Selkowitz
+fontsproto                                   Yaakov Selkowitz
+fonttosfnt                                   Yaakov Selkowitz
+foobillard                                   David Stacey
+fortune-mod                                  Yitzchak Scott-Thoennes
+fossil                                       Jari Aalto
+four-in-a-row                                Yaakov Selkowitz
+freeglut                                     Dr. Volker Zell
+freerdp                                      Yaakov Selkowitz
+freetds                                      Yaakov Selkowitz
+freetype2                                    Yaakov Selkowitz
+fribidi                                      Yaakov Selkowitz
+fslsfonts                                    Yaakov Selkowitz
+fstobdf                                      Yaakov Selkowitz
+fvwm                                         Yaakov Selkowitz
+gaffitter                                    ORPHANED (Kostya Altukhov)
+gamin                                        Yaakov Selkowitz
+garcon                                       Yaakov Selkowitz
+gawk                                         Corinna Vinschen
+gcc                                          Jonathan Yong
+gcc-tools-epoch1-autoconf                    ORPHANED (Charles Wilson)
+gcc-tools-epoch1-automake                    ORPHANED (Charles Wilson)
+gcc-tools-epoch2-autoconf                    ORPHANED (Charles Wilson)
+gcc-tools-epoch2-automake                    ORPHANED (Charles Wilson)
+gccmakedep                                   Yaakov Selkowitz
+GConf2                                       Yaakov Selkowitz
+gconfmm2.6                                   Yaakov Selkowitz
+gcr                                          Yaakov Selkowitz
+gd                                           Dr. Volker Zell
+gdb                                          Corinna Vinschen/Yaakov Selkowitz/Jon Turney
+gdbm                                         Yaakov Selkowitz
+gdk-pixbuf2.0                                Yaakov Selkowitz
+gdl3                                         Yaakov Selkowitz
+gedit                                        Yaakov Selkowitz
+gedit-code-assistance                        Yaakov Selkowitz
+gedit-plugins                                Yaakov Selkowitz
+gendef                                       Jonathan Yong
+geoclue                                      Yaakov Selkowitz
+geocode-glib                                 Yaakov Selkowitz
+GeoIP                                        Yaakov Selkowitz
+GeoIP-database                               Yaakov Selkowitz
+getent                                       Corinna Vinschen
+getmail                                      Jari Aalto
+gettext                                      Yaakov Selkowitz
+ghostscript                                  Dr. Volker Zell
+ghostscript-fonts-other                      Dr. Volker Zell
+ghostscript-fonts-std                        Dr. Volker Zell
+gif2apng                                     Jari Aalto
+giflib                                       Yaakov Selkowitz
+gigolo                                       Yaakov Selkowitz
+girara                                       Yaakov Selkowitz
+git                                          Adam Dinwoodie
+git-oodiff                                   Jari Aalto
+git-review                                   David Rothenberger
+gl2ps                                        Marco Atzeri
+glade                                        Yaakov Selkowitz
+glade2                                       Yaakov Selkowitz
+glade3                                       Yaakov Selkowitz
+gle                                          Yaakov Selkowitz
+glew                                         Yaakov Selkowitz
+glib1.2                                      Yaakov Selkowitz
+glib2.0                                      Yaakov Selkowitz
+glib2.0-networking                           Yaakov Selkowitz
+glibmm2.4                                    Yaakov Selkowitz
+glpk                                         Marco Atzeri
+glproto                                      Yaakov Selkowitz
+glu                                          Yaakov Selkowitz
+glw                                          Yaakov Selkowitz
+gmime2.6                                     Yaakov Selkowitz
+gmp                                          Achim Gratz
+gnome-activity-journal                       Yaakov Selkowitz
+gnome-applets                                Yaakov Selkowitz
+gnome-backgrounds                            Yaakov Selkowitz
+gnome-calculator                             Yaakov Selkowitz
+gnome-chess                                  Yaakov Selkowitz
+gnome-clocks                                 Yaakov Selkowitz
+gnome-code-assistance                        Yaakov Selkowitz
+gnome-common                                 Yaakov Selkowitz
+gnome-contacts                               Yaakov Selkowitz
+gnome-control-center                         Yaakov Selkowitz
+gnome-desktop                                Yaakov Selkowitz
+gnome-devel-docs                             Yaakov Selkowitz
+gnome-dictionary                             Yaakov Selkowitz
+gnome-doc-utils                              Yaakov Selkowitz
+gnome-flashback                              Yaakov Selkowitz
+gnome-font-viewer                            Yaakov Selkowitz
+gnome-getting-started-docs                   Yaakov Selkowitz
+gnome-icon-theme                             Yaakov Selkowitz
+gnome-keyring                                Yaakov Selkowitz
+gnome-klotski                                Yaakov Selkowitz
+gnome-mahjongg                               Yaakov Selkowitz
+gnome-menus                                  Yaakov Selkowitz
+gnome-mime-data                              Yaakov Selkowitz
+gnome-mines                                  Yaakov Selkowitz
+gnome-nibbles                                Yaakov Selkowitz
+gnome-online-accounts                        Yaakov Selkowitz
+gnome-panel                                  Yaakov Selkowitz
+gnome-python                                 Yaakov Selkowitz
+gnome-python-desktop                         Yaakov Selkowitz
+gnome-python-extras                          Yaakov Selkowitz
+gnome-robots                                 Yaakov Selkowitz
+gnome-screenshot                             Yaakov Selkowitz
+gnome-session                                Yaakov Selkowitz
+gnome-settings-daemon                        Yaakov Selkowitz
+gnome-sudoku                                 Yaakov Selkowitz
+gnome-system-log                             Yaakov Selkowitz
+gnome-system-monitor                         Yaakov Selkowitz
+gnome-terminal                               Yaakov Selkowitz
+gnome-tetravex                               Yaakov Selkowitz
+gnome-themes-standard                        Yaakov Selkowitz
+gnome-tweak-tool                             Yaakov Selkowitz
+gnome-user-docs                              Yaakov Selkowitz
+gnome-vfs2                                   Yaakov Selkowitz
+gnome-vfsmm2.6                               Yaakov Selkowitz
+gnu-free-fonts                               Yaakov Selkowitz
+gnubg                                        Dr. Volker Zell
+gnucap                                       Achim Gratz
+gnuchess                                     Yaakov Selkowitz
+gnugo                                        ORPHANED
+gnupg                                        Marco Atzeri
+gnuplot                                      Dr. Volker Zell
+gnutls                                       Dr. Volker Zell
+gob2                                         Yaakov Selkowitz
+gobject-introspection                        Yaakov Selkowitz
+goffice0.10                                  Yaakov Selkowitz
+goffice0.8                                   Yaakov Selkowitz
+gom                                          Yaakov Selkowitz
+goocanvas                                    Yaakov Selkowitz
+goocanvas2.0                                 Yaakov Selkowitz
+goocanvasmm2.0                               Yaakov Selkowitz
+google-breakpad                              Jon Turney
+googlecl                                     ORPHANED (Chris Sutcliffe)
+gottet                                       Yaakov Selkowitz
+gperf                                        Eric Blake
+gpgme                                        Yaakov Selkowitz
+gpicview                                     Yaakov Selkowitz
+gq                                           Dr. Volker Zell
+grace                                        Yaakov Selkowitz
+granatier                                    Yaakov Selkowitz
+GraphicsMagick                               Marco Atzeri
+graphite2                                    Yaakov Selkowitz
+graphviz                                     Yaakov Selkowitz
+greed                                        Jari Aalto
+grep                                         Eric Blake
+grepmail                                     Jari Aalto
+grilo0.2                                     Yaakov Selkowitz
+grilo0.2-plugins                             Yaakov Selkowitz
+groff                                        Achim Gratz
+gsettings-desktop-schemas                    Yaakov Selkowitz
+gsl                                          ORPHANED (Teun Burgers)
+gsm                                          Yaakov Selkowitz
+gstreamer0.10                                Yaakov Selkowitz
+gstreamer0.10-plugins-base                   Yaakov Selkowitz
+gstreamer0.10-plugins-good                   Yaakov Selkowitz
+gstreamer1.0                                 Yaakov Selkowitz
+gstreamer1.0-plugins-base                    Yaakov Selkowitz
+gstreamer1.0-plugins-good                    Yaakov Selkowitz
+gt                                           Yaakov Selkowitz
+gt5                                          Jari Aalto
+gtk-doc                                      Yaakov Selkowitz
+gtk-vnc                                      Yaakov Selkowitz
+gtk1.2                                       Yaakov Selkowitz
+gtk1.2-engines                               Yaakov Selkowitz
+gtk2.0                                       Yaakov Selkowitz
+gtk2.0-engines                               Yaakov Selkowitz
+gtk2.0-engines-murrine                       Yaakov Selkowitz
+gtk2.0-engines-smooth                        Yaakov Selkowitz
+gtk3                                         Yaakov Selkowitz
+gtk3-engines-unico                           Yaakov Selkowitz
+gtkglarea2.0                                 Yaakov Selkowitz
+gtkglext1.0                                  Yaakov Selkowitz
+gtkhtml4.0                                   Yaakov Selkowitz
+gtkmm2.4                                     Yaakov Selkowitz
+gtkmm3.0                                     Yaakov Selkowitz
+gtkperf                                      Mike DePaulo
+gtksourceview2.0                             Yaakov Selkowitz
+gtksourceview3.0                             Yaakov Selkowitz
+gtksourceviewmm2.0                           Yaakov Selkowitz
+gtksourceviewmm3.0                           Yaakov Selkowitz
+gtkspell                                     Yaakov Selkowitz
+gtkspell3                                    Yaakov Selkowitz
+gts                                          Yaakov Selkowitz
+gtypist                                      Yaakov Selkowitz
+gucharmap                                    Yaakov Selkowitz
+guile                                        Marco Atzeri
+guilt                                        Jari Aalto
+gv                                           Dr. Volker Zell
+gvfs                                         Yaakov Selkowitz
+gzip                                         Eric Blake
+harfbuzz                                     Yaakov Selkowitz
+hdf5                                         Marco Atzeri
+hdparm                                       ORPHANED (Christian Franke)
+help2man                                     Yaakov Selkowitz
+hexalate                                     Yaakov Selkowitz
+hexchat                                      Yaakov Selkowitz
+hexedit                                      ORPHANED
+hicolor-icon-theme                           Yaakov Selkowitz
+hidapi                                       Wei-Ren Chen
+highlight                                    Yaakov Selkowitz
+hitori                                       Yaakov Selkowitz
+hostname                                     Christian Franke
+hp2xx                                        Dr. Volker Zell
+html2ps                                      Yaakov Selkowitz
+httpd                                        Yaakov Selkowitz
+httperf                                      Dr. Volker Zell
+httping                                      Jari Aalto
+httptunnel                                   Jari Aalto
+hunspell                                     Yaakov Selkowitz
+hwloc                                        Marco Atzeri
+iagno                                        Yaakov Selkowitz
+ibus                                         Yaakov Selkowitz
+ibus-anthy                                   Yaakov Selkowitz
+ibus-chewing                                 Yaakov Selkowitz
+ibus-gucharmap                               Yaakov Selkowitz
+ibus-handwrite                               Yaakov Selkowitz
+ibus-hangul                                  Yaakov Selkowitz
+ibus-input-pad                               Yaakov Selkowitz
+ibus-kkc                                     Yaakov Selkowitz
+ibus-m17n                                    Yaakov Selkowitz
+ibus-pinyin                                  Yaakov Selkowitz
+ibus-qt                                      Yaakov Selkowitz
+ibus-skk                                     Yaakov Selkowitz
+ibus-unikey                                  Yaakov Selkowitz
+ibus-xkb                                     Yaakov Selkowitz
+iceauth                                      Yaakov Selkowitz
+ico                                          Yaakov Selkowitz
+icon-naming-utils                            Yaakov Selkowitz
+icoutils                                     David Stacey
+icu                                          Ken Brown
+ifile                                        Jari Aalto
+ii                                           Jari Aalto
+ilmbase                                      Yaakov Selkowitz
+im-chooser                                   Yaakov Selkowitz
+ImageMagick                                  Marco Atzeri
+imake                                        Yaakov Selkowitz
+imlib                                        Yaakov Selkowitz
+imlib2                                       Yaakov Selkowitz
+imsettings                                   Yaakov Selkowitz
+inconsolata-fonts                            Yaakov Selkowitz
+indent                                       Jari Aalto
+inetutils                                    ORPHANED (Charles Wilson)
+initscripts                                  Dr. Volker Zell
+input-pad                                    Yaakov Selkowitz
+inputproto                                   Yaakov Selkowitz
+integrit                                     Jari Aalto
+intltool                                     Yaakov Selkowitz
+ioperm                                       ORPHANED (Marcel Telka)
+ipc-utils                                    Corinna Vinschen
+ipcalc                                       Jari Aalto
+iperf                                        Joel Johnson
+iprint                                       Jari Aalto
+irssi                                        Marco Atzeri
+iselect                                      Jari Aalto
+isl                                          Achim Gratz
+iso-codes                                    Yaakov Selkowitz
+isomaster                                    Christian Franke
+itstool                                      Yaakov Selkowitz
+jasper                                       Dr. Volker Zell
+jbigkit                                      Yaakov Selkowitz
+jgraph                                       Dr. Volker Zell
+jlint                                        Jari Aalto
+joe                                          Jari Aalto
+js185                                        Yaakov Selkowitz
+json-c                                       Yaakov Selkowitz
+json-glib1.0                                 Yaakov Selkowitz
+kactivities                                  Yaakov Selkowitz
+kajongg                                      Yaakov Selkowitz
+kalgebra                                     Yaakov Selkowitz
+kalzium                                      Yaakov Selkowitz
+kanagram                                     Yaakov Selkowitz
+kanjistrokeorders-fonts                      Yaakov Selkowitz
+kapman                                       Yaakov Selkowitz
+kapow                                        Yaakov Selkowitz
+kasumi                                       Yaakov Selkowitz
+kate                                         Yaakov Selkowitz
+kate4                                        Yaakov Selkowitz
+katomic                                      Yaakov Selkowitz
+kblackbox                                    Yaakov Selkowitz
+kblocks                                      Yaakov Selkowitz
+kbounce                                      Yaakov Selkowitz
+kbproto                                      Yaakov Selkowitz
+kbrickbuster                                 Yaakov Selkowitz
+kbruch                                       Yaakov Selkowitz
+kcalc                                        Yaakov Selkowitz
+kcharselect                                  Yaakov Selkowitz
+kde-base-artwork                             Yaakov Selkowitz
+kde-baseapps                                 Yaakov Selkowitz
+kde-l10n-ar                                  Yaakov Selkowitz
+kde-l10n-bg                                  Yaakov Selkowitz
+kde-l10n-bs                                  Yaakov Selkowitz
+kde-l10n-ca                                  Yaakov Selkowitz
+kde-l10n-ca-valencia                         Yaakov Selkowitz
+kde-l10n-cs                                  Yaakov Selkowitz
+kde-l10n-da                                  Yaakov Selkowitz
+kde-l10n-de                                  Yaakov Selkowitz
+kde-l10n-el                                  Yaakov Selkowitz
+kde-l10n-en_GB                               Yaakov Selkowitz
+kde-l10n-es                                  Yaakov Selkowitz
+kde-l10n-et                                  Yaakov Selkowitz
+kde-l10n-eu                                  Yaakov Selkowitz
+kde-l10n-fa                                  Yaakov Selkowitz
+kde-l10n-fi                                  Yaakov Selkowitz
+kde-l10n-fr                                  Yaakov Selkowitz
+kde-l10n-ga                                  Yaakov Selkowitz
+kde-l10n-gl                                  Yaakov Selkowitz
+kde-l10n-he                                  Yaakov Selkowitz
+kde-l10n-hi                                  Yaakov Selkowitz
+kde-l10n-hr                                  Yaakov Selkowitz
+kde-l10n-hu                                  Yaakov Selkowitz
+kde-l10n-ia                                  Yaakov Selkowitz
+kde-l10n-id                                  Yaakov Selkowitz
+kde-l10n-is                                  Yaakov Selkowitz
+kde-l10n-it                                  Yaakov Selkowitz
+kde-l10n-ja                                  Yaakov Selkowitz
+kde-l10n-kk                                  Yaakov Selkowitz
+kde-l10n-km                                  Yaakov Selkowitz
+kde-l10n-kn                                  Yaakov Selkowitz
+kde-l10n-ko                                  Yaakov Selkowitz
+kde-l10n-lt                                  Yaakov Selkowitz
+kde-l10n-lv                                  Yaakov Selkowitz
+kde-l10n-mr                                  Yaakov Selkowitz
+kde-l10n-nb                                  Yaakov Selkowitz
+kde-l10n-nds                                 Yaakov Selkowitz
+kde-l10n-nl                                  Yaakov Selkowitz
+kde-l10n-nn                                  Yaakov Selkowitz
+kde-l10n-pa                                  Yaakov Selkowitz
+kde-l10n-pl                                  Yaakov Selkowitz
+kde-l10n-pt                                  Yaakov Selkowitz
+kde-l10n-pt_BR                               Yaakov Selkowitz
+kde-l10n-ro                                  Yaakov Selkowitz
+kde-l10n-ru                                  Yaakov Selkowitz
+kde-l10n-si                                  Yaakov Selkowitz
+kde-l10n-sk                                  Yaakov Selkowitz
+kde-l10n-sl                                  Yaakov Selkowitz
+kde-l10n-sr                                  Yaakov Selkowitz
+kde-l10n-sv                                  Yaakov Selkowitz
+kde-l10n-tg                                  Yaakov Selkowitz
+kde-l10n-th                                  Yaakov Selkowitz
+kde-l10n-tr                                  Yaakov Selkowitz
+kde-l10n-ug                                  Yaakov Selkowitz
+kde-l10n-uk                                  Yaakov Selkowitz
+kde-l10n-vi                                  Yaakov Selkowitz
+kde-l10n-wa                                  Yaakov Selkowitz
+kde-l10n-zh_CN                               Yaakov Selkowitz
+kde-l10n-zh_TW                               Yaakov Selkowitz
+kde-runtime                                  Yaakov Selkowitz
+kde-wallpapers                               Yaakov Selkowitz
+kde-workspace                                Yaakov Selkowitz
+kdeedu-data                                  Yaakov Selkowitz
+kdegraphics-mobipocket                       Yaakov Selkowitz
+kdelibs                                      Yaakov Selkowitz
+kdepimlibs                                   Yaakov Selkowitz
+kdewebdev                                    Yaakov Selkowitz
+kdf                                          Yaakov Selkowitz
+kdiamond                                     Yaakov Selkowitz
+keepassx                                     David Stacey
+keychain                                     Jari Aalto
+kf5-attica                                   Yaakov Selkowitz
+kf5-frameworkintegration                     Yaakov Selkowitz
+kf5-kactivities                              Yaakov Selkowitz
+kf5-kapidox                                  Yaakov Selkowitz
+kf5-karchive                                 Yaakov Selkowitz
+kf5-kauth                                    Yaakov Selkowitz
+kf5-kbookmarks                               Yaakov Selkowitz
+kf5-kcmutils                                 Yaakov Selkowitz
+kf5-kcodecs                                  Yaakov Selkowitz
+kf5-kcompletion                              Yaakov Selkowitz
+kf5-kconfig                                  Yaakov Selkowitz
+kf5-kconfigwidgets                           Yaakov Selkowitz
+kf5-kcoreaddons                              Yaakov Selkowitz
+kf5-kcrash                                   Yaakov Selkowitz
+kf5-kdbusaddons                              Yaakov Selkowitz
+kf5-kdeclarative                             Yaakov Selkowitz
+kf5-kded                                     Yaakov Selkowitz
+kf5-kdelibs4support                          Yaakov Selkowitz
+kf5-kdesignerplugin                          Yaakov Selkowitz
+kf5-kdewebkit                                Yaakov Selkowitz
+kf5-kdnssd                                   Yaakov Selkowitz
+kf5-kdoctools                                Yaakov Selkowitz
+kf5-kemoticons                               Yaakov Selkowitz
+kf5-kglobalaccel                             Yaakov Selkowitz
+kf5-kguiaddons                               Yaakov Selkowitz
+kf5-khtml                                    Yaakov Selkowitz
+kf5-ki18n                                    Yaakov Selkowitz
+kf5-kiconthemes                              Yaakov Selkowitz
+kf5-kidletime                                Yaakov Selkowitz
+kf5-kimageformats                            Yaakov Selkowitz
+kf5-kinit                                    Yaakov Selkowitz
+kf5-kio                                      Yaakov Selkowitz
+kf5-kitemmodels                              Yaakov Selkowitz
+kf5-kitemviews                               Yaakov Selkowitz
+kf5-kjobwidgets                              Yaakov Selkowitz
+kf5-kjs                                      Yaakov Selkowitz
+kf5-kjsembed                                 Yaakov Selkowitz
+kf5-kmediaplayer                             Yaakov Selkowitz
+kf5-knewstuff                                Yaakov Selkowitz
+kf5-knotifications                           Yaakov Selkowitz
+kf5-knotifyconfig                            Yaakov Selkowitz
+kf5-kpackage                                 Yaakov Selkowitz
+kf5-kparts                                   Yaakov Selkowitz
+kf5-kpeople                                  Yaakov Selkowitz
+kf5-kplotting                                Yaakov Selkowitz
+kf5-kpty                                     Yaakov Selkowitz
+kf5-kross                                    Yaakov Selkowitz
+kf5-kross-interpreters                       Yaakov Selkowitz
+kf5-krunner                                  Yaakov Selkowitz
+kf5-kservice                                 Yaakov Selkowitz
+kf5-ktexteditor                              Yaakov Selkowitz
+kf5-ktextwidgets                             Yaakov Selkowitz
+kf5-kunitconversion                          Yaakov Selkowitz
+kf5-kwallet                                  Yaakov Selkowitz
+kf5-kwidgetsaddons                           Yaakov Selkowitz
+kf5-kwindowsystem                            Yaakov Selkowitz
+kf5-kxmlgui                                  Yaakov Selkowitz
+kf5-kxmlrpcclient                            Yaakov Selkowitz
+kf5-libkdegames                              Yaakov Selkowitz
+kf5-libkmahjongg                             Yaakov Selkowitz
+kf5-plasma                                   Yaakov Selkowitz
+kf5-solid                                    Yaakov Selkowitz
+kf5-sonnet                                   Yaakov Selkowitz
+kf5-threadweaver                             Yaakov Selkowitz
+kfilemetadata                                Yaakov Selkowitz
+kfourinline                                  Yaakov Selkowitz
+kgb                                          Jari Aalto
+kgeography                                   Yaakov Selkowitz
+kget                                         Yaakov Selkowitz
+kgoldrunner                                  Yaakov Selkowitz
+kgpg                                         Yaakov Selkowitz
+khangman                                     Yaakov Selkowitz
+khronos-opengl-registry                      Jon Turney
+kig                                          Yaakov Selkowitz
+kigo                                         Yaakov Selkowitz
+killbots                                     Yaakov Selkowitz
+kiriki                                       Yaakov Selkowitz
+kiten                                        Yaakov Selkowitz
+kjumpingcube                                 Yaakov Selkowitz
+klavaro                                      Yaakov Selkowitz
+klettres                                     Yaakov Selkowitz
+klickety                                     Yaakov Selkowitz
+klines                                       Yaakov Selkowitz
+klu                                          Marco Atzeri
+kmahjongg                                    Yaakov Selkowitz
+kmines                                       Yaakov Selkowitz
+kmplot                                       Yaakov Selkowitz
+knavalbattle                                 Yaakov Selkowitz
+knetwalk                                     Yaakov Selkowitz
+kolf                                         Yaakov Selkowitz
+kollision                                    Yaakov Selkowitz
+konquest                                     Yaakov Selkowitz
+konsole                                      Yaakov Selkowitz
+konsole4                                     Yaakov Selkowitz
+konversation                                 Yaakov Selkowitz
+kpat                                         Yaakov Selkowitz
+krb5                                         Yaakov Selkowitz
+krb5-auth-dialog                             Yaakov Selkowitz
+krdc                                         Yaakov Selkowitz
+kreversi                                     Yaakov Selkowitz
+krfb                                         Yaakov Selkowitz
+kshisen                                      Yaakov Selkowitz
+ksirk                                        Yaakov Selkowitz
+ksnakeduel                                   Yaakov Selkowitz
+kspaceduel                                   Yaakov Selkowitz
+ksquares                                     Yaakov Selkowitz
+kstars                                       Yaakov Selkowitz
+ksudoku                                      Yaakov Selkowitz
+ksystemlog                                   Yaakov Selkowitz
+kteatime                                     Yaakov Selkowitz
+ktimer                                       Yaakov Selkowitz
+ktorrent                                     Yaakov Selkowitz
+ktouch                                       Yaakov Selkowitz
+ktuberling                                   Yaakov Selkowitz
+kturtle                                      Yaakov Selkowitz
+kubrick                                      Yaakov Selkowitz
+kwalletmanager                               Yaakov Selkowitz
+kwebkitpart                                  Yaakov Selkowitz
+kwordquiz                                    Yaakov Selkowitz
+lapack                                       Marco Atzeri
+lasem0.4                                     Yaakov Selkowitz
+lcab                                         Jari Aalto
+lcms                                         Dr. Volker Zell
+lcms2                                        Dr. Volker Zell
+ldl                                          Marco Atzeri
+leafpad                                      Yaakov Selkowitz
+leptonica                                    Marco Atzeri
+less                                         Marco Atzeri
+lftp                                         Andrew Schulman
+libao                                        David Rothenberger
+libapr1                                      David Rothenberger
+libaprutil1                                  David Rothenberger
+libarchive                                   Yaakov Selkowitz
+libargp                                      Andrew Schulman
+libart_lgpl_2                                Yaakov Selkowitz
+libassuan                                    ORPHANED (Charles Wilson)
+libasyncns                                   Yaakov Selkowitz
+libbonobo2                                   Yaakov Selkowitz
+libbonoboui2                                 Yaakov Selkowitz
+libcaca                                      Yaakov Selkowitz
+libcanberra                                  Yaakov Selkowitz
+libchamplain0.12                             Yaakov Selkowitz
+libchewing                                   Yaakov Selkowitz
+libcroco0.6                                  Yaakov Selkowitz
+libdaemon                                    Yaakov Selkowitz
+libdatrie                                    Yaakov Selkowitz
+libdbusmenu-qt                               Yaakov Selkowitz
+libdbusmenu-qt5                              Yaakov Selkowitz
+libdiscid                                    Dr. Volker Zell
+libdmapsharing3.0                            Yaakov Selkowitz
+libdmtx                                      Yaakov Selkowitz
+libdmx                                       Yaakov Selkowitz
+libdv                                        Yaakov Selkowitz
+libebml                                      David Stacey
+libedit                                      Corinna Vinschen
+libelf                                       Yaakov Selkowitz
+libEMF                                       Dr. Volker Zell
+libepoxy                                     Yaakov Selkowitz
+liberation-fonts                             Yaakov Selkowitz
+libesmtp                                     Yaakov Selkowitz
+libevent                                     Yaakov Selkowitz
+libexif                                      Yaakov Selkowitz
+libfakesu                                    Daniel Boland
+libffi                                       Yaakov Selkowitz
+libfm                                        Yaakov Selkowitz
+libfontenc                                   Yaakov Selkowitz
+libfpx                                       Dr. Volker Zell
+libFS                                        Yaakov Selkowitz
+libgc                                        Bob Heckel
+libgcrypt                                    Yaakov Selkowitz
+libgda5.0                                    Yaakov Selkowitz
+libgdamm5.0                                  Yaakov Selkowitz
+libgdata                                     Yaakov Selkowitz
+libgee                                       Yaakov Selkowitz
+libgee0.8                                    Yaakov Selkowitz
+libgeotiff                                   Marco Atzeri
+libggi2                                      Peter Rosin
+libggimisc2                                  Peter Rosin
+libggiwmh0                                   Peter Rosin
+libgii1                                      Peter Rosin
+libgit2                                      Yaakov Selkowitz
+libgit2-glib1.0                              Yaakov Selkowitz
+libglade2.0                                  Yaakov Selkowitz
+libglademm2.4                                Yaakov Selkowitz
+libgnome-keyring                             Yaakov Selkowitz
+libgnome2                                    Yaakov Selkowitz
+libgnomecanvas2                              Yaakov Selkowitz
+libgnomecanvasmm2.6                          Yaakov Selkowitz
+libgnomekbd                                  Yaakov Selkowitz
+libgnomemm2.6                                Yaakov Selkowitz
+libgnomeui2                                  Yaakov Selkowitz
+libgnomeuimm2.6                              Yaakov Selkowitz
+libgpg-error                                 Yaakov Selkowitz
+libgsf                                       Yaakov Selkowitz
+libgtop2.0                                   Yaakov Selkowitz
+libgucharmap                                 Yaakov Selkowitz
+libgweather                                  Yaakov Selkowitz
+libgxps                                      Yaakov Selkowitz
+libhangul                                    Yaakov Selkowitz
+libical                                      Yaakov Selkowitz
+libICE                                       Yaakov Selkowitz
+libiconv                                     Yaakov Selkowitz
+libid3tag                                    Yaakov Selkowitz
+libIDL2                                      Yaakov Selkowitz
+libidn                                       Dr. Volker Zell
+libiodbc                                     Yaakov Selkowitz
+libjpeg-turbo                                Yaakov Selkowitz
+libkate                                      David Rothenberger
+libkdeedu                                    Yaakov Selkowitz
+libkdegames                                  Yaakov Selkowitz
+libkeduvocdocument                           Yaakov Selkowitz
+libkkc                                       Yaakov Selkowitz
+libkkc-data                                  Yaakov Selkowitz
+libkmahjongg                                 Yaakov Selkowitz
+libksba                                      ORPHANED (Charles Wilson)
+libktorrent                                  Yaakov Selkowitz
+libLASi                                      Yaakov Selkowitz
+liblqr1                                      Yaakov Selkowitz
+liblzo2                                      Dr. Volker Zell
+libmangle                                    Jonathan Yong
+libmatekbd                                   Yaakov Selkowitz
+libmateweather                               Yaakov Selkowitz
+libmatroska                                  David Stacey
+libmcrypt                                    Dr. Volker Zell
+libmediaart1.0                               Yaakov Selkowitz
+libmetalink                                  Yaakov Selkowitz
+libmikmod                                    Yaakov Selkowitz
+libmng                                       Dr. Volker Zell
+libmodplug                                   Yaakov Selkowitz
+libmspack                                    Yaakov Selkowitz
+libnfc                                       Marcos Vives Del Sol
+libnice                                      Yaakov Selkowitz
+libnotify                                    Yaakov Selkowitz
+liboauth                                     Yaakov Selkowitz
+libogg                                       David Rothenberger
+libotf                                       Yaakov Selkowitz
+libpaper                                     Yaakov Selkowitz
+libpeas                                      Yaakov Selkowitz
+libpipeline                                  Erwin Waterlander
+libpng                                       Yaakov Selkowitz
+libpng10                                     Yaakov Selkowitz
+libpng12                                     Yaakov Selkowitz
+libpng14                                     Yaakov Selkowitz
+libpng15                                     Yaakov Selkowitz
+libproxy                                     Yaakov Selkowitz
+libpst                                       Yaakov Selkowitz
+libqalculate                                 Yaakov Selkowitz
+libquvi0.9                                   Yaakov Selkowitz
+libquvi0.9-scripts                           Yaakov Selkowitz
+libqzeitgeist                                Yaakov Selkowitz
+librest0.7                                   Yaakov Selkowitz
+librsvg2                                     Yaakov Selkowitz
+librsync                                     David Rothenberger
+libsamplerate                                Yaakov Selkowitz
+libsecret1                                   Yaakov Selkowitz
+libshout                                     Yaakov Selkowitz
+libsigc2.0                                   Yaakov Selkowitz
+libsigsegv                                   Eric Blake
+libskk                                       Yaakov Selkowitz
+libSM                                        Yaakov Selkowitz
+libsmi                                       Dr. Volker Zell
+libsndfile                                   Yaakov Selkowitz
+libsoup2.4                                   Yaakov Selkowitz
+libspectre                                   Yaakov Selkowitz
+libspiro                                     Yaakov Selkowitz
+libssh                                       Yaakov Selkowitz
+libssh2                                      Yaakov Selkowitz
+libtasn1                                     Dr. Volker Zell
+libtextcat                                   ORPHANED (Reini Urban)
+libthai                                      Yaakov Selkowitz
+libtheora                                    David Rothenberger
+libtimidity                                  Yaakov Selkowitz
+libtirpc                                     Yaakov Selkowitz
+libtool                                      Yaakov Selkowitz
+libtorrent                                   Marco Atzeri
+libungif                                     Yaakov Selkowitz
+libuninameslist                              Yaakov Selkowitz
+libunique1.0                                 Yaakov Selkowitz
+libunique3.0                                 Yaakov Selkowitz
+libunistring                                 Erwin Waterlander
+libusb-win32                                 Yaakov Selkowitz
+libusb1.0                                    Yaakov Selkowitz
+libustr                                      ORPHANED (Charles Wilson)
+libverto                                     Yaakov Selkowitz
+libvncserver                                 Yaakov Selkowitz
+libvoikko                                    Yaakov Selkowitz
+libvorbis                                    David Rothenberger
+libvpx                                       Yaakov Selkowitz
+libwebp                                      Yaakov Selkowitz
+libWindowsWM                                 Yaakov Selkowitz
+libwmf                                       Dr. Volker Zell
+libwnck                                      Yaakov Selkowitz
+libwnck3                                     Yaakov Selkowitz
+libX11                                       Yaakov Selkowitz
+libXau                                       Yaakov Selkowitz
+libXaw                                       Yaakov Selkowitz
+libXaw3d                                     Yaakov Selkowitz
+libxcb                                       Yaakov Selkowitz
+libXcomposite                                Yaakov Selkowitz
+libXcursor                                   Yaakov Selkowitz
+libxcwm                                      Jon Turney
+libXdamage                                   Yaakov Selkowitz
+libXdmcp                                     Yaakov Selkowitz
+libXext                                      Yaakov Selkowitz
+libxfce4ui                                   Yaakov Selkowitz
+libxfce4util                                 Yaakov Selkowitz
+libxfcegui4                                  Yaakov Selkowitz
+libXfixes                                    Yaakov Selkowitz
+libXfont                                     Yaakov Selkowitz
+libXft                                       Yaakov Selkowitz
+libXi                                        Yaakov Selkowitz
+libXinerama                                  Yaakov Selkowitz
+libxkbcommon                                 Yaakov Selkowitz
+libxkbfile                                   Yaakov Selkowitz
+libxklavier                                  Yaakov Selkowitz
+libxml++2.6                                  Yaakov Selkowitz
+libxml2                                      Yaakov Selkowitz
+libXmu                                       Yaakov Selkowitz
+libXpm                                       Yaakov Selkowitz
+libXpm-noX                                   ORPHANED (Charles Wilson)
+libXrandr                                    Yaakov Selkowitz
+libXrender                                   Yaakov Selkowitz
+libXres                                      Yaakov Selkowitz
+libXScrnSaver                                Yaakov Selkowitz
+libxslt                                      Yaakov Selkowitz
+libXt                                        Yaakov Selkowitz
+libXtst                                      Yaakov Selkowitz
+libytnef                                     Yaakov Selkowitz
+libzeitgiest1.0                              Yaakov Selkowitz
+libzip                                       Yaakov Selkowitz
+licensecheck                                 Jari Aalto
+lightsoff                                    Yaakov Selkowitz
+lighttpd                                     Yaakov Selkowitz
+lilypond                                     Marco Atzeri
+linklint                                     Jari Aalto
+links                                        Jari Aalto
+linux-libertine-fonts                        Yaakov Selkowitz
+listres                                      Yaakov Selkowitz
+llvm                                         Yaakov Selkowitz
+lndir                                        Yaakov Selkowitz
+login                                        Corinna Vinschen/Yaakov Selkowitz
+logiweb                                      Klaus Grue
+lrzip                                        Yaakov Selkowitz
+lskat                                        Yaakov Selkowitz
+lua                                          Yaakov Selkowitz
+lua-bit                                      Yaakov Selkowitz
+lua-crypto                                   Yaakov Selkowitz
+lua-json                                     Yaakov Selkowitz
+lua-lfs                                      Yaakov Selkowitz
+lua-logging                                  Yaakov Selkowitz
+lua-lpeg                                     Yaakov Selkowitz
+lua-luadoc                                   Yaakov Selkowitz
+lua-lxp                                      Yaakov Selkowitz
+lua-socket                                   Yaakov Selkowitz
+lua5.1                                       Yaakov Selkowitz
+luit                                         Yaakov Selkowitz
+lv                                           Jari Aalto
+lxappearance                                 Yaakov Selkowitz
+lxappearance-obconf                          Yaakov Selkowitz
+lxde-common                                  Yaakov Selkowitz
+lxde-icon-theme                              Yaakov Selkowitz
+lxinput                                      Yaakov Selkowitz
+lxmenu-data                                  Yaakov Selkowitz
+lxpanel                                      Yaakov Selkowitz
+lxsession                                    Yaakov Selkowitz
+lxtask                                       Yaakov Selkowitz
+lxterminal                                   Yaakov Selkowitz
+lynx                                         Corinna Vinschen
+lyx                                          Marco Atzeri
+lzip                                         Jonathan Yong
+lziprecover                                  Jonathan Yong
+lzo2                                         Dr. Volker Zell
+lzop                                         Jari Aalto
+m17n-contrib                                 Yaakov Selkowitz
+m17n-db                                      Yaakov Selkowitz
+m17n-lib                                     Yaakov Selkowitz
+m4                                           Eric Blake
+mairix                                       Jari Aalto
+make                                         Marco Atzeri
+makedepend                                   Yaakov Selkowitz
+makepasswd                                   Jari Aalto
+makeself                                     Jari Aalto
+malaga                                       Yaakov Selkowitz
+man-db                                       Chris J. Breisch/Yaakov Selkowitz
+maradns                                      ORPHANED (Steven Monai)
+marble                                       Yaakov Selkowitz
+marco                                        Yaakov Selkowitz
+marisa                                       Yaakov Selkowitz
+mate-applets                                 Yaakov Selkowitz
+mate-backgrounds                             Yaakov Selkowitz
+mate-calc                                    Yaakov Selkowitz
+mate-common                                  Yaakov Selkowitz
+mate-control-center                          Yaakov Selkowitz
+mate-desktop                                 Yaakov Selkowitz
+mate-dialogs                                 Yaakov Selkowitz
+mate-icon-theme                              Yaakov Selkowitz
+mate-media                                   Yaakov Selkowitz
+mate-menus                                   Yaakov Selkowitz
+mate-notification-daemon                     Yaakov Selkowitz
+mate-panel                                   Yaakov Selkowitz
+mate-session-manager                         Yaakov Selkowitz
+mate-settings-daemon                         Yaakov Selkowitz
+mate-system-monitor                          Yaakov Selkowitz
+mate-terminal                                Yaakov Selkowitz
+mate-themes                                  Yaakov Selkowitz
+mate-themes-extras                           Yaakov Selkowitz
+mate-utils                                   Yaakov Selkowitz
+mathomatic                                   ORPHANED (Reini Urban)
+maxima                                       Achim Gratz
+mboxcheck                                    Jari Aalto
+mc                                           Marco Atzeri
+mcpp                                         Yaakov Selkowitz
+mcrypt                                       Dr. Volker Zell
+md5deep                                      Achim Gratz
+mdbtools                                     Yaakov Selkowitz
+mDNSResponder                                Yaakov Selkowitz
+menu-cache                                   Yaakov Selkowitz
+mercurial                                    Jari Aalto
+mesa                                         Yaakov Selkowitz
+mesa-demos                                   Yaakov Selkowitz
+metacity                                     Yaakov Selkowitz
+metis                                        Marco Atzeri
+mhash                                        ORPHANED
+micro-httpd                                  Jari Aalto
+midori                                       Yaakov Selkowitz
+mined                                        Thomas Wolff
+ming                                         Dr. Volker Zell
+mingw-binutils                               ORPHANED (Charles Wilson)
+mingw-bzip2                                  ORPHANED (Charles Wilson)
+mingw-gcc                                    ORPHANED (Charles Wilson)
+mingw-libgcrypt                              ORPHANED (Charles Wilson)
+mingw-libgpg-error                           ORPHANED (Charles Wilson)
+mingw-pthreads                               ORPHANED (Charles Wilson)
+mingw-runtime                                ORPHANED (Chris Sutcliffe)
+mingw-w32api                                 ORPHANED (Chris Sutcliffe)
+mingw-xz                                     ORPHANED (Charles Wilson)
+mingw-zlib                                   ORPHANED (Charles Wilson)
+mingw64-i686-binutils                        Jonathan Yong
+mingw64-i686-bzip2                           Yaakov Selkowitz
+mingw64-i686-gcc                             Jonathan Yong
+mingw64-i686-google-breakpad                 Jon Turney
+mingw64-i686-headers                         Jonathan Yong
+mingw64-i686-hidapi                          Wei-Ren Chen
+mingw64-i686-libgcrypt                       Yaakov Selkowitz
+mingw64-i686-libgpg-error                    Yaakov Selkowitz
+mingw64-i686-pkg-config                      Yaakov Selkowitz
+mingw64-i686-pthreads                        Jonathan Yong
+mingw64-i686-runtime                         Jonathan Yong
+mingw64-i686-windows-default-manifest        Jonathan Yong
+mingw64-i686-winpthreads                     Jonathan Yong
+mingw64-i686-xz                              Yaakov Selkowitz
+mingw64-i686-zlib                            Yaakov Selkowitz
+mingw64-x86_64-binutils                      Jonathan Yong
+mingw64-x86_64-bzip2                         Yaakov Selkowitz
+mingw64-x86_64-gcc                           Jonathan Yong
+mingw64-x86_64-google-breakpad               Jon Turney
+mingw64-x86_64-headers                       Jonathan Yong
+mingw64-x86_64-hidapi                        Wei-Ren Chen
+mingw64-x86_64-libgcrypt                     Yaakov Selkowitz
+mingw64-x86_64-libgpg-error                  Yaakov Selkowitz
+mingw64-x86_64-pkg-config                    Yaakov Selkowitz
+mingw64-x86_64-pthreads                      Jonathan Yong
+mingw64-x86_64-runtime                       Jonathan Yong
+mingw64-x86_64-windows-default-manifest      Jonathan Yong
+mingw64-x86_64-winpthreads                   Jonathan Yong
+mingw64-x86_64-xz                            Yaakov Selkowitz
+mingw64-x86_64-zlib                          Yaakov Selkowitz
+mintty                                       Thomas Wolff
+mkcomposecache                               Yaakov Selkowitz
+mkfontdir                                    Yaakov Selkowitz
+mkfontscale                                  Yaakov Selkowitz
+mksh                                         ORPHANED (Chris Sutcliffe)
+mkvtoolnix                                   David Stacey
+mm-common                                    Yaakov Selkowitz
+mmv                                          Jari Aalto
+monotone                                     Yaakov Selkowitz
+mosh                                         Achim Gratz
+most                                         Jari Aalto
+motif                                        Yaakov Selkowitz
+mousepad                                     Yaakov Selkowitz
+mousetweaks                                  Yaakov Selkowitz
+mozo                                         Yaakov Selkowitz
+mpclib                                       Achim Gratz
+mpfr                                         Achim Gratz
+mscgen                                       David Stacey
+msmtp                                        Jari Aalto
+mt                                           Corinna Vinschen
+mtd                                          ORPHANED (Sam Robb)
+multitail                                    Dr. Volker Zell
+mutt                                         Marco Atzeri
+mutter                                       Yaakov Selkowitz
+mysql                                        Yaakov Selkowitz
+naim                                         ORPHANED (Jonathan C. Allen)
+nano                                         Yaakov Selkowitz
+nas                                          Yaakov Selkowitz
+nasm                                         Dean Scarff
+nautilus                                     Yaakov Selkowitz
+nc                                           Corinna Vinschen
+nc6                                          Corinna Vinschen
+ncdu                                         Christian Franke
+ncftp                                        Jari Aalto
+ncompress                                    Yaakov Selkowitz
+ncurses                                      Yaakov Selkowitz
+nedit                                        Yaakov Selkowitz
+neon                                         Dr. Volker Zell
+net-snmp                                     David Rothenberger
+netcdf                                       Marco Atzeri
+netcdf-cxx4                                  Marco Atzeri
+netcdf-fortran                               Marco Atzeri
+netpbm                                       Yaakov Selkowitz
+nettle                                       Dr. Volker Zell
+newmail                                      Jari Aalto
+nfrotz                                       ORPHANED (Charles Wilson)
+nfs-server                                   ORPHANED (Sam Robb)
+ngspice                                      Marco Atzeri
+ninvaders                                    David Stacey
+nmh                                          David Levine
+nosleep                                      Andrew Schulman
+notification-daemon                          Yaakov Selkowitz
+novprog                                      Yaakov Selkowitz
+nrss                                         Jari Aalto
+nspr                                         Yaakov Selkowitz
+nss                                          Yaakov Selkowitz
+ntl                                          Yue Ren/Marco Atzeri
+nttcp                                        Jari Aalto
+obconf                                       Yaakov Selkowitz
+ocaml                                        Damien Doligez
+ocaml-facile                                 Yaakov Selkowitz
+oclock                                       Yaakov Selkowitz
+octave                                       Marco Atzeri
+octave-bim                                   Marco Atzeri
+octave-cgi                                   Marco Atzeri
+octave-communications                        Marco Atzeri
+octave-control                               Marco Atzeri
+octave-data-smoothing                        Marco Atzeri
+octave-database                              Marco Atzeri
+octave-dataframe                             Marco Atzeri
+octave-divand                                Marco Atzeri
+octave-doctest                               Marco Atzeri
+octave-econometrics                          Marco Atzeri
+octave-financial                             Marco Atzeri
+octave-fl-core                               Marco Atzeri
+octave-fpl                                   Marco Atzeri
+octave-fuzzy-logic-toolkit                   Marco Atzeri
+octave-ga                                    Marco Atzeri
+octave-general                               Marco Atzeri
+octave-generate_html                         Marco Atzeri
+octave-geometry                              Marco Atzeri
+octave-image                                 Marco Atzeri
+octave-instrument-control                    Marco Atzeri
+octave-integration                           Marco Atzeri
+octave-interval                              Marco Atzeri
+octave-io                                    Marco Atzeri
+octave-level-set                             Marco Atzeri
+octave-linear-algebra                        Marco Atzeri
+octave-lssa                                  Marco Atzeri
+octave-ltfat                                 Marco Atzeri
+octave-mapping                               Marco Atzeri
+octave-mechanics                             Marco Atzeri
+octave-miscellaneous                         Marco Atzeri
+octave-mpi                                   Marco Atzeri
+octave-msh                                   Marco Atzeri
+octave-mvn                                   Marco Atzeri
+octave-nan                                   Marco Atzeri
+octave-ncarray                               Marco Atzeri
+octave-netcdf                                Marco Atzeri
+octave-nurbs                                 Marco Atzeri
+octave-ocs                                   Marco Atzeri
+octave-octcdf                                Marco Atzeri
+octave-octclip                               Marco Atzeri
+octave-octproj                               Marco Atzeri
+octave-odepkg                                Marco Atzeri
+octave-optics                                Marco Atzeri
+octave-optim                                 Marco Atzeri
+octave-optiminterp                           Marco Atzeri
+octave-parallel                              Marco Atzeri
+octave-quaternion                            Marco Atzeri
+octave-queueing                              Marco Atzeri
+octave-secs1d                                Marco Atzeri
+octave-secs2d                                Marco Atzeri
+octave-secs3d                                Marco Atzeri
+octave-signal                                Marco Atzeri
+octave-sockets                               Marco Atzeri
+octave-specfun                               Marco Atzeri
+octave-splines                               Marco Atzeri
+octave-statistics                            Marco Atzeri
+octave-stk                                   Marco Atzeri
+octave-strings                               Marco Atzeri
+octave-struct                                Marco Atzeri
+octave-tisean                                Marco Atzeri
+octave-tsa                                   Marco Atzeri
+octave-vrml                                  Marco Atzeri
+odbc-mysql                                   Yaakov Selkowitz
+odbc-psql                                    Yaakov Selkowitz
+odbc-sqlite3                                 Yaakov Selkowitz
+odt2txt                                      Jari Aalto
+offlineimap                                  Jari Aalto
+ogmtools                                     Jari Aalto
+okteta                                       Yaakov Selkowitz
+okteta4                                      Yaakov Selkowitz
+onc-rpc-devel                                Pavel Fedin
+onig                                         Marco Atzeri
+oodiff                                       Jari Aalto
+openal                                       Yaakov Selkowitz
+openblas                                     Marco Atzeri
+openbox                                      Yaakov Selkowitz
+opencdk                                      Dr. Volker Zell
+openexr                                      Yaakov Selkowitz
+openjade                                     Yaakov Selkowitz
+openjpeg                                     Yaakov Selkowitz
+openldap                                     Dr. Volker Zell
+openmpi                                      Marco Atzeri
+OpenSP                                       Yaakov Selkowitz
+openssh                                      Corinna Vinschen
+openssl                                      Corinna Vinschen/Yaakov Selkowitz
+optipng                                      Jari Aalto
+opus                                         Yaakov Selkowitz
+opusfile                                     Yaakov Selkowitz
+orage                                        Yaakov Selkowitz
+ORBit2                                       Yaakov Selkowitz
+orc                                          Yaakov Selkowitz
+orpie                                        Andrew Schulman
+outguess                                     Jari Aalto
+overpass-fonts                               Yaakov Selkowitz
+oxygen-fonts                                 Yaakov Selkowitz
+oxygen-icons                                 Yaakov Selkowitz
+p11-kit                                      Yaakov Selkowitz
+p7zip                                        Tony Kelman
+pairs                                        Yaakov Selkowitz
+pakchois                                     Dr. Volker Zell
+pal                                          ORPHANED (Jari Aalto)
+palapeli                                     Yaakov Selkowitz
+pango1.0                                     Yaakov Selkowitz
+pangomm1.4                                   Yaakov Selkowitz
+pangox-compat                                Yaakov Selkowitz
+paprefs                                      Yaakov Selkowitz
+par                                          David Levine
+parley                                       Yaakov Selkowitz
+patch                                        Corinna Vinschen
+patcher                                      Jari Aalto
+patchutils                                   Eric Blake
+pavucontrol                                  Yaakov Selkowitz
+pax                                          Jari Aalto
+pbzip2                                       Marco Atzeri
+pcmanfm                                      Yaakov Selkowitz
+pcre                                         Yaakov Selkowitz
+pdf2djvu                                     Yaakov Selkowitz
+pdftk                                        David Rothenberger
+peg-e                                        Yaakov Selkowitz
+perl                                         Achim Gratz
+perl-Algorithm-Diff                          Achim Gratz
+perl-Alien-wxWidgets                         Yaakov Selkowitz
+perl-Archive-Zip                             Achim Gratz/Yaakov Selkowitz
+perl-Authen-SASL                             Yaakov Selkowitz
+perl-autovivification                        Achim Gratz/Ken Brown
+perl-B-Generate                              Achim Gratz
+perl-Business-ISBN                           Achim Gratz/Ken Brown
+perl-Business-ISBN-Data                      Achim Gratz/Ken Brown
+perl-Business-ISMN                           Achim Gratz/Ken Brown
+perl-Business-ISSN                           Achim Gratz/Ken Brown
+perl-Cairo                                   Yaakov Selkowitz
+perl-Cairo-GObject                           Yaakov Selkowitz
+perl-Capture-Tiny                            Achim Gratz/Ken Brown
+perl-Carp                                    Achim Gratz
+perl-CGI                                     Yaakov Selkowitz
+perl-Class-XSAccessor                        Achim Gratz
+perl-Clone                                   Achim Gratz/Yaakov Selkowitz
+perl-common-sense                            Achim Gratz
+perl-Compress-Bzip2                          Achim Gratz
+perl-Config-AutoConf                         Achim Gratz/Ken Brown
+perl-Config-Perl-V                           Achim Gratz
+perl-Config-Tiny                             Achim Gratz
+perl-CPAN-Changes                            Achim Gratz
+perl-CPAN-DistnameInfo                       Achim Gratz
+perl-CPAN-Meta                               Achim Gratz
+perl-CPAN-Meta-Check                         Achim Gratz
+perl-CPAN-Meta-Requirements                  Achim Gratz
+perl-CPAN-Meta-YAML                          Achim Gratz
+perl-CPAN-Reporter                           Achim Gratz
+perl-CPAN-Testers-Report                     Achim Gratz
+perl-Crypt-OpenSSL-Bignum                    Achim Gratz
+perl-Crypt-OpenSSL-DSA                       Achim Gratz
+perl-Crypt-OpenSSL-EC                        Achim Gratz
+perl-Crypt-OpenSSL-ECDSA                     Achim Gratz
+perl-Crypt-OpenSSL-Random                    Achim Gratz
+perl-Crypt-OpenSSL-RSA                       Achim Gratz
+perl-Data-Alias                              Achim Gratz
+perl-Data-Compare                            Achim Gratz/Ken Brown
+perl-Data-Diver                              Achim Gratz/Ken Brown
+perl-Data-Dump                               Achim Gratz/Ken Brown
+perl-Data-GUID                               Achim Gratz
+perl-Data-OptList                            Achim Gratz
+perl-Data-UUID                               Achim Gratz
+perl-Date-Simple                             Achim Gratz/Ken Brown
+perl-DBD-mysql                               Achim Gratz/Yaakov Selkowitz
+perl-DBD-SQLite                              Achim Gratz/Yaakov Selkowitz
+perl-DBI                                     Achim Gratz/Yaakov Selkowitz
+perl-Devel-Autoflush                         Achim Gratz
+perl-Devel-Symdump                           Achim Gratz
+perl-Digest-BubbleBabble                     Achim Gratz
+perl-Digest-GOST                             Achim Gratz
+perl-Digest-HMAC                             Achim Gratz/Yaakov Selkowitz
+perl-Digest-SHA1                             Achim Gratz/Yaakov Selkowitz
+perl-Encode-EUCJPASCII                       Achim Gratz/Ken Brown
+perl-Encode-HanExtra                         Achim Gratz/Ken Brown
+perl-Encode-ISO2022                          Achim Gratz
+perl-Encode-JIS0213                          Achim Gratz
+perl-Encode-JIS2K                            Achim Gratz/Ken Brown
+perl-Encode-Locale                           Achim Gratz/Yaakov Selkowitz
+perl-Error                                   Achim Gratz
+perl-Exporter-Tiny                           Achim Gratz
+perl-ExtUtils-CBuilder                       Achim Gratz
+perl-ExtUtils-Depends                        Achim Gratz/Yaakov Selkowitz
+perl-ExtUtils-F77                            Achim Gratz
+perl-ExtUtils-LibBuilder                     Achim Gratz/Ken Brown
+perl-ExtUtils-MakeMaker                      Achim Gratz
+perl-ExtUtils-PkgConfig                      Achim Gratz/Yaakov Selkowitz
+perl-File-Copy-Recursive                     Achim Gratz
+perl-File-Find-HomeDir                       Achim Gratz
+perl-File-Find-Object                        Achim Gratz
+perl-File-Find-Object-Rule                   Achim Gratz
+perl-File-Find-Rule                          Achim Gratz/Ken Brown
+perl-File-Listing                            Achim Gratz/Yaakov Selkowitz
+perl-File-pushd                              Achim Gratz
+perl-File-Slurp                              Achim Gratz/Ken Brown
+perl-File-Slurp-Tiny                         Achim Gratz
+perl-File-Slurp-Unicode                      Achim Gratz/Ken Brown
+perl-File-Which                              Achim Gratz
+perl-GD                                      Yaakov Selkowitz
+perl-Getopt-ArgvFile                         Achim Gratz/Yaakov Selkowitz
+perl-gettext                                 Achim Gratz/Yaakov Selkowitz
+perl-Glib                                    Yaakov Selkowitz
+perl-Glib-Object-Introspection               Yaakov Selkowitz
+perl-Gnome2                                  Yaakov Selkowitz
+perl-Gnome2-Canvas                           Yaakov Selkowitz
+perl-Gnome2-GConf                            Yaakov Selkowitz
+perl-Gnome2-Rsvg                             Yaakov Selkowitz
+perl-Gnome2-VFS                              Yaakov Selkowitz
+perl-Gnome2-Vte                              Yaakov Selkowitz
+perl-Gnome2-Wnck                             Yaakov Selkowitz
+perl-GStreamer                               Yaakov Selkowitz
+perl-GStreamer-Interfaces                    Yaakov Selkowitz
+perl-Gtk2                                    Yaakov Selkowitz
+perl-Gtk2-GladeXML                           Yaakov Selkowitz
+perl-Gtk2-Notify                             Yaakov Selkowitz
+perl-Gtk2-SourceView2                        Yaakov Selkowitz
+perl-Gtk2-Spell                              Yaakov Selkowitz
+perl-Gtk2-Unique                             Yaakov Selkowitz
+perl-Gtk2-WebKit                             Yaakov Selkowitz
+perl-Gtk3                                    Yaakov Selkowitz
+perl-HTML-Parser                             Achim Gratz/Yaakov Selkowitz
+perl-HTML-Tagset                             Achim Gratz/Yaakov Selkowitz
+perl-HTTP-Cookies                            Achim Gratz/Yaakov Selkowitz
+perl-HTTP-Daemon                             Achim Gratz/Yaakov Selkowitz
+perl-HTTP-Date                               Achim Gratz/Yaakov Selkowitz
+perl-HTTP-Message                            Achim Gratz/Yaakov Selkowitz
+perl-HTTP-Negotiate                          Achim Gratz/Yaakov Selkowitz
+perl-inc-latest                              Achim Gratz
+perl-Inline                                  Achim Gratz
+perl-Inline-Files                            Achim Gratz
+perl-IO-CaptureOutput                        Achim Gratz
+perl-IO-HTML                                 Achim Gratz/Ken Brown
+perl-IO-Prompt-Tiny                          Achim Gratz
+perl-IO-Socket-INET6                         Achim Gratz
+perl-IO-Socket-IP                            Achim Gratz/Yaakov Selkowitz
+perl-IO-Socket-SSL                           Achim Gratz/Yaakov Selkowitz
+perl-IO-String                               Achim Gratz
+perl-IO-Tty                                  Achim Gratz
+perl-IPC-Cmd                                 Achim Gratz
+perl-IPC-Run                                 Achim Gratz
+perl-IPC-Run3                                Achim Gratz/Ken Brown
+perl-JSON                                    Achim Gratz
+perl-JSON-PP                                 Achim Gratz
+perl-JSON-XS                                 Achim Gratz
+perl-libwww-perl                             Achim Gratz
+perl-List-AllUtils                           Achim Gratz/Ken Brown
+perl-List-MoreUtils                          Achim Gratz/Ken Brown
+perl-Locale-gettext                          Achim Gratz/Yaakov Selkowitz
+perl-Log-Log4perl                            Achim Gratz/Ken Brown
+perl-LWP-MediaTypes                          Achim Gratz/Yaakov Selkowitz
+perl-LWP-Protocol-https                      Achim Gratz/Ken Brown
+perl-MailTools                               Yaakov Selkowitz
+perl-Metabase-Client-Simple                  Achim Gratz
+perl-Metabase-Fact                           Achim Gratz
+perl-MIME-Base32                             Achim Gratz
+perl-MIME-Charset                            Achim Gratz/Ken Brown
+perl-Module-Build                            Achim Gratz
+perl-Module-Metadata                         Achim Gratz
+perl-Module-Pluggable                        Yaakov Selkowitz
+perl-Module-ScanDeps                         Achim Gratz/Yaakov Selkowitz
+perl-Module-Signature                        Achim Gratz
+perl-Mozilla-CA                              Achim Gratz/Ken Brown
+perl-Net-DNS                                 Achim Gratz
+perl-Net-DNS-SEC                             Achim Gratz
+perl-Net-HTTP                                Achim Gratz/Yaakov Selkowitz
+perl-Net-IP                                  Achim Gratz
+perl-Net-SMTP-SSL                            Yaakov Selkowitz/Blooey McFooey
+perl-Net-SSLeay                              Achim Gratz/Yaakov Selkowitz
+perl-Number-Compare                          Achim Gratz/Ken Brown
+perl-OpenGL                                  Yaakov Selkowitz
+perl-PadWalker                               Achim Gratz
+perl-Pango                                   Yaakov Selkowitz
+perl-PAR                                     Achim Gratz/Yaakov Selkowitz
+perl-PAR-Dist                                Achim Gratz/Yaakov Selkowitz
+perl-PAR-Packer                              Yaakov Selkowitz
+perl-Params-Util                             Achim Gratz/Yaakov Selkowitz
+perl-Parse-CPAN-Meta                         Achim Gratz
+perl-Parse-RecDescent                        Achim Gratz
+perl-Path-Class                              Achim Gratz
+perl-Pod-Coverage                            Achim Gratz
+perl-Pod-Escapes                             Achim Gratz
+perl-Pod-Simple                              Achim Gratz
+perl-POD2-Base                               Achim Gratz
+perl-Probe-Perl                              Achim Gratz
+perl-Proc-ProcessTable                       Achim Gratz/Yaakov Selkowitz
+perl-Readonly                                Achim Gratz/Ken Brown
+perl-Readonly-XS                             Achim Gratz/Ken Brown
+perl-Regexp-Common                           Achim Gratz/Ken Brown
+perl-Scalar-List-Utils                       Achim Gratz
+perl-SGMLSpm                                 Yaakov Selkowitz
+perl-Socket                                  Achim Gratz/Yaakov Selkowitz
+perl-Socket6                                 Achim Gratz
+perl-Spiffy                                  Achim Gratz
+perl-Sub-Exporter                            Achim Gratz
+perl-Sub-Install                             Achim Gratz
+perl-Sub-Uplevel                             Achim Gratz
+perl-Tee                                     Achim Gratz
+perl-Term-ReadKey                            Achim Gratz/Yaakov Selkowitz
+perl-Term-ReadLine-Gnu                       Achim Gratz/Yaakov Selkowitz
+perl-Term-ReadLine-Perl                      Achim Gratz
+perl-TermReadKey                             Achim Gratz
+perl-Test-Base                               Achim Gratz
+perl-Test-CPAN-Meta                          Achim Gratz
+perl-Test-Deep                               Achim Gratz
+perl-Test-Differences                        Achim Gratz
+perl-Test-Exception                          Achim Gratz
+perl-Test-Fatal                              Achim Gratz
+perl-Test-LeakTrace                          Achim Gratz
+perl-Test-NoWarnings                         Achim Gratz
+perl-Test-Pod                                Achim Gratz
+perl-Test-Pod-Coverage                       Achim Gratz
+perl-Test-Reporter                           Achim Gratz
+perl-Test-Reporter-Transport-Metabase        Achim Gratz
+perl-Test-Requires                           Achim Gratz
+perl-Test-Script                             Achim Gratz
+perl-Test-Simple                             Achim Gratz
+perl-Test-TrailingSpace                      Achim Gratz
+perl-Test-Warn                               Achim Gratz
+perl-Test-Warnings                           Achim Gratz
+perl-Test-Without-Module                     Achim Gratz
+perl-Test-YAML                               Achim Gratz
+perl-Text-BibTeX                             Achim Gratz/Ken Brown
+perl-Text-CharWidth                          Achim Gratz/Yaakov Selkowitz
+perl-Text-CSV                                Achim Gratz/David Stacey
+perl-Text-CSV_XS                             Achim Gratz/David Stacey
+perl-Text-Diff                               Achim Gratz
+perl-Text-Glob                               Achim Gratz/Ken Brown
+perl-Text-Roman                              Achim Gratz/Ken Brown
+perl-Text-WrapI18N                           Achim Gratz/Yaakov Selkowitz
+perl-Tie-Cycle                               Achim Gratz/Ken Brown
+perl-TimeDate                                Achim Gratz/Yaakov Selkowitz
+perl-Tk                                      Yaakov Selkowitz
+perl-Tk-Canvas-GradientColor                 Yaakov Selkowitz
+perl-Tk-ColoredButton                        Yaakov Selkowitz
+perl-Tk-EntryCheck                           Yaakov Selkowitz
+perl-Tk-Getopt                               Yaakov Selkowitz
+perl-Tk-Pod                                  Yaakov Selkowitz
+perl-Try-Tiny                                Achim Gratz
+perl-Types-Serialiser                        Achim Gratz
+perl-Unicode-Collate                         Achim Gratz/Ken Brown
+perl-Unicode-GCString                        Achim Gratz/Ken Brown
+perl-Unicode-LineBreak                       Achim Gratz/Ken Brown
+perl-Unicode-Normalize                       Achim Gratz/Ken Brown
+perl-URI                                     Achim Gratz/Yaakov Selkowitz
+perl-Win32                                   Achim Gratz
+perl-WWW-Curl                                Achim Gratz
+perl-WWW-RobotRules                          Achim Gratz/Yaakov Selkowitz
+perl-Wx                                      Yaakov Selkowitz
+perl-XML-LibXML                              Achim Gratz/Yaakov Selkowitz
+perl-XML-LibXML-Simple                       Achim Gratz/Ken Brown
+perl-XML-LibXSLT                             Achim Gratz/Ken Brown
+perl-XML-NamespaceSupport                    Achim Gratz/Yaakov Selkowitz
+perl-XML-Parser                              Achim Gratz/Yaakov Selkowitz
+perl-XML-SAX                                 Achim Gratz/Yaakov Selkowitz
+perl-XML-SAX-Base                            Achim Gratz/Yaakov Selkowitz
+perl-XML-SAX-Expat                           Achim Gratz
+perl-XML-Simple                              Achim Gratz/Yaakov Selkowitz
+perl-XML-Writer                              Achim Gratz/Ken Brown
+perl-YAML                                    Achim Gratz/Yaakov Selkowitz
+perl-YAML-LibYAML                            Achim Gratz
+phodav                                       Yaakov Selkowitz
+phonon                                       Yaakov Selkowitz
+phonon-backend-gstreamer                     Yaakov Selkowitz
+phonon4qt5                                   Yaakov Selkowitz
+phonon4qt5-backend-gstreamer                 Yaakov Selkowitz
+php                                          Yaakov Selkowitz
+php-Archive_Tar                              Yaakov Selkowitz
+php-Console_Getopt                           Yaakov Selkowitz
+php-jsonc                                    Yaakov Selkowitz
+php-PEAR                                     Yaakov Selkowitz
+php-Structures_Graph                         Yaakov Selkowitz
+php-XML_Util                                 Yaakov Selkowitz
+picard                                       Dr. Volker Zell
+picmi                                        Yaakov Selkowitz
+pinentry                                     ORPHANED (Charles Wilson)
+pinfo                                        Andrew Schulman
+ping                                         Marco Atzeri
+pixman                                       Yaakov Selkowitz
+pkg-config                                   Yaakov Selkowitz
+pl                                           Corinna Vinschen
+planet                                       Yaakov Selkowitz
+ploticus                                     Andrew Schulman
+ploticus-doc                                 Andrew Schulman
+plotutils                                    Marco Atzeri
+pluma                                        Yaakov Selkowitz
+pluma-plugins                                Yaakov Selkowitz
+pngcheck                                     Jari Aalto
+pngcrush                                     Jari Aalto
+pngquant                                     Jari Aalto
+po4a                                         Yaakov Selkowitz
+poco                                         David Stacey
+poppler                                      Yaakov Selkowitz
+poppler-data                                 Yaakov Selkowitz
+popt                                         ORPHANED
+portaudio                                    Yaakov Selkowitz
+portmidi                                     Yaakov Selkowitz
+posh                                         Jari Aalto
+postfix                                      Christian Franke
+postgresql                                   Marco Atzeri
+potrace                                      Jari Aalto
+presentproto                                 Yaakov Selkowitz
+prison                                       Yaakov Selkowitz
+pristine-tar                                 Jari Aalto
+procmail                                     Daniel Boland
+procps                                       OBSOLETE (Corinna Vinschen)
+proj                                         Marco Atzeri
+protobuf                                     ORPHANED (Reini Urban)
+pscan                                        Jari Aalto
+psmisc                                       Corinna Vinschen
+pstoedit                                     Dr. Volker Zell
+pstotext                                     Jari Aalto
+pth                                          ORPHANED (Charles Wilson)
+pugixml                                      David Stacey
+pulseaudio                                   Yaakov Selkowitz
+pure-ftpd                                    Marco Atzeri
+putty                                        Yaakov Selkowitz
+pv                                           Aaron Schneider
+pwgen                                        Jari Aalto
+pwget                                        Jari Aalto
+pylint                                       Jari Aalto
+python                                       Yaakov Selkowitz
+python-backports.ssl_match_hostname          ORPHANED (Yaakov Selkowitz)
+python-beautifulsoup                         Yaakov Selkowitz
+python-bsddb3                                Yaakov Selkowitz
+python-cairo                                 Yaakov Selkowitz
+python-cffi                                  Yaakov Selkowitz
+python-chardet                               Yaakov Selkowitz
+python-crypto                                Jari Aalto
+python-cryptography                          Yaakov Selkowitz
+python-cython                                Yaakov Selkowitz
+python-dbus                                  Yaakov Selkowitz
+python-discid                                Dr. Volker Zell
+python-doc                                   Yaakov Selkowitz
+python-docutils                              Tony Kelman
+python-enum34                                Yaakov Selkowitz
+python-fastimport                            Ken Brown
+python-feedparser                            Jari Aalto
+python-gdata                                 ORPHANED (Chris Sutcliffe)
+python-gi                                    Yaakov Selkowitz
+python-gobject                               Yaakov Selkowitz
+python-goocanvas                             Yaakov Selkowitz
+python-gst0.10                               Yaakov Selkowitz
+python-gtk2.0                                Yaakov Selkowitz
+python-gtksourceview2                        Yaakov Selkowitz
+python-h5py                                  Chris LeBlanc
+python-htmltmpl                              Yaakov Selkowitz
+python-imaging                               Yaakov Selkowitz
+python-jinja2                                Tony Kelman
+python-logilab-astng                         Jari Aalto
+python-logilab-common                        Jari Aalto
+python-lxml                                  Yaakov Selkowitz
+python-mako                                  Yaakov Selkowitz
+python-markupsafe                            Yaakov Selkowitz
+python-mutagen                               Dr. Volker Zell
+python-mx                                    Yaakov Selkowitz
+python-numpy                                 Yaakov Selkowitz
+python-opengl                                Yaakov Selkowitz
+python-opengl-accelerate                     Yaakov Selkowitz
+python-openssl                               Yaakov Selkowitz
+python-orbit                                 Yaakov Selkowitz
+python-paramiko                              Jari Aalto
+python-ply                                   Yaakov Selkowitz
+python-pyasn1                                Yaakov Selkowitz
+python-pycparser                             Yaakov Selkowitz
+python-pygame                                Yaakov Selkowitz
+python-pygments                              Yaakov Selkowitz
+python-pykde4                                Yaakov Selkowitz
+python-pypdf                                 Yaakov Selkowitz
+python-pyqt4                                 Yaakov Selkowitz
+python-pyqt5                                 Yaakov Selkowitz
+python-pyrex                                 Yaakov Selkowitz
+python-reportlab                             Yaakov Selkowitz
+python-requests                              Yaakov Selkowitz
+python-setuptools                            Yaakov Selkowitz
+python-simplejson                            Yaakov Selkowitz
+python-sip                                   Yaakov Selkowitz
+python-six                                   Yaakov Selkowitz
+python-sphinx                                Tony Kelman
+python-twisted                               Yaakov Selkowitz
+python-unidecode                             Yaakov Selkowitz
+python-urllib3                               Yaakov Selkowitz
+python-webkit                                Yaakov Selkowitz
+python-xdg                                   Yaakov Selkowitz
+python-yaml                                  Yaakov Selkowitz
+python-zope.interface                        Yaakov Selkowitz
+python3                                      Yaakov Selkowitz
+python3-bsddb3                               Yaakov Selkowitz
+python3-cairo                                Yaakov Selkowitz
+python3-cffi                                 Yaakov Selkowitz
+python3-chardet                              Yaakov Selkowitz
+python3-cryptography                         Yaakov Selkowitz
+python3-cython                               Yaakov Selkowitz
+python3-dbus                                 Yaakov Selkowitz
+python3-doc                                  Yaakov Selkowitz
+python3-h5py                                 Chris LeBlanc
+python3-imaging                              Yaakov Selkowitz
+python3-lxml                                 Yaakov Selkowitz
+python3-mako                                 Yaakov Selkowitz
+python3-markupsafe                           Yaakov Selkowitz
+python3-numpy                                Yaakov Selkowitz
+python3-openssl                              Yaakov Selkowitz
+python3-ply                                  Yaakov Selkowitz
+python3-pyasn1                               Yaakov Selkowitz
+python3-pycparser                            Yaakov Selkowitz
+python3-pygments                             Yaakov Selkowitz
+python3-pykde4                               Yaakov Selkowitz
+python3-pyqt4                                Yaakov Selkowitz
+python3-pyqt5                                Yaakov Selkowitz
+python3-requests                             Yaakov Selkowitz
+python3-setuptools                           Yaakov Selkowitz
+python3-simplejson                           Yaakov Selkowitz
+python3-sip                                  Yaakov Selkowitz
+python3-six                                  Yaakov Selkowitz
+python3-unidecode                            Yaakov Selkowitz
+python3-urllib3                              Yaakov Selkowitz
+python3-xdg                                  Yaakov Selkowitz
+python3-yaml                                 Yaakov Selkowitz
+python3-zope.interface                       Yaakov Selkowitz
+pyzy                                         Yaakov Selkowitz
+qca                                          Yaakov Selkowitz
+qhull                                        Marco Atzeri
+qimageblitz                                  Yaakov Selkowitz
+qiv                                          Jari Aalto
+qjson                                        Yaakov Selkowitz
+qoauth                                       Yaakov Selkowitz
+qqwing                                       Yaakov Selkowitz
+qrencode                                     Yaakov Selkowitz
+qrupdate                                     Marco Atzeri
+qscintilla2                                  Yaakov Selkowitz
+qsf                                          Jari Aalto
+qt3                                          Yaakov Selkowitz
+qt4                                          Yaakov Selkowitz
+qt4-webkit                                   Yaakov Selkowitz
+qt5-base                                     Yaakov Selkowitz
+qt5-declarative                              Yaakov Selkowitz
+qt5-doc                                      Yaakov Selkowitz
+qt5-enginio                                  Yaakov Selkowitz
+qt5-graphicaleffects                         Yaakov Selkowitz
+qt5-imageformats                             Yaakov Selkowitz
+qt5-location                                 Yaakov Selkowitz
+qt5-multimedia                               Yaakov Selkowitz
+qt5-quick1                                   Yaakov Selkowitz
+qt5-quickcontrols                            Yaakov Selkowitz
+qt5-script                                   Yaakov Selkowitz
+qt5-serialport                               Yaakov Selkowitz
+qt5-svg                                      Yaakov Selkowitz
+qt5-tools                                    Yaakov Selkowitz
+qt5-translations                             Yaakov Selkowitz
+qt5-webchannel                               Yaakov Selkowitz
+qt5-webkit                                   Yaakov Selkowitz
+qt5-webkit-examples                          Yaakov Selkowitz
+qt5-websockets                               Yaakov Selkowitz
+qt5-x11extras                                Yaakov Selkowitz
+qt5-xmlpatterns                              Yaakov Selkowitz
+quadrapassel                                 Yaakov Selkowitz
+quilt                                        Jari Aalto
+quvi                                         Yaakov Selkowitz
+R                                            Marco Atzeri
+randrproto                                   Yaakov Selkowitz
+rarian                                       Yaakov Selkowitz
+rats                                         Jari Aalto
+rbio                                         Marco Atzeri
+rc                                           Jari Aalto
+rcs                                          Achim Gratz
+rdiff-backup                                 David Rothenberger
+rdtool                                       Jari Aalto
+readline                                     Eric Blake
+rebase                                       Corinna Vinschen
+recode                                       Corinna Vinschen
+recordproto                                  Yaakov Selkowitz
+regina-rexx                                  Mark Hessling
+renameutils                                  Jari Aalto
+renattach                                    Jari Aalto
+rendercheck                                  Yaakov Selkowitz
+renderproto                                  Yaakov Selkowitz
+resourceproto                                Yaakov Selkowitz
+rgb                                          Yaakov Selkowitz
+ristretto                                    Yaakov Selkowitz
+rlwrap                                       Corinna Vinschen
+rng-tools                                    Corinna Vinschen
+robodoc                                      Yaakov Selkowitz
+robots                                       Corinna Vinschen
+rocs                                         Yaakov Selkowitz
+rodent-icon-theme                            Yaakov Selkowitz
+rpcbind                                      Pavel Fedin
+rpm                                          Pavel Fedin
+rsh                                          ORPHANED (Charles Wilson)
+rsnapshot                                    Jari Aalto
+rstart                                       Yaakov Selkowitz
+rsync                                        Jari Aalto
+rtf2html-htdig                               Jari Aalto
+rtorrent                                     Marco Atzeri
+ruby                                         Yaakov Selkowitz
+ruby-actionmailer                            Yaakov Selkowitz
+ruby-actionpack                              Yaakov Selkowitz
+ruby-actionview                              Yaakov Selkowitz
+ruby-activejob                               Yaakov Selkowitz
+ruby-activemodel                             Yaakov Selkowitz
+ruby-activerecord                            Yaakov Selkowitz
+ruby-activerecord-deprecated_finders         Yaakov Selkowitz
+ruby-activesupport                           Yaakov Selkowitz
+ruby-arel                                    Yaakov Selkowitz
+ruby-atk                                     Yaakov Selkowitz
+ruby-bcrypt                                  Yaakov Selkowitz
+ruby-bigdecimal                              Yaakov Selkowitz
+ruby-binding_of_caller                       Yaakov Selkowitz
+ruby-builder                                 Yaakov Selkowitz
+ruby-bundler                                 Yaakov Selkowitz
+ruby-byebug                                  Yaakov Selkowitz
+ruby-cairo                                   Yaakov Selkowitz
+ruby-cairo-gobject                           Yaakov Selkowitz
+ruby-celluloid                               Yaakov Selkowitz
+ruby-clutter                                 Yaakov Selkowitz
+ruby-clutter-gtk                             Yaakov Selkowitz
+ruby-coffee-rails                            Yaakov Selkowitz
+ruby-coffee-script                           Yaakov Selkowitz
+ruby-coffee-script-source                    Yaakov Selkowitz
+ruby-columnize                               Yaakov Selkowitz
+ruby-curses                                  Yaakov Selkowitz
+ruby-dbus                                    Yaakov Selkowitz
+ruby-debug_inspector                         Yaakov Selkowitz
+ruby-erubis                                  Yaakov Selkowitz
+ruby-execjs                                  Yaakov Selkowitz
+ruby-gdk3                                    Yaakov Selkowitz
+ruby-gdk_pixbuf2                             Yaakov Selkowitz
+ruby-gettext                                 Yaakov Selkowitz
+ruby-gio2                                    Yaakov Selkowitz
+ruby-glib2                                   Yaakov Selkowitz
+ruby-globalid                                Yaakov Selkowitz
+ruby-gobject-introspection                   Yaakov Selkowitz
+ruby-goocanvas1                              Yaakov Selkowitz
+ruby-goocanvas2                              Yaakov Selkowitz
+ruby-gstreamer0.10                           Yaakov Selkowitz
+ruby-gstreamer1.0                            Yaakov Selkowitz
+ruby-gtk2                                    Yaakov Selkowitz
+ruby-gtk3                                    Yaakov Selkowitz
+ruby-gtksourceview2                          Yaakov Selkowitz
+ruby-gtksourceview3                          Yaakov Selkowitz
+ruby-hike                                    Yaakov Selkowitz
+ruby-hitimes                                 Yaakov Selkowitz
+ruby-hoe                                     Yaakov Selkowitz
+ruby-i18n                                    Yaakov Selkowitz
+ruby-io-console                              Yaakov Selkowitz
+ruby-jbuilder                                Yaakov Selkowitz
+ruby-journey                                 Yaakov Selkowitz
+ruby-jquery-rails                            Yaakov Selkowitz
+ruby-json                                    Yaakov Selkowitz
+ruby-kgio                                    Yaakov Selkowitz
+ruby-listen                                  Yaakov Selkowitz
+ruby-locale                                  Yaakov Selkowitz
+ruby-loofah                                  Yaakov Selkowitz
+ruby-mail                                    Yaakov Selkowitz
+ruby-mime-types                              Yaakov Selkowitz
+ruby-minitest                                Yaakov Selkowitz
+ruby-minitest4                               Yaakov Selkowitz
+ruby-minitest5                               Yaakov Selkowitz
+ruby-molinillo                               Yaakov Selkowitz
+ruby-multi_json                              Yaakov Selkowitz
+ruby-mysql2                                  Yaakov Selkowitz
+ruby-net-http-persistent                     Yaakov Selkowitz
+ruby-nokogiri                                Yaakov Selkowitz
+ruby-oj                                      Yaakov Selkowitz
+ruby-pango                                   Yaakov Selkowitz
+ruby-pg                                      Yaakov Selkowitz
+ruby-pkg-config                              Yaakov Selkowitz
+ruby-polyglot                                Yaakov Selkowitz
+ruby-poppler                                 Yaakov Selkowitz
+ruby-psych                                   Yaakov Selkowitz
+ruby-racc                                    Yaakov Selkowitz
+ruby-rack                                    Yaakov Selkowitz
+ruby-rack-cache                              Yaakov Selkowitz
+ruby-rack-ssl                                Yaakov Selkowitz
+ruby-rack-test                               Yaakov Selkowitz
+ruby-rails                                   Yaakov Selkowitz
+ruby-rails-deprecated_sanitizer              Yaakov Selkowitz
+ruby-rails-dom-testing                       Yaakov Selkowitz
+ruby-rails-html-sanitizer                    Yaakov Selkowitz
+ruby-railties                                Yaakov Selkowitz
+ruby-raindrops                               Yaakov Selkowitz
+ruby-rake                                    Yaakov Selkowitz
+ruby-rake-compiler                           Yaakov Selkowitz
+ruby-rdoc                                    Yaakov Selkowitz
+ruby-rsvg2                                   Yaakov Selkowitz
+ruby-sass                                    Yaakov Selkowitz
+ruby-sass-rails                              Yaakov Selkowitz
+ruby-sdoc                                    Yaakov Selkowitz
+ruby-sprockets                               Yaakov Selkowitz
+ruby-sprockets-rails                         Yaakov Selkowitz
+ruby-sqlite3                                 Yaakov Selkowitz
+ruby-test-unit                               Yaakov Selkowitz
+ruby-text                                    Yaakov Selkowitz
+ruby-thor                                    Yaakov Selkowitz
+ruby-thread_safe                             Yaakov Selkowitz
+ruby-tilt                                    Yaakov Selkowitz
+ruby-timers                                  Yaakov Selkowitz
+ruby-treetop                                 Yaakov Selkowitz
+ruby-turbolinks                              Yaakov Selkowitz
+ruby-tzinfo                                  Yaakov Selkowitz
+ruby-uglifier                                Yaakov Selkowitz
+ruby-unicorn                                 Yaakov Selkowitz
+ruby-vte                                     Yaakov Selkowitz
+ruby-vte3                                    Yaakov Selkowitz
+ruby-web-console                             Yaakov Selkowitz
+ruby-webkit-gtk2                             Yaakov Selkowitz
+ruby-yajl                                    Yaakov Selkowitz
+rubygems                                     Yaakov Selkowitz
+run                                          Achim Gratz
+run2                                         ORPHANED (Charles Wilson)
+rxp                                          Jari Aalto
+rxvt                                         ORPHANED (Charles Wilson)
+rxvt-unicode                                 Yaakov Selkowitz
+rzip                                         Jari Aalto
+scons                                        David Rothenberger
+scowl                                        Yaakov Selkowitz
+screen                                       Andrew Schulman
+scrnsaverproto                               Yaakov Selkowitz
+scsh                                         ORPHANED (Reini Urban)
+SDL                                          Yaakov Selkowitz
+SDL2                                         Yaakov Selkowitz
+SDL2_image                                   Yaakov Selkowitz
+SDL2_mixer                                   Yaakov Selkowitz
+SDL2_net                                     Yaakov Selkowitz
+SDL2_ttf                                     Yaakov Selkowitz
+SDL_gfx                                      Yaakov Selkowitz
+SDL_image                                    Yaakov Selkowitz
+SDL_mixer                                    Yaakov Selkowitz
+SDL_net                                      Yaakov Selkowitz
+SDL_Pango                                    Yaakov Selkowitz
+SDL_sound                                    Yaakov Selkowitz
+SDL_ttf                                      Yaakov Selkowitz
+seahorse                                     Yaakov Selkowitz
+sed                                          Corinna Vinschen
+sendmail                                     Daniel Boland
+sendxmpp                                     Jari Aalto
+serf                                         David Rothenberger
+sessreg                                      Yaakov Selkowitz
+setxkbmap                                    Yaakov Selkowitz
+sgml-common                                  Yaakov Selkowitz
+sgrep                                        Jari Aalto
+shared-mime-info                             Yaakov Selkowitz
+sharutils                                    Eric Blake
+shed                                         Jari Aalto
+showfont                                     Yaakov Selkowitz
+shutdown                                     Frank Fesevur
+sic                                          Jari Aalto
+signify                                      Jari Aalto
+simsu                                        Yaakov Selkowitz
+since                                        Jari Aalto
+singular                                     Yue Ren/Marco Atzeri
+sitecopy                                     Andrew Schulman
+sj-fonts                                     Yaakov Selkowitz
+skkdic                                       Yaakov Selkowitz
+sl                                           Yaakov Selkowitz
+slang                                        Marco Atzeri
+slrn                                         Marco Atzeri
+smartmontools                                Christian Franke
+smproxy                                      Yaakov Selkowitz
+sng                                          Andrew Schulman
+snownews                                     Yaakov Selkowitz
+socat                                        Andrew Schulman
+sound-theme-freedesktop                      Yaakov Selkowitz
+source-highlight                             Yaakov Selkowitz
+sox                                          Yaakov Selkowitz
+spambayes                                    Jari Aalto
+spamoracle                                   Jari Aalto
+speex                                        David Rothenberger
+spice-gtk                                    Yaakov Selkowitz
+spice-protocol                               Yaakov Selkowitz
+splint                                       Jari Aalto
+splitpatch                                   Jari Aalto
+spqr                                         Marco Atzeri
+sqlite3                                      Jan Nijtmans
+squid                                        Dr. Volker Zell
+ssh-pageant                                  Michael Wild
+ssmtp                                        Corinna Vinschen
+startup-notification                         Yaakov Selkowitz
+steghide                                     Jari Aalto
+step                                         Yaakov Selkowitz
+stgit                                        Jari Aalto
+stow                                         Andrew Schulman
+strigi                                       Yaakov Selkowitz
+stunnel                                      Andrew Schulman
+subversion                                   David Rothenberger
+suck                                         Jari Aalto
+sudoku                                       Jari Aalto
+suite3270                                    Peter A. Castro
+suitesparseconfig                            Marco Atzeri
+sunrpc                                       ORPHANED (Charles Wilson)
+suomi-malaga                                 Yaakov Selkowitz
+surf                                         Yue Ren/Marco Atzeri
+svm                                          Ken Brown
+svn-load                                     Jari Aalto
+svn_load_dirs                                David Rothenberger
+sweeper                                      Yaakov Selkowitz
+swell-foop                                   Yaakov Selkowitz
+swig                                         Yaakov Selkowitz
+symlinks                                     Jari Aalto
+syslog-ng                                    Corinna Vinschen
+sysvinit                                     Dr. Volker Zell
+t1lib                                        Dr. Volker Zell
+tack                                         ORPHANED
+taglib                                       Yaakov Selkowitz
+tailor                                       Jari Aalto
+tali                                         Yaakov Selkowitz
+tanglet                                      Yaakov Selkowitz
+tar                                          Eric Blake
+task                                         Federico Hernandez
+tcl                                          Yaakov Selkowitz
+tcl-itcl                                     Yaakov Selkowitz
+tcl-itk                                      Yaakov Selkowitz
+tcl-iwidgets                                 Yaakov Selkowitz
+tcl-tix                                      Yaakov Selkowitz
+tcl-tk                                       Yaakov Selkowitz
+tcl-togl                                     Yaakov Selkowitz
+tcm                                          Dr. Volker Zell
+tcp_wrappers                                 ORPHANED (Charles Wilson)
+tcsh                                         Corinna Vinschen
+tdb                                          Yaakov Selkowitz
+ted                                          Dr. Volker Zell
+telepathy-farstream                          Yaakov Selkowitz
+telepathy-gabble                             Yaakov Selkowitz
+telepathy-glib                               Yaakov Selkowitz
+telepathy-idle                               Yaakov Selkowitz
+telepathy-logger                             Yaakov Selkowitz
+telepathy-mission-control                    Yaakov Selkowitz
+telepathy-qt                                 Yaakov Selkowitz
+terminus-fonts                               Yaakov Selkowitz
+tesseract-ocr                                Marco Atzeri
+testpackage                                  Blooey McFooey
+tetzle                                       Yaakov Selkowitz
+texi2html                                    Dr. Volker Zell
+texinfo                                      Ken Brown
+texlive                                      Ken Brown
+texlive-collection-basic                     Ken Brown
+texlive-collection-basic-doc                 Ken Brown
+texlive-collection-bibtexextra               Ken Brown
+texlive-collection-bibtexextra-doc           Ken Brown
+texlive-collection-binextra                  Ken Brown
+texlive-collection-binextra-doc              Ken Brown
+texlive-collection-context                   Ken Brown
+texlive-collection-context-doc               Ken Brown
+texlive-collection-fontsextra                Ken Brown
+texlive-collection-fontsextra-doc            Ken Brown
+texlive-collection-fontsrecommended          Ken Brown
+texlive-collection-fontsrecommended-doc      Ken Brown
+texlive-collection-fontutils                 Ken Brown
+texlive-collection-fontutils-doc             Ken Brown
+texlive-collection-formatsextra              Ken Brown
+texlive-collection-games                     Ken Brown
+texlive-collection-genericextra              Ken Brown
+texlive-collection-genericextra-doc          Ken Brown
+texlive-collection-genericrecommended        Ken Brown
+texlive-collection-genericrecommended-doc    Ken Brown
+texlive-collection-htmlxml                   Ken Brown
+texlive-collection-humanities                Ken Brown
+texlive-collection-humanities-doc            Ken Brown
+texlive-collection-langafrican               Ken Brown
+texlive-collection-langarabic                Ken Brown
+texlive-collection-langchinese               Ken Brown
+texlive-collection-langcjk                   Ken Brown
+texlive-collection-langcyrillic              Ken Brown
+texlive-collection-langczechslovak           Ken Brown
+texlive-collection-langenglish               Ken Brown
+texlive-collection-langeuropean              Ken Brown
+texlive-collection-langfrench                Ken Brown
+texlive-collection-langgerman                Ken Brown
+texlive-collection-langgreek                 Ken Brown
+texlive-collection-langindic                 Ken Brown
+texlive-collection-langitalian               Ken Brown
+texlive-collection-langjapanese              Ken Brown
+texlive-collection-langkorean                Ken Brown
+texlive-collection-langother                 Ken Brown
+texlive-collection-langpolish                Ken Brown
+texlive-collection-langportuguese            Ken Brown
+texlive-collection-langspanish               Ken Brown
+texlive-collection-latex                     Ken Brown
+texlive-collection-latex-doc                 Ken Brown
+texlive-collection-latexextra                Ken Brown
+texlive-collection-latexextra-doc            Ken Brown
+texlive-collection-latexrecommended          Ken Brown
+texlive-collection-latexrecommended-doc      Ken Brown
+texlive-collection-luatex                    Ken Brown
+texlive-collection-luatex-doc                Ken Brown
+texlive-collection-mathextra                 Ken Brown
+texlive-collection-mathextra-doc             Ken Brown
+texlive-collection-metapost                  Ken Brown
+texlive-collection-metapost-doc              Ken Brown
+texlive-collection-music                     Ken Brown
+texlive-collection-music-doc                 Ken Brown
+texlive-collection-omega                     Ken Brown
+texlive-collection-pictures                  Ken Brown
+texlive-collection-pictures-doc              Ken Brown
+texlive-collection-plainextra                Ken Brown
+texlive-collection-pstricks                  Ken Brown
+texlive-collection-pstricks-doc              Ken Brown
+texlive-collection-publishers                Ken Brown
+texlive-collection-publishers-doc            Ken Brown
+texlive-collection-science                   Ken Brown
+texlive-collection-science-doc               Ken Brown
+texlive-collection-xetex                     Ken Brown
+texlive-collection-xetex-doc                 Ken Brown
+TeXmacs                                      Marco Atzeri
+tftp                                         Gernot Hillier
+Thunar                                       Yaakov Selkowitz
+tidy                                         Yaakov Selkowitz
+tiff                                         Yaakov Selkowitz
+tig                                          Jari Aalto
+tigervnc                                     Yaakov Selkowitz
+time                                         Andrew Schulman
+timidity++                                   Yaakov Selkowitz
+tin                                          Corinna Vinschen
+tinyirc                                      Jari Aalto
+tinyxml2                                     David Stacey
+tirc                                         Jari Aalto
+tmux                                         Michael Wild
+tnef                                         Jari Aalto
+tnftp                                        Jari Aalto
+totem                                        Yaakov Selkowitz
+totem-pl-parser                              Yaakov Selkowitz
+transfig                                     Dr. Volker Zell
+transmission                                 Yaakov Selkowitz
+transset                                     Yaakov Selkowitz
+trayer                                       Yaakov Selkowitz
+tree                                         Jari Aalto
+ttcp                                         Jari Aalto
+tumbler                                      Yaakov Selkowitz
+twm                                          Yaakov Selkowitz
+txt2regex                                    Jari Aalto
+typespeed                                    ORPHANED
+tzcode                                       Corinna Vinschen/Yaakov Selkowitz
+ucl                                          Achim Gratz
+ucspi-tcp                                    ORPHANED (Steven Monai)
+udunits                                      Marco Atzeri
+umfpack                                      Marco Atzeri
+unace                                        Jari Aalto
+unalz                                        Jari Aalto
+unifdef                                      Jari Aalto
+unifont                                      Yaakov Selkowitz
+unison2.27                                   Andrew Schulman
+unison2.32                                   Andrew Schulman
+unison2.40                                   Andrew Schulman
+unison2.45                                   Andrew Schulman
+unison2.48                                   Andrew Schulman
+units                                        ORPHANED
+unrtf                                        Jari Aalto
+untex                                        Jari Aalto
+unzip                                        Yaakov Selkowitz
+upower                                       Yaakov Selkowitz
+upx                                          Achim Gratz
+urlgrabber                                   Jari Aalto
+usbredir                                     Yaakov Selkowitz
+usbutils                                     Yaakov Selkowitz
+util-linux                                   Yaakov Selkowitz
+uw-imap                                      Dr. Volker Zell
+vala                                         Yaakov Selkowitz
+varnish                                      Jorge Díaz
+vfu                                          Jari Aalto
+viewres                                      Yaakov Selkowitz
+vim                                          Yaakov Selkowitz
+vinagre                                      Yaakov Selkowitz
+vino                                         Yaakov Selkowitz
+vorbis-tools                                 David Rothenberger
+vte                                          Yaakov Selkowitz
+vte2.90                                      Yaakov Selkowitz
+vte2.91                                      Yaakov Selkowitz
+w32api-headers                               Jonathan Yong
+w32api-runtime                               Jonathan Yong
+w3m                                          Bob Heckel
+wavpack                                      Yaakov Selkowitz
+wcd                                          Jari Aalto
+wdiff                                        Jari Aalto
+webcheck                                     Jari Aalto
+webkitgtk                                    Yaakov Selkowitz
+webrtc-audio-processing                      Yaakov Selkowitz
+weechat                                      Sebastien Helleu
+wget                                         Eric Blake
+which                                        David Rothenberger
+whois                                        David Rothenberger
+wiggle                                       Jari Aalto
+wildmidi                                     Yaakov Selkowitz
+WindowMaker                                  Yaakov Selkowitz
+windows-default-manifest                     Corinna Vinschen
+windowswmproto                               Yaakov Selkowitz
+WordNet                                      Dr. Volker Zell
+wput                                         Jari Aalto
+wtf                                          ORPHANED (Chris Sutcliffe)
+wxWidgets2.8                                 Yaakov Selkowitz
+wxWidgets3.0                                 Yaakov Selkowitz
+x11perf                                      Yaakov Selkowitz
+xapian-bindings                              Yaakov Selkowitz
+xapian-core                                  Yaakov Selkowitz
+xarchiver                                    Yaakov Selkowitz
+xauth                                        Yaakov Selkowitz
+xbiff                                        Yaakov Selkowitz
+xbitmaps                                     Yaakov Selkowitz
+xcalc                                        Yaakov Selkowitz
+xcb-proto                                    Yaakov Selkowitz
+xcb-util                                     Yaakov Selkowitz
+xcb-util-cursor                              Yaakov Selkowitz
+xcb-util-image                               Yaakov Selkowitz
+xcb-util-keysyms                             Yaakov Selkowitz
+xcb-util-renderutil                          Yaakov Selkowitz
+xcb-util-wm                                  Yaakov Selkowitz
+xclip                                        Dr. Volker Zell
+xclipboard                                   Yaakov Selkowitz
+xclock                                       Yaakov Selkowitz
+xcmiscproto                                  Yaakov Selkowitz
+xcmsdb                                       Yaakov Selkowitz
+xcompmgr                                     Yaakov Selkowitz
+xconsole                                     Yaakov Selkowitz
+xcursor-themes                               Yaakov Selkowitz
+xcursorgen                                   Yaakov Selkowitz
+xdbedizzy                                    Yaakov Selkowitz
+xdelta                                       Marco Atzeri
+xdelta3                                      Marco Atzeri
+xdg-user-dirs                                Yaakov Selkowitz
+xdg-user-dirs-gtk                            Yaakov Selkowitz
+xditview                                     Yaakov Selkowitz
+xdpyinfo                                     Yaakov Selkowitz
+xedit                                        Yaakov Selkowitz
+xemacs                                       Dr. Volker Zell
+xemacs-mule-sumo                             Dr. Volker Zell
+xemacs-sumo                                  Dr. Volker Zell
+xerces-c                                     Yaakov Selkowitz
+xev                                          Yaakov Selkowitz
+xextproto                                    Yaakov Selkowitz
+xeyes                                        Yaakov Selkowitz
+xf86-video-dummy                             Yaakov Selkowitz
+xf86-video-nested                            Yaakov Selkowitz
+xf86bigfontproto                             Yaakov Selkowitz
+xfce-themes                                  Yaakov Selkowitz
+xfce4-appfinder                              Yaakov Selkowitz
+xfce4-clipman-plugin                         Yaakov Selkowitz
+xfce4-cpugraph-plugin                        Yaakov Selkowitz
+xfce4-dev-tools                              Yaakov Selkowitz
+xfce4-dict                                   Yaakov Selkowitz
+xfce4-embed-plugin                           Yaakov Selkowitz
+xfce4-equake-plugin                          Yaakov Selkowitz
+xfce4-eyes-plugin                            Yaakov Selkowitz
+xfce4-fsguard-plugin                         Yaakov Selkowitz
+xfce4-genmon-plugin                          Yaakov Selkowitz
+xfce4-mailwatch-plugin                       Yaakov Selkowitz
+xfce4-mixer                                  Yaakov Selkowitz
+xfce4-notes-plugin                           Yaakov Selkowitz
+xfce4-notifyd                                Yaakov Selkowitz
+xfce4-panel                                  Yaakov Selkowitz
+xfce4-places-plugin                          Yaakov Selkowitz
+xfce4-screenshooter                          Yaakov Selkowitz
+xfce4-session                                Yaakov Selkowitz
+xfce4-settings                               Yaakov Selkowitz
+xfce4-smartbookmark-plugin                   Yaakov Selkowitz
+xfce4-taskmanager                            Yaakov Selkowitz
+xfce4-terminal                               Yaakov Selkowitz
+xfce4-time-out-plugin                        Yaakov Selkowitz
+xfce4-timer-plugin                           Yaakov Selkowitz
+xfce4-verve-plugin                           Yaakov Selkowitz
+xfce4-weather-plugin                         Yaakov Selkowitz
+xfce4-whiskermenu-plugin                     Yaakov Selkowitz
+xfce4-wmdock-plugin                          Yaakov Selkowitz
+xfce4-xkb-plugin                             Yaakov Selkowitz
+xfconf                                       Yaakov Selkowitz
+xfd                                          Yaakov Selkowitz
+xfdesktop                                    Yaakov Selkowitz
+xfig                                         Dr. Volker Zell
+xfontsel                                     Yaakov Selkowitz
+xfs                                          Yaakov Selkowitz
+xfsinfo                                      Yaakov Selkowitz
+xfwm4                                        Yaakov Selkowitz
+xfwm4-themes                                 Yaakov Selkowitz
+xgc                                          Yaakov Selkowitz
+xgraph                                       Jari Aalto
+xhost                                        Yaakov Selkowitz
+xineramaproto                                Yaakov Selkowitz
+xinetd                                       Corinna Vinschen
+xinit                                        Yaakov Selkowitz
+xinput                                       Yaakov Selkowitz
+xkbcomp                                      Yaakov Selkowitz
+xkbevd                                       Yaakov Selkowitz
+xkbprint                                     Yaakov Selkowitz
+xkbutils                                     Yaakov Selkowitz
+xkeyboard-config                             Yaakov Selkowitz
+xkill                                        Yaakov Selkowitz
+xlaunch                                      Jon Turney
+xlhtml                                       Jari Aalto
+xload                                        Yaakov Selkowitz
+xloadimage                                   David Stacey
+xlogo                                        Yaakov Selkowitz
+xlsatoms                                     Yaakov Selkowitz
+xlsclients                                   Yaakov Selkowitz
+xlsfonts                                     Yaakov Selkowitz
+xlsx2csv                                     Jari Aalto
+xmag                                         Yaakov Selkowitz
+xman                                         Yaakov Selkowitz
+xmessage                                     Yaakov Selkowitz
+xmh                                          Yaakov Selkowitz
+XmHTML                                       Dr. Volker Zell
+xmlstarlet                                   David Stacey
+xmlto                                        Yaakov Selkowitz
+xmltoman                                     Yaakov Selkowitz
+xmodmap                                      Yaakov Selkowitz
+xmon                                         Jon Turney
+xmore                                        Yaakov Selkowitz
+xorg-cf-files                                Yaakov Selkowitz
+xorg-docs                                    Yaakov Selkowitz
+xorg-scripts                                 Yaakov Selkowitz
+xorg-server                                  Jon Turney
+xorg-sgml-doctools                           Yaakov Selkowitz
+xorg-util-macros                             Yaakov Selkowitz
+xorg-x11-fonts                               Yaakov Selkowitz
+xpdf                                         Dr. Volker Zell
+xpr                                          Yaakov Selkowitz
+xprop                                        Yaakov Selkowitz
+xproto                                       Yaakov Selkowitz
+xrandr                                       Yaakov Selkowitz
+xrdb                                         Yaakov Selkowitz
+xrefresh                                     Yaakov Selkowitz
+xscope                                       Yaakov Selkowitz
+xset                                         Yaakov Selkowitz
+xsetroot                                     Yaakov Selkowitz
+xsm                                          Yaakov Selkowitz
+xsri                                         ORPHANED (Charles Wilson)
+xstdcmap                                     Yaakov Selkowitz
+xtail                                        Jari Aalto
+xterm                                        Yaakov Selkowitz
+XtoW                                         Jon Turney
+xtrans                                       Yaakov Selkowitz
+xview                                        Jon Turney
+xwd                                          Yaakov Selkowitz
+xwin-xdg-menu                                Jon Turney
+xwininfo                                     Yaakov Selkowitz
+xwinwm                                       Yaakov Selkowitz
+xwud                                         Yaakov Selkowitz
+xz                                           Yaakov Selkowitz
+yakuake                                      Yaakov Selkowitz
+yaml                                         Yaakov Selkowitz
+yasm                                         David Stacey
+yelp                                         Yaakov Selkowitz
+yelp-tools                                   Yaakov Selkowitz
+yelp-xsl                                     Yaakov Selkowitz
+ytree                                        Jari Aalto
+zathura                                      Yaakov Selkowitz
+zathura-cb                                   Yaakov Selkowitz
+zathura-djvu                                 Yaakov Selkowitz
+zathura-pdf-poppler                          Yaakov Selkowitz
+zathura-ps                                   Yaakov Selkowitz
+zeitgeist                                    Yaakov Selkowitz
+zeitgeist-datasources                        Yaakov Selkowitz
+zenity                                       Yaakov Selkowitz
+zinnia                                       Yaakov Selkowitz
+zinnia-tomoe                                 Yaakov Selkowitz
+zip                                          Yaakov Selkowitz
+zlib                                         Yaakov Selkowitz
+znc                                          Alexey Sokolov
+zoo                                          Jari Aalto
+zsh                                          Peter A. Castro
+zsync                                        Jari Aalto
+zziplib                                      Yaakov Selkowitz
+_autorebase                                  Achim Gratz
+_update-info-dir                             ORPHANED
diff --git a/test/testdata/pkglist/expected b/test/testdata/pkglist/expected
new file mode 100644
index 0000000..c9cd92c
--- /dev/null
+++ b/test/testdata/pkglist/expected
@@ -0,0 +1,55 @@
+{'Aaron Schneider': maintainers.Maintainer('Aaron Schneider', [], ['pv']),
+ 'Achim Gratz': maintainers.Maintainer('Achim Gratz', [], ['base-files', 'cloog-isl', 'gmp', 'gnucap', 'groff', 'isl', 'maxima', 'md5deep', 'mosh', 'mpclib', 'mpfr', 'perl', 'perl-Algorithm-Diff', 'perl-Archive-Zip', 'perl-autovivification', 'perl-B-Generate', 'perl-Business-ISBN', 'perl-Business-ISBN-Data', 'perl-Business-ISMN', 'perl-Business-ISSN', 'perl-Capture-Tiny', 'perl-Carp', 'perl-Class-XSAccessor', 'perl-Clone', 'perl-common-sense', 'perl-Compress-Bzip2', 'perl-Config-AutoConf', 'perl-Config-Perl-V', 'perl-Config-Tiny', 'perl-CPAN-Changes', 'perl-CPAN-DistnameInfo', 'perl-CPAN-Meta', 'perl-CPAN-Meta-Check', 'perl-CPAN-Meta-Requirements', 'perl-CPAN-Meta-YAML', 'perl-CPAN-Reporter', 'perl-CPAN-Testers-Report', 'perl-Crypt-OpenSSL-Bignum', 'perl-Crypt-OpenSSL-DSA', 'perl-Crypt-OpenSSL-EC', 'perl-Crypt-OpenSSL-ECDSA', 'perl-Crypt-OpenSSL-Random', 'perl-Crypt-OpenSSL-RSA', 'perl-Data-Alias', 'perl-Data-Compare', 'perl-Data-Diver', 'perl-Data-Dump', 'perl-Data-GUID', 'perl-Data-OptList', 'perl-Data-UUID', 'perl-Date-Simple', 'perl-DBD-mysql', 'perl-DBD-SQLite', 'perl-DBI', 'perl-Devel-Autoflush', 'perl-Devel-Symdump', 'perl-Digest-BubbleBabble', 'perl-Digest-GOST', 'perl-Digest-HMAC', 'perl-Digest-SHA1', 'perl-Encode-EUCJPASCII', 'perl-Encode-HanExtra', 'perl-Encode-ISO2022', 'perl-Encode-JIS0213', 'perl-Encode-JIS2K', 'perl-Encode-Locale', 'perl-Error', 'perl-Exporter-Tiny', 'perl-ExtUtils-CBuilder', 'perl-ExtUtils-Depends', 'perl-ExtUtils-F77', 'perl-ExtUtils-LibBuilder', 'perl-ExtUtils-MakeMaker', 'perl-ExtUtils-PkgConfig', 'perl-File-Copy-Recursive', 'perl-File-Find-HomeDir', 'perl-File-Find-Object', 'perl-File-Find-Object-Rule', 'perl-File-Find-Rule', 'perl-File-Listing', 'perl-File-pushd', 'perl-File-Slurp', 'perl-File-Slurp-Tiny', 'perl-File-Slurp-Unicode', 'perl-File-Which', 'perl-Getopt-ArgvFile', 'perl-gettext', 'perl-HTML-Parser', 'perl-HTML-Tagset', 'perl-HTTP-Cookies', 'perl-HTTP-Daemon', 'perl-HTTP-Date', 'perl-HTTP-Message', 'perl-HTTP-Negotiate', 'perl-inc-latest', 'perl-Inline', 'perl-Inline-Files', 'perl-IO-CaptureOutput', 'perl-IO-HTML', 'perl-IO-Prompt-Tiny', 'perl-IO-Socket-INET6', 'perl-IO-Socket-IP', 'perl-IO-Socket-SSL', 'perl-IO-String', 'perl-IO-Tty', 'perl-IPC-Cmd', 'perl-IPC-Run', 'perl-IPC-Run3', 'perl-JSON', 'perl-JSON-PP', 'perl-JSON-XS', 'perl-libwww-perl', 'perl-List-AllUtils', 'perl-List-MoreUtils', 'perl-Locale-gettext', 'perl-Log-Log4perl', 'perl-LWP-MediaTypes', 'perl-LWP-Protocol-https', 'perl-Metabase-Client-Simple', 'perl-Metabase-Fact', 'perl-MIME-Base32', 'perl-MIME-Charset', 'perl-Module-Build', 'perl-Module-Metadata', 'perl-Module-ScanDeps', 'perl-Module-Signature', 'perl-Mozilla-CA', 'perl-Net-DNS', 'perl-Net-DNS-SEC', 'perl-Net-HTTP', 'perl-Net-IP', 'perl-Net-SSLeay', 'perl-Number-Compare', 'perl-PadWalker', 'perl-PAR', 'perl-PAR-Dist', 'perl-Params-Util', 'perl-Parse-CPAN-Meta', 'perl-Parse-RecDescent', 'perl-Path-Class', 'perl-Pod-Coverage', 'perl-Pod-Escapes', 'perl-Pod-Simple', 'perl-POD2-Base', 'perl-Probe-Perl', 'perl-Proc-ProcessTable', 'perl-Readonly', 'perl-Readonly-XS', 'perl-Regexp-Common', 'perl-Scalar-List-Utils', 'perl-Socket', 'perl-Socket6', 'perl-Spiffy', 'perl-Sub-Exporter', 'perl-Sub-Install', 'perl-Sub-Uplevel', 'perl-Tee', 'perl-Term-ReadKey', 'perl-Term-ReadLine-Gnu', 'perl-Term-ReadLine-Perl', 'perl-TermReadKey', 'perl-Test-Base', 'perl-Test-CPAN-Meta', 'perl-Test-Deep', 'perl-Test-Differences', 'perl-Test-Exception', 'perl-Test-Fatal', 'perl-Test-LeakTrace', 'perl-Test-NoWarnings', 'perl-Test-Pod', 'perl-Test-Pod-Coverage', 'perl-Test-Reporter', 'perl-Test-Reporter-Transport-Metabase', 'perl-Test-Requires', 'perl-Test-Script', 'perl-Test-Simple', 'perl-Test-TrailingSpace', 'perl-Test-Warn', 'perl-Test-Warnings', 'perl-Test-Without-Module', 'perl-Test-YAML', 'perl-Text-BibTeX', 'perl-Text-CharWidth', 'perl-Text-CSV', 'perl-Text-CSV_XS', 'perl-Text-Diff', 'perl-Text-Glob', 'perl-Text-Roman', 'perl-Text-WrapI18N', 'perl-Tie-Cycle', 'perl-TimeDate', 'perl-Try-Tiny', 'perl-Types-Serialiser', 'perl-Unicode-Collate', 'perl-Unicode-GCString', 'perl-Unicode-LineBreak', 'perl-Unicode-Normalize', 'perl-URI', 'perl-Win32', 'perl-WWW-Curl', 'perl-WWW-RobotRules', 'perl-XML-LibXML', 'perl-XML-LibXML-Simple', 'perl-XML-LibXSLT', 'perl-XML-NamespaceSupport', 'perl-XML-Parser', 'perl-XML-SAX', 'perl-XML-SAX-Base', 'perl-XML-SAX-Expat', 'perl-XML-Simple', 'perl-XML-Writer', 'perl-YAML', 'perl-YAML-LibYAML', 'rcs', 'run', 'ucl', 'upx', '_autorebase']),
+ 'Adam Dinwoodie': maintainers.Maintainer('Adam Dinwoodie', [], ['git']),
+ 'Alexey Sokolov': maintainers.Maintainer('Alexey Sokolov', [], ['znc']),
+ 'Andrew Schulman': maintainers.Maintainer('Andrew Schulman', [], ['atool', 'autossh', 'bc', 'discus', 'fish', 'lftp', 'libargp', 'nosleep', 'orpie', 'pinfo', 'ploticus', 'ploticus-doc', 'screen', 'sitecopy', 'sng', 'socat', 'stow', 'stunnel', 'time', 'unison2.27', 'unison2.32', 'unison2.40', 'unison2.45', 'unison2.48']),
+ 'Blooey McFooey': maintainers.Maintainer('Blooey McFooey', [], ['perl-Net-SMTP-SSL', 'testpackage']),
+ 'Bob Heckel': maintainers.Maintainer('Bob Heckel', [], ['libgc', 'w3m']),
+ 'Chris J. Breisch': maintainers.Maintainer('Chris J. Breisch', [], ['man-db']),
+ 'Chris LeBlanc': maintainers.Maintainer('Chris LeBlanc', [], ['python-h5py', 'python3-h5py']),
+ 'Christian Franke': maintainers.Maintainer('Christian Franke', [], ['busybox', 'cdrkit', 'ddrescue', 'hostname', 'isomaster', 'ncdu', 'postfix', 'smartmontools']),
+ 'Christian Kellermann': maintainers.Maintainer('Christian Kellermann', [], ['chicken']),
+ 'Corinna Vinschen': maintainers.Maintainer('Corinna Vinschen', [], ['attr', 'base-cygwin', 'catgets', 'cpio', 'crypt', 'csih', 'cygrunsrv', 'cygwin', 'cygwin-devel', 'editrights', 'email', 'eventlog', 'fetchmail', 'file', 'gawk', 'gdb', 'getent', 'ipc-utils', 'libedit', 'login', 'lynx', 'mt', 'nc', 'nc6', 'openssh', 'openssl', 'patch', 'pl', 'psmisc', 'rebase', 'recode', 'rlwrap', 'rng-tools', 'robots', 'sed', 'ssmtp', 'syslog-ng', 'tcsh', 'tin', 'tzcode', 'windows-default-manifest', 'xinetd']),
+ 'Damien Doligez': maintainers.Maintainer('Damien Doligez', [], ['ocaml']),
+ 'Daniel Boland': maintainers.Maintainer('Daniel Boland', [], ['libfakesu', 'procmail', 'sendmail']),
+ 'Dave Kilroy': maintainers.Maintainer('Dave Kilroy', [], ['chere']),
+ 'David Levine': maintainers.Maintainer('David Levine', [], ['nmh', 'par']),
+ 'David Rothenberger': maintainers.Maintainer('David Rothenberger', [], ['cyrus-sasl', 'flac', 'git-review', 'libao', 'libapr1', 'libaprutil1', 'libkate', 'libogg', 'librsync', 'libtheora', 'libvorbis', 'net-snmp', 'pdftk', 'rdiff-backup', 'scons', 'serf', 'speex', 'subversion', 'svn_load_dirs', 'vorbis-tools', 'which', 'whois']),
+ 'David Stacey': maintainers.Maintainer('David Stacey', [], ['AtomicParsley', 'cppcheck', 'doxygen', 'foobillard', 'icoutils', 'keepassx', 'libebml', 'libmatroska', 'mkvtoolnix', 'mscgen', 'ninvaders', 'perl-Text-CSV', 'perl-Text-CSV_XS', 'poco', 'pugixml', 'tinyxml2', 'xloadimage', 'xmlstarlet', 'yasm']),
+ 'Dean Scarff': maintainers.Maintainer('Dean Scarff', [], ['nasm']),
+ 'Dr. Volker Zell': maintainers.Maintainer('Dr. Volker Zell', [], ['aalib', 'aspell', 'aspell-de', 'aspell-en', 'aspell-pl', 'aspell-sv', 'balance', 'bsflite', 'cadaver', 'compface', 'db', 'db4.5', 'db4.8', 'enscript', 'freeglut', 'gd', 'ghostscript', 'ghostscript-fonts-other', 'ghostscript-fonts-std', 'gnubg', 'gnuplot', 'gnutls', 'gq', 'gv', 'hp2xx', 'httperf', 'initscripts', 'jasper', 'jgraph', 'lcms', 'lcms2', 'libdiscid', 'libEMF', 'libfpx', 'libidn', 'liblzo2', 'libmcrypt', 'libmng', 'libsmi', 'libtasn1', 'libwmf', 'lzo2', 'mcrypt', 'ming', 'multitail', 'neon', 'nettle', 'opencdk', 'openldap', 'pakchois', 'picard', 'pstoedit', 'python-discid', 'python-mutagen', 'squid', 'sysvinit', 't1lib', 'tcm', 'ted', 'texi2html', 'transfig', 'uw-imap', 'WordNet', 'xclip', 'xemacs', 'xemacs-mule-sumo', 'xemacs-sumo', 'xfig', 'XmHTML', 'xpdf']),
+ 'Eric Blake': maintainers.Maintainer('Eric Blake', [], ['bash', 'bash-completion', 'bashdb', 'bison', 'coreutils', 'cppi', 'cvsutils', 'dash', 'diffstat', 'diffutils', 'findutils', 'gperf', 'grep', 'gzip', 'libsigsegv', 'm4', 'patchutils', 'readline', 'sharutils', 'tar', 'wget']),
+ 'Erwin Waterlander': maintainers.Maintainer('Erwin Waterlander', [], ['dos2unix', 'libpipeline', 'libunistring']),
+ 'Federico Hernandez': maintainers.Maintainer('Federico Hernandez', [], ['task']),
+ 'Frank Fesevur': maintainers.Maintainer('Frank Fesevur', [], ['shutdown']),
+ 'Gernot Hillier': maintainers.Maintainer('Gernot Hillier', [], ['tftp']),
+ 'Jan Nijtmans': maintainers.Maintainer('Jan Nijtmans', [], ['sqlite3']),
+ 'Jari Aalto': maintainers.Maintainer('Jari Aalto', [], ['abook', 'aewm++', 'aewm++-goodies', 'afio', 'annoyance-filter', 'antiword', 'apng2gif', 'apngasm', 'apngdis', 'apngopt', 'apngtools', 'arc', 'archivemail', 'arj', 'aview', 'bcrypt', 'bmp2png', 'bool', 'boxes', 'bsfilter', 'bvi', 'bzr', 'cccc', 'cdargs', 'cfget', 'cfourcc', 'cfv', 'cgdb', 'checkbashisms', 'chewmail', 'chkconfig', 'code2html', 'codeville', 'colorgcc', 'convmv', 'copyright-update', 'corkscrew', 'cscope', 'ctorrent', 'ddir', 'delta', 'deroff', 'dhttpd', 'dog', 'duff', 'epstool', 'fcrackzip', 'fdupes', 'figlet', 'flawfinder', 'flip', 'flog', 'fossil', 'getmail', 'gif2apng', 'git-oodiff', 'greed', 'grepmail', 'gt5', 'guilt', 'httping', 'httptunnel', 'ifile', 'ii', 'indent', 'integrit', 'ipcalc', 'iprint', 'iselect', 'jlint', 'joe', 'keychain', 'kgb', 'lcab', 'licensecheck', 'linklint', 'links', 'lv', 'lzop', 'mairix', 'makepasswd', 'makeself', 'mboxcheck', 'mercurial', 'micro-httpd', 'mmv', 'most', 'msmtp', 'ncftp', 'newmail', 'nrss', 'nttcp', 'odt2txt', 'offlineimap', 'ogmtools', 'oodiff', 'optipng', 'outguess', 'patcher', 'pax', 'pngcheck', 'pngcrush', 'pngquant', 'posh', 'potrace', 'pristine-tar', 'pscan', 'pstotext', 'pwgen', 'pwget', 'pylint', 'python-crypto', 'python-feedparser', 'python-logilab-astng', 'python-logilab-common', 'python-paramiko', 'qiv', 'qsf', 'quilt', 'rats', 'rc', 'rdtool', 'renameutils', 'renattach', 'rsnapshot', 'rsync', 'rtf2html-htdig', 'rxp', 'rzip', 'sendxmpp', 'sgrep', 'shed', 'sic', 'signify', 'since', 'spambayes', 'spamoracle', 'splint', 'splitpatch', 'steghide', 'stgit', 'suck', 'sudoku', 'svn-load', 'symlinks', 'tailor', 'tig', 'tinyirc', 'tirc', 'tnef', 'tnftp', 'tree', 'ttcp', 'txt2regex', 'unace', 'unalz', 'unifdef', 'unrtf', 'untex', 'urlgrabber', 'vfu', 'wcd', 'wdiff', 'webcheck', 'wiggle', 'wput', 'xgraph', 'xlhtml', 'xlsx2csv', 'xtail', 'ytree', 'zoo', 'zsync']),
+ 'Joel Johnson': maintainers.Maintainer('Joel Johnson', [], ['iperf']),
+ 'Jon Turney': maintainers.Maintainer('Jon Turney', ['jon@invalid.local'], ['buildbot-slave', 'cygwin-doc', 'cygwin-x-doc', 'ddd', 'dmalloc', 'font-bitstream-vera-ttf', 'gdb', 'google-breakpad', 'khronos-opengl-registry', 'libxcwm', 'mingw64-i686-google-breakpad', 'mingw64-x86_64-google-breakpad', 'xlaunch', 'xmon', 'xorg-server', 'XtoW', 'xview', 'xwin-xdg-menu']),
+ 'Jonathan Yong': maintainers.Maintainer('Jonathan Yong', [], ['binutils', 'gcc', 'gendef', 'libmangle', 'lzip', 'lziprecover', 'mingw64-i686-binutils', 'mingw64-i686-gcc', 'mingw64-i686-headers', 'mingw64-i686-pthreads', 'mingw64-i686-runtime', 'mingw64-i686-windows-default-manifest', 'mingw64-i686-winpthreads', 'mingw64-x86_64-binutils', 'mingw64-x86_64-gcc', 'mingw64-x86_64-headers', 'mingw64-x86_64-pthreads', 'mingw64-x86_64-runtime', 'mingw64-x86_64-windows-default-manifest', 'mingw64-x86_64-winpthreads', 'w32api-headers', 'w32api-runtime']),
+ 'Jorge Díaz': maintainers.Maintainer('Jorge Díaz', [], ['varnish']),
+ 'Ken Brown': maintainers.Maintainer('Ken Brown', [], ['asymptote', 'biber', 'bzr-fastimport', 'clisp', 'emacs', 'emacs-auctex', 'fcgi', 'ffcall', 'icu', 'perl-autovivification', 'perl-Business-ISBN', 'perl-Business-ISBN-Data', 'perl-Business-ISMN', 'perl-Business-ISSN', 'perl-Capture-Tiny', 'perl-Config-AutoConf', 'perl-Data-Compare', 'perl-Data-Diver', 'perl-Data-Dump', 'perl-Date-Simple', 'perl-Encode-EUCJPASCII', 'perl-Encode-HanExtra', 'perl-Encode-JIS2K', 'perl-ExtUtils-LibBuilder', 'perl-File-Find-Rule', 'perl-File-Slurp', 'perl-File-Slurp-Unicode', 'perl-IO-HTML', 'perl-IPC-Run3', 'perl-List-AllUtils', 'perl-List-MoreUtils', 'perl-Log-Log4perl', 'perl-LWP-Protocol-https', 'perl-MIME-Charset', 'perl-Mozilla-CA', 'perl-Number-Compare', 'perl-Readonly', 'perl-Readonly-XS', 'perl-Regexp-Common', 'perl-Text-BibTeX', 'perl-Text-Glob', 'perl-Text-Roman', 'perl-Tie-Cycle', 'perl-Unicode-Collate', 'perl-Unicode-GCString', 'perl-Unicode-LineBreak', 'perl-Unicode-Normalize', 'perl-XML-LibXML-Simple', 'perl-XML-LibXSLT', 'perl-XML-Writer', 'python-fastimport', 'svm', 'texinfo', 'texlive', 'texlive-collection-basic', 'texlive-collection-basic-doc', 'texlive-collection-bibtexextra', 'texlive-collection-bibtexextra-doc', 'texlive-collection-binextra', 'texlive-collection-binextra-doc', 'texlive-collection-context', 'texlive-collection-context-doc', 'texlive-collection-fontsextra', 'texlive-collection-fontsextra-doc', 'texlive-collection-fontsrecommended', 'texlive-collection-fontsrecommended-doc', 'texlive-collection-fontutils', 'texlive-collection-fontutils-doc', 'texlive-collection-formatsextra', 'texlive-collection-games', 'texlive-collection-genericextra', 'texlive-collection-genericextra-doc', 'texlive-collection-genericrecommended', 'texlive-collection-genericrecommended-doc', 'texlive-collection-htmlxml', 'texlive-collection-humanities', 'texlive-collection-humanities-doc', 'texlive-collection-langafrican', 'texlive-collection-langarabic', 'texlive-collection-langchinese', 'texlive-collection-langcjk', 'texlive-collection-langcyrillic', 'texlive-collection-langczechslovak', 'texlive-collection-langenglish', 'texlive-collection-langeuropean', 'texlive-collection-langfrench', 'texlive-collection-langgerman', 'texlive-collection-langgreek', 'texlive-collection-langindic', 'texlive-collection-langitalian', 'texlive-collection-langjapanese', 'texlive-collection-langkorean', 'texlive-collection-langother', 'texlive-collection-langpolish', 'texlive-collection-langportuguese', 'texlive-collection-langspanish', 'texlive-collection-latex', 'texlive-collection-latex-doc', 'texlive-collection-latexextra', 'texlive-collection-latexextra-doc', 'texlive-collection-latexrecommended', 'texlive-collection-latexrecommended-doc', 'texlive-collection-luatex', 'texlive-collection-luatex-doc', 'texlive-collection-mathextra', 'texlive-collection-mathextra-doc', 'texlive-collection-metapost', 'texlive-collection-metapost-doc', 'texlive-collection-music', 'texlive-collection-music-doc', 'texlive-collection-omega', 'texlive-collection-pictures', 'texlive-collection-pictures-doc', 'texlive-collection-plainextra', 'texlive-collection-pstricks', 'texlive-collection-pstricks-doc', 'texlive-collection-publishers', 'texlive-collection-publishers-doc', 'texlive-collection-science', 'texlive-collection-science-doc', 'texlive-collection-xetex', 'texlive-collection-xetex-doc']),
+ 'Klaus Grue': maintainers.Maintainer('Klaus Grue', [], ['logiweb']),
+ 'Marco Atzeri': maintainers.Maintainer('Marco Atzeri', [], ['4ti2', 'amd', 'arpack', 'autotrace', 'bsdiff', 'btf', 'camd', 'catdoc', 'ccolamd', 'ccrypt', 'cddlib', 'cholmod', 'colamd', 'connect-proxy', 'CUnit', 'cvs', 'cxsparse', 'ed', 'fftw3', 'flint', 'gl2ps', 'glpk', 'gnupg', 'GraphicsMagick', 'guile', 'hdf5', 'hwloc', 'ImageMagick', 'irssi', 'klu', 'lapack', 'ldl', 'leptonica', 'less', 'libgeotiff', 'libtorrent', 'lilypond', 'lyx', 'make', 'mc', 'metis', 'mutt', 'netcdf', 'netcdf-cxx4', 'netcdf-fortran', 'ngspice', 'ntl', 'octave', 'octave-bim', 'octave-cgi', 'octave-communications', 'octave-control', 'octave-data-smoothing', 'octave-database', 'octave-dataframe', 'octave-divand', 'octave-doctest', 'octave-econometrics', 'octave-financial', 'octave-fl-core', 'octave-fpl', 'octave-fuzzy-logic-toolkit', 'octave-ga', 'octave-general', 'octave-generate_html', 'octave-geometry', 'octave-image', 'octave-instrument-control', 'octave-integration', 'octave-interval', 'octave-io', 'octave-level-set', 'octave-linear-algebra', 'octave-lssa', 'octave-ltfat', 'octave-mapping', 'octave-mechanics', 'octave-miscellaneous', 'octave-mpi', 'octave-msh', 'octave-mvn', 'octave-nan', 'octave-ncarray', 'octave-netcdf', 'octave-nurbs', 'octave-ocs', 'octave-octcdf', 'octave-octclip', 'octave-octproj', 'octave-odepkg', 'octave-optics', 'octave-optim', 'octave-optiminterp', 'octave-parallel', 'octave-quaternion', 'octave-queueing', 'octave-secs1d', 'octave-secs2d', 'octave-secs3d', 'octave-signal', 'octave-sockets', 'octave-specfun', 'octave-splines', 'octave-statistics', 'octave-stk', 'octave-strings', 'octave-struct', 'octave-tisean', 'octave-tsa', 'octave-vrml', 'onig', 'openblas', 'openmpi', 'pbzip2', 'ping', 'plotutils', 'postgresql', 'proj', 'pure-ftpd', 'qhull', 'qrupdate', 'R', 'rbio', 'rtorrent', 'singular', 'slang', 'slrn', 'spqr', 'suitesparseconfig', 'surf', 'tesseract-ocr', 'TeXmacs', 'udunits', 'umfpack', 'xdelta', 'xdelta3']),
+ 'Marcos Vives Del Sol': maintainers.Maintainer('Marcos Vives Del Sol', [], ['libnfc']),
+ 'Mark Hessling': maintainers.Maintainer('Mark Hessling', [], ['regina-rexx']),
+ 'Michael Wild': maintainers.Maintainer('Michael Wild', [], ['ssh-pageant', 'tmux']),
+ 'Mike DePaulo': maintainers.Maintainer('Mike DePaulo', [], ['gtkperf']),
+ 'Mikhail Usenko': maintainers.Maintainer('Mikhail Usenko', [], ['cygcheck-dep']),
+ 'ORPHANED': maintainers.Maintainer('ORPHANED', [], ['alternatives', 'aria2', 'asciidoc', 'astyle', 'autobuild', 'byacc', 'ccache', 'ccdoc', 'cgoban', 'colordiff', 'cramfs', 'ctris', 'cvsps', 'cygutils', 'distcc', 'flex', 'gaffitter', 'gcc-tools-epoch1-autoconf', 'gcc-tools-epoch1-automake', 'gcc-tools-epoch2-autoconf', 'gcc-tools-epoch2-automake', 'gnugo', 'googlecl', 'gsl', 'hdparm', 'hexedit', 'inetutils', 'ioperm', 'libassuan', 'libksba', 'libtextcat', 'libustr', 'libXpm-noX', 'maradns', 'mathomatic', 'mhash', 'mingw-binutils', 'mingw-bzip2', 'mingw-gcc', 'mingw-libgcrypt', 'mingw-libgpg-error', 'mingw-pthreads', 'mingw-runtime', 'mingw-w32api', 'mingw-xz', 'mingw-zlib', 'mksh', 'mtd', 'naim', 'nfrotz', 'nfs-server', 'pal', 'pinentry', 'popt', 'protobuf', 'pth', 'python-backports.ssl_match_hostname', 'python-gdata', 'rsh', 'run2', 'rxvt', 'scsh', 'sunrpc', 'tack', 'tcp_wrappers', 'typespeed', 'ucspi-tcp', 'units', 'wtf', 'xsri', '_update-info-dir']),
+ 'Pavel Fedin': maintainers.Maintainer('Pavel Fedin', [], ['onc-rpc-devel', 'rpcbind', 'rpm']),
+ 'Peter A. Castro': maintainers.Maintainer('Peter A. Castro', [], ['suite3270', 'zsh']),
+ 'Peter Rosin': maintainers.Maintainer('Peter Rosin', [], ['libggi2', 'libggimisc2', 'libggiwmh0', 'libgii1']),
+ 'Pierre A. Humblet': maintainers.Maintainer('Pierre A. Humblet', [], ['cron', 'exim']),
+ 'Sebastien Helleu': maintainers.Maintainer('Sebastien Helleu', [], ['weechat']),
+ 'Serge Lamikhov-Center': maintainers.Maintainer('Serge Lamikhov-Center', [], ['ELFIO']),
+ 'Stuart Caie': maintainers.Maintainer('Stuart Caie', [], ['cabextract']),
+ 'Thomas Wolff': maintainers.Maintainer('Thomas Wolff', [], ['algol68g', 'mined', 'mintty']),
+ 'Tony Kelman': maintainers.Maintainer('Tony Kelman', [], ['cmake', 'p7zip', 'python-docutils', 'python-jinja2', 'python-sphinx']),
+ 'Warren Young': maintainers.Maintainer('Warren Young', [], ['ctags', 'expat']),
+ 'Wei-Ren Chen': maintainers.Maintainer('Wei-Ren Chen', [], ['hidapi', 'mingw64-i686-hidapi', 'mingw64-x86_64-hidapi']),
+ 'William A. Hoffman': maintainers.Maintainer('William A. Hoffman', [], ['cmake']),
+ 'Yaakov Selkowitz': maintainers.Maintainer('Yaakov Selkowitz', [], ['a2ps', 'accerciser', 'activity-log-manager', 'adobe-source-code-pro-fonts', 'adobe-source-sans-pro-fonts', 'adobe-source-serif-pro-fonts', 'adwaita-icon-theme', 'akonadi', 'alacarte', 'alef-fonts', 'amor', 'analitza', 'anjuta', 'anthy', 'appdata-tools', 'appres', 'appstream-glib', 'ark', 'artwiz-aleczapka-fonts', 'ascii', 'at-spi2-atk', 'at-spi2-core', 'atk1.0', 'atkmm1.6', 'atril', 'attica', 'audiofile', 'autoconf', 'autoconf-archive', 'autoconf2.1', 'autoconf2.5', 'autogen', 'automake', 'automake1.10', 'automake1.11', 'automake1.12', 'automake1.13', 'automake1.14', 'automake1.15', 'automake1.4', 'automake1.5', 'automake1.6', 'automake1.7', 'automake1.8', 'automake1.9', 'automoc4', 'avahi', 'baloo', 'baloo-widgets', 'baobab', 'bdftopcf', 'beforelight', 'bigreqsproto', 'bind', 'bitmap', 'blinken', 'bogofilter', 'bomber', 'boost', 'botan1.10', 'bovo', 'build-docbook-catalog', 'bzip2', 'ca-certificates', 'cairo', 'cairomm1.0', 'caja', 'caja-actions', 'caja-extensions', 'caja-follow-symlink', 'caja-python', 'cantarell-fonts', 'cantor', 'caribou', 'celt051', 'check', 'choqok', 'clamav', 'cln', 'clutter-gtk0.10', 'clutter-gtk1.0', 'clutter1.0', 'cocom', 'cogl', 'compositeproto', 'connectagram', 'corebird', 'cpio', 'cppunit', 'culmus-fonts', 'curl', 'cutemaze', 'cvs2svn', 'cygport', 'cygwin', 'cygwin32', 'cygwin32-binutils', 'cygwin32-bzip2', 'cygwin32-catgets', 'cygwin32-clang', 'cygwin32-cloog-isl', 'cygwin32-crypt', 'cygwin32-default-manifest', 'cygwin32-expat', 'cygwin32-freetype2', 'cygwin32-gcc', 'cygwin32-gettext', 'cygwin32-gmp', 'cygwin32-gnutls', 'cygwin32-isl', 'cygwin32-jbigkit', 'cygwin32-libbfd', 'cygwin32-libedit', 'cygwin32-libffi', 'cygwin32-libiconv', 'cygwin32-libmpc', 'cygwin32-libpng', 'cygwin32-libtasn1', 'cygwin32-libtool', 'cygwin32-libX11', 'cygwin32-libXau', 'cygwin32-libxcb', 'cygwin32-libXdmcp', 'cygwin32-lzo2', 'cygwin32-mpfr', 'cygwin32-ncurses', 'cygwin32-nettle', 'cygwin32-openssl', 'cygwin32-p11-kit', 'cygwin32-pcre', 'cygwin32-pkg-config', 'cygwin32-readline', 'cygwin32-w32api-headers', 'cygwin32-w32api-runtime', 'cygwin32-xproto', 'cygwin32-zlib', 'cygwin64', 'cygwin64-binutils', 'cygwin64-bzip2', 'cygwin64-catgets', 'cygwin64-clang', 'cygwin64-cloog-isl', 'cygwin64-crypt', 'cygwin64-db', 'cygwin64-default-manifest', 'cygwin64-e2fsprogs', 'cygwin64-expat', 'cygwin64-fontconfig', 'cygwin64-freetype2', 'cygwin64-gcc', 'cygwin64-gdbm', 'cygwin64-gettext', 'cygwin64-gmp', 'cygwin64-gnutls', 'cygwin64-isl', 'cygwin64-jbigkit', 'cygwin64-libarchive', 'cygwin64-libbfd', 'cygwin64-libdmx', 'cygwin64-libedit', 'cygwin64-libffi', 'cygwin64-libfontenc', 'cygwin64-libgcrypt', 'cygwin64-libgpg-error', 'cygwin64-libICE', 'cygwin64-libiconv', 'cygwin64-libjpeg-turbo', 'cygwin64-libmagic', 'cygwin64-libmpc', 'cygwin64-libpng', 'cygwin64-libSM', 'cygwin64-libssh2', 'cygwin64-libtasn1', 'cygwin64-libtool', 'cygwin64-libX11', 'cygwin64-libXau', 'cygwin64-libXaw', 'cygwin64-libxcb', 'cygwin64-libXcomposite', 'cygwin64-libXdamage', 'cygwin64-libXdmcp', 'cygwin64-libXext', 'cygwin64-libXfixes', 'cygwin64-libXft', 'cygwin64-libXi', 'cygwin64-libxml2', 'cygwin64-libXmu', 'cygwin64-libXpm', 'cygwin64-libXrandr', 'cygwin64-libXrender', 'cygwin64-libxslt', 'cygwin64-libXss', 'cygwin64-libXt', 'cygwin64-lzo2', 'cygwin64-mpfr', 'cygwin64-ncurses', 'cygwin64-nettle', 'cygwin64-openssl', 'cygwin64-p11-kit', 'cygwin64-pcre', 'cygwin64-pixman', 'cygwin64-pkg-config', 'cygwin64-popt', 'cygwin64-python', 'cygwin64-readline', 'cygwin64-sqlite3', 'cygwin64-tcl', 'cygwin64-tiff', 'cygwin64-tk', 'cygwin64-util-linux', 'cygwin64-w32api-headers', 'cygwin64-w32api-runtime', 'cygwin64-xcb-util', 'cygwin64-xcb-util-image', 'cygwin64-xcb-util-wm', 'cygwin64-xproto', 'cygwin64-zlib', 'damageproto', 'dblatex', 'dbus', 'dbus-glib', 'dconf', 'dejagnu', 'dejavu-fonts', 'desktop-file-utils', 'devhelp', 'dialog', 'djvulibre', 'dmtx-utils', 'dmxproto', 'docbook-dsssl', 'docbook-sgml30', 'docbook-sgml31', 'docbook-sgml40', 'docbook-sgml41', 'docbook-sgml42', 'docbook-sgml43', 'docbook-sgml44', 'docbook-sgml45', 'docbook-utils', 'docbook-xml-simple10', 'docbook-xml-simple11', 'docbook-xml412', 'docbook-xml42', 'docbook-xml43', 'docbook-xml44', 'docbook-xml45', 'docbook-xsl', 'docbook-xsl-ns', 'docbook2X', 'e2fsimage', 'e2fsprogs', 'ebook-tools', 'editres', 'eekboard', 'eigen3', 'empathy', 'enchant', 'engrampa', 'eog', 'eog-plugins', 'eom', 'epiphany', 'esound', 'evince', 'evolution', 'evolution-data-server', 'evolution-ews', 'exempi', 'exif', 'exiv2', 'exo', 'expect', 'extra-cmake-modules', 'faience-icon-theme', 'farstream0.2', 'fbpanel', 'fbxkb', 'file', 'file-roller', 'five-or-more', 'fixesproto', 'flexdll', 'fltk', 'fluidsynth', 'focuswriter', 'folks', 'font-util', 'fontconfig', 'fontforge', 'fontsproto', 'fonttosfnt', 'four-in-a-row', 'freerdp', 'freetds', 'freetype2', 'fribidi', 'fslsfonts', 'fstobdf', 'fvwm', 'gamin', 'garcon', 'gccmakedep', 'GConf2', 'gconfmm2.6', 'gcr', 'gdb', 'gdbm', 'gdk-pixbuf2.0', 'gdl3', 'gedit', 'gedit-code-assistance', 'gedit-plugins', 'geoclue', 'geocode-glib', 'GeoIP', 'GeoIP-database', 'gettext', 'giflib', 'gigolo', 'girara', 'glade', 'glade2', 'glade3', 'gle', 'glew', 'glib1.2', 'glib2.0', 'glib2.0-networking', 'glibmm2.4', 'glproto', 'glu', 'glw', 'gmime2.6', 'gnome-activity-journal', 'gnome-applets', 'gnome-backgrounds', 'gnome-calculator', 'gnome-chess', 'gnome-clocks', 'gnome-code-assistance', 'gnome-common', 'gnome-contacts', 'gnome-control-center', 'gnome-desktop', 'gnome-devel-docs', 'gnome-dictionary', 'gnome-doc-utils', 'gnome-flashback', 'gnome-font-viewer', 'gnome-getting-started-docs', 'gnome-icon-theme', 'gnome-keyring', 'gnome-klotski', 'gnome-mahjongg', 'gnome-menus', 'gnome-mime-data', 'gnome-mines', 'gnome-nibbles', 'gnome-online-accounts', 'gnome-panel', 'gnome-python', 'gnome-python-desktop', 'gnome-python-extras', 'gnome-robots', 'gnome-screenshot', 'gnome-session', 'gnome-settings-daemon', 'gnome-sudoku', 'gnome-system-log', 'gnome-system-monitor', 'gnome-terminal', 'gnome-tetravex', 'gnome-themes-standard', 'gnome-tweak-tool', 'gnome-user-docs', 'gnome-vfs2', 'gnome-vfsmm2.6', 'gnu-free-fonts', 'gnuchess', 'gob2', 'gobject-introspection', 'goffice0.10', 'goffice0.8', 'gom', 'goocanvas', 'goocanvas2.0', 'goocanvasmm2.0', 'gottet', 'gpgme', 'gpicview', 'grace', 'granatier', 'graphite2', 'graphviz', 'grilo0.2', 'grilo0.2-plugins', 'gsettings-desktop-schemas', 'gsm', 'gstreamer0.10', 'gstreamer0.10-plugins-base', 'gstreamer0.10-plugins-good', 'gstreamer1.0', 'gstreamer1.0-plugins-base', 'gstreamer1.0-plugins-good', 'gt', 'gtk-doc', 'gtk-vnc', 'gtk1.2', 'gtk1.2-engines', 'gtk2.0', 'gtk2.0-engines', 'gtk2.0-engines-murrine', 'gtk2.0-engines-smooth', 'gtk3', 'gtk3-engines-unico', 'gtkglarea2.0', 'gtkglext1.0', 'gtkhtml4.0', 'gtkmm2.4', 'gtkmm3.0', 'gtksourceview2.0', 'gtksourceview3.0', 'gtksourceviewmm2.0', 'gtksourceviewmm3.0', 'gtkspell', 'gtkspell3', 'gts', 'gtypist', 'gucharmap', 'gvfs', 'harfbuzz', 'help2man', 'hexalate', 'hexchat', 'hicolor-icon-theme', 'highlight', 'hitori', 'html2ps', 'httpd', 'hunspell', 'iagno', 'ibus', 'ibus-anthy', 'ibus-chewing', 'ibus-gucharmap', 'ibus-handwrite', 'ibus-hangul', 'ibus-input-pad', 'ibus-kkc', 'ibus-m17n', 'ibus-pinyin', 'ibus-qt', 'ibus-skk', 'ibus-unikey', 'ibus-xkb', 'iceauth', 'ico', 'icon-naming-utils', 'ilmbase', 'im-chooser', 'imake', 'imlib', 'imlib2', 'imsettings', 'inconsolata-fonts', 'input-pad', 'inputproto', 'intltool', 'iso-codes', 'itstool', 'jbigkit', 'js185', 'json-c', 'json-glib1.0', 'kactivities', 'kajongg', 'kalgebra', 'kalzium', 'kanagram', 'kanjistrokeorders-fonts', 'kapman', 'kapow', 'kasumi', 'kate', 'kate4', 'katomic', 'kblackbox', 'kblocks', 'kbounce', 'kbproto', 'kbrickbuster', 'kbruch', 'kcalc', 'kcharselect', 'kde-base-artwork', 'kde-baseapps', 'kde-l10n-ar', 'kde-l10n-bg', 'kde-l10n-bs', 'kde-l10n-ca', 'kde-l10n-ca-valencia', 'kde-l10n-cs', 'kde-l10n-da', 'kde-l10n-de', 'kde-l10n-el', 'kde-l10n-en_GB', 'kde-l10n-es', 'kde-l10n-et', 'kde-l10n-eu', 'kde-l10n-fa', 'kde-l10n-fi', 'kde-l10n-fr', 'kde-l10n-ga', 'kde-l10n-gl', 'kde-l10n-he', 'kde-l10n-hi', 'kde-l10n-hr', 'kde-l10n-hu', 'kde-l10n-ia', 'kde-l10n-id', 'kde-l10n-is', 'kde-l10n-it', 'kde-l10n-ja', 'kde-l10n-kk', 'kde-l10n-km', 'kde-l10n-kn', 'kde-l10n-ko', 'kde-l10n-lt', 'kde-l10n-lv', 'kde-l10n-mr', 'kde-l10n-nb', 'kde-l10n-nds', 'kde-l10n-nl', 'kde-l10n-nn', 'kde-l10n-pa', 'kde-l10n-pl', 'kde-l10n-pt', 'kde-l10n-pt_BR', 'kde-l10n-ro', 'kde-l10n-ru', 'kde-l10n-si', 'kde-l10n-sk', 'kde-l10n-sl', 'kde-l10n-sr', 'kde-l10n-sv', 'kde-l10n-tg', 'kde-l10n-th', 'kde-l10n-tr', 'kde-l10n-ug', 'kde-l10n-uk', 'kde-l10n-vi', 'kde-l10n-wa', 'kde-l10n-zh_CN', 'kde-l10n-zh_TW', 'kde-runtime', 'kde-wallpapers', 'kde-workspace', 'kdeedu-data', 'kdegraphics-mobipocket', 'kdelibs', 'kdepimlibs', 'kdewebdev', 'kdf', 'kdiamond', 'kf5-attica', 'kf5-frameworkintegration', 'kf5-kactivities', 'kf5-kapidox', 'kf5-karchive', 'kf5-kauth', 'kf5-kbookmarks', 'kf5-kcmutils', 'kf5-kcodecs', 'kf5-kcompletion', 'kf5-kconfig', 'kf5-kconfigwidgets', 'kf5-kcoreaddons', 'kf5-kcrash', 'kf5-kdbusaddons', 'kf5-kdeclarative', 'kf5-kded', 'kf5-kdelibs4support', 'kf5-kdesignerplugin', 'kf5-kdewebkit', 'kf5-kdnssd', 'kf5-kdoctools', 'kf5-kemoticons', 'kf5-kglobalaccel', 'kf5-kguiaddons', 'kf5-khtml', 'kf5-ki18n', 'kf5-kiconthemes', 'kf5-kidletime', 'kf5-kimageformats', 'kf5-kinit', 'kf5-kio', 'kf5-kitemmodels', 'kf5-kitemviews', 'kf5-kjobwidgets', 'kf5-kjs', 'kf5-kjsembed', 'kf5-kmediaplayer', 'kf5-knewstuff', 'kf5-knotifications', 'kf5-knotifyconfig', 'kf5-kpackage', 'kf5-kparts', 'kf5-kpeople', 'kf5-kplotting', 'kf5-kpty', 'kf5-kross', 'kf5-kross-interpreters', 'kf5-krunner', 'kf5-kservice', 'kf5-ktexteditor', 'kf5-ktextwidgets', 'kf5-kunitconversion', 'kf5-kwallet', 'kf5-kwidgetsaddons', 'kf5-kwindowsystem', 'kf5-kxmlgui', 'kf5-kxmlrpcclient', 'kf5-libkdegames', 'kf5-libkmahjongg', 'kf5-plasma', 'kf5-solid', 'kf5-sonnet', 'kf5-threadweaver', 'kfilemetadata', 'kfourinline', 'kgeography', 'kget', 'kgoldrunner', 'kgpg', 'khangman', 'kig', 'kigo', 'killbots', 'kiriki', 'kiten', 'kjumpingcube', 'klavaro', 'klettres', 'klickety', 'klines', 'kmahjongg', 'kmines', 'kmplot', 'knavalbattle', 'knetwalk', 'kolf', 'kollision', 'konquest', 'konsole', 'konsole4', 'konversation', 'kpat', 'krb5', 'krb5-auth-dialog', 'krdc', 'kreversi', 'krfb', 'kshisen', 'ksirk', 'ksnakeduel', 'kspaceduel', 'ksquares', 'kstars', 'ksudoku', 'ksystemlog', 'kteatime', 'ktimer', 'ktorrent', 'ktouch', 'ktuberling', 'kturtle', 'kubrick', 'kwalletmanager', 'kwebkitpart', 'kwordquiz', 'lasem0.4', 'leafpad', 'libarchive', 'libart_lgpl_2', 'libasyncns', 'libbonobo2', 'libbonoboui2', 'libcaca', 'libcanberra', 'libchamplain0.12', 'libchewing', 'libcroco0.6', 'libdaemon', 'libdatrie', 'libdbusmenu-qt', 'libdbusmenu-qt5', 'libdmapsharing3.0', 'libdmtx', 'libdmx', 'libdv', 'libelf', 'libepoxy', 'liberation-fonts', 'libesmtp', 'libevent', 'libexif', 'libffi', 'libfm', 'libfontenc', 'libFS', 'libgcrypt', 'libgda5.0', 'libgdamm5.0', 'libgdata', 'libgee', 'libgee0.8', 'libgit2', 'libgit2-glib1.0', 'libglade2.0', 'libglademm2.4', 'libgnome-keyring', 'libgnome2', 'libgnomecanvas2', 'libgnomecanvasmm2.6', 'libgnomekbd', 'libgnomemm2.6', 'libgnomeui2', 'libgnomeuimm2.6', 'libgpg-error', 'libgsf', 'libgtop2.0', 'libgucharmap', 'libgweather', 'libgxps', 'libhangul', 'libical', 'libICE', 'libiconv', 'libid3tag', 'libIDL2', 'libiodbc', 'libjpeg-turbo', 'libkdeedu', 'libkdegames', 'libkeduvocdocument', 'libkkc', 'libkkc-data', 'libkmahjongg', 'libktorrent', 'libLASi', 'liblqr1', 'libmatekbd', 'libmateweather', 'libmediaart1.0', 'libmetalink', 'libmikmod', 'libmodplug', 'libmspack', 'libnice', 'libnotify', 'liboauth', 'libotf', 'libpaper', 'libpeas', 'libpng', 'libpng10', 'libpng12', 'libpng14', 'libpng15', 'libproxy', 'libpst', 'libqalculate', 'libquvi0.9', 'libquvi0.9-scripts', 'libqzeitgeist', 'librest0.7', 'librsvg2', 'libsamplerate', 'libsecret1', 'libshout', 'libsigc2.0', 'libskk', 'libSM', 'libsndfile', 'libsoup2.4', 'libspectre', 'libspiro', 'libssh', 'libssh2', 'libthai', 'libtimidity', 'libtirpc', 'libtool', 'libungif', 'libuninameslist', 'libunique1.0', 'libunique3.0', 'libusb-win32', 'libusb1.0', 'libverto', 'libvncserver', 'libvoikko', 'libvpx', 'libwebp', 'libWindowsWM', 'libwnck', 'libwnck3', 'libX11', 'libXau', 'libXaw', 'libXaw3d', 'libxcb', 'libXcomposite', 'libXcursor', 'libXdamage', 'libXdmcp', 'libXext', 'libxfce4ui', 'libxfce4util', 'libxfcegui4', 'libXfixes', 'libXfont', 'libXft', 'libXi', 'libXinerama', 'libxkbcommon', 'libxkbfile', 'libxklavier', 'libxml++2.6', 'libxml2', 'libXmu', 'libXpm', 'libXrandr', 'libXrender', 'libXres', 'libXScrnSaver', 'libxslt', 'libXt', 'libXtst', 'libytnef', 'libzeitgiest1.0', 'libzip', 'lightsoff', 'lighttpd', 'linux-libertine-fonts', 'listres', 'llvm', 'lndir', 'login', 'lrzip', 'lskat', 'lua', 'lua-bit', 'lua-crypto', 'lua-json', 'lua-lfs', 'lua-logging', 'lua-lpeg', 'lua-luadoc', 'lua-lxp', 'lua-socket', 'lua5.1', 'luit', 'lxappearance', 'lxappearance-obconf', 'lxde-common', 'lxde-icon-theme', 'lxinput', 'lxmenu-data', 'lxpanel', 'lxsession', 'lxtask', 'lxterminal', 'm17n-contrib', 'm17n-db', 'm17n-lib', 'makedepend', 'malaga', 'man-db', 'marble', 'marco', 'marisa', 'mate-applets', 'mate-backgrounds', 'mate-calc', 'mate-common', 'mate-control-center', 'mate-desktop', 'mate-dialogs', 'mate-icon-theme', 'mate-media', 'mate-menus', 'mate-notification-daemon', 'mate-panel', 'mate-session-manager', 'mate-settings-daemon', 'mate-system-monitor', 'mate-terminal', 'mate-themes', 'mate-themes-extras', 'mate-utils', 'mcpp', 'mdbtools', 'mDNSResponder', 'menu-cache', 'mesa', 'mesa-demos', 'metacity', 'midori', 'mingw64-i686-bzip2', 'mingw64-i686-libgcrypt', 'mingw64-i686-libgpg-error', 'mingw64-i686-pkg-config', 'mingw64-i686-xz', 'mingw64-i686-zlib', 'mingw64-x86_64-bzip2', 'mingw64-x86_64-libgcrypt', 'mingw64-x86_64-libgpg-error', 'mingw64-x86_64-pkg-config', 'mingw64-x86_64-xz', 'mingw64-x86_64-zlib', 'mkcomposecache', 'mkfontdir', 'mkfontscale', 'mm-common', 'monotone', 'motif', 'mousepad', 'mousetweaks', 'mozo', 'mutter', 'mysql', 'nano', 'nas', 'nautilus', 'ncompress', 'ncurses', 'nedit', 'netpbm', 'notification-daemon', 'novprog', 'nspr', 'nss', 'obconf', 'ocaml-facile', 'oclock', 'odbc-mysql', 'odbc-psql', 'odbc-sqlite3', 'okteta', 'okteta4', 'openal', 'openbox', 'openexr', 'openjade', 'openjpeg', 'OpenSP', 'openssl', 'opus', 'opusfile', 'orage', 'ORBit2', 'orc', 'overpass-fonts', 'oxygen-fonts', 'oxygen-icons', 'p11-kit', 'pairs', 'palapeli', 'pango1.0', 'pangomm1.4', 'pangox-compat', 'paprefs', 'parley', 'pavucontrol', 'pcmanfm', 'pcre', 'pdf2djvu', 'peg-e', 'perl-Alien-wxWidgets', 'perl-Archive-Zip', 'perl-Authen-SASL', 'perl-Cairo', 'perl-Cairo-GObject', 'perl-CGI', 'perl-Clone', 'perl-DBD-mysql', 'perl-DBD-SQLite', 'perl-DBI', 'perl-Digest-HMAC', 'perl-Digest-SHA1', 'perl-Encode-Locale', 'perl-ExtUtils-Depends', 'perl-ExtUtils-PkgConfig', 'perl-File-Listing', 'perl-GD', 'perl-Getopt-ArgvFile', 'perl-gettext', 'perl-Glib', 'perl-Glib-Object-Introspection', 'perl-Gnome2', 'perl-Gnome2-Canvas', 'perl-Gnome2-GConf', 'perl-Gnome2-Rsvg', 'perl-Gnome2-VFS', 'perl-Gnome2-Vte', 'perl-Gnome2-Wnck', 'perl-GStreamer', 'perl-GStreamer-Interfaces', 'perl-Gtk2', 'perl-Gtk2-GladeXML', 'perl-Gtk2-Notify', 'perl-Gtk2-SourceView2', 'perl-Gtk2-Spell', 'perl-Gtk2-Unique', 'perl-Gtk2-WebKit', 'perl-Gtk3', 'perl-HTML-Parser', 'perl-HTML-Tagset', 'perl-HTTP-Cookies', 'perl-HTTP-Daemon', 'perl-HTTP-Date', 'perl-HTTP-Message', 'perl-HTTP-Negotiate', 'perl-IO-Socket-IP', 'perl-IO-Socket-SSL', 'perl-Locale-gettext', 'perl-LWP-MediaTypes', 'perl-MailTools', 'perl-Module-Pluggable', 'perl-Module-ScanDeps', 'perl-Net-HTTP', 'perl-Net-SMTP-SSL', 'perl-Net-SSLeay', 'perl-OpenGL', 'perl-Pango', 'perl-PAR', 'perl-PAR-Dist', 'perl-PAR-Packer', 'perl-Params-Util', 'perl-Proc-ProcessTable', 'perl-SGMLSpm', 'perl-Socket', 'perl-Term-ReadKey', 'perl-Term-ReadLine-Gnu', 'perl-Text-CharWidth', 'perl-Text-WrapI18N', 'perl-TimeDate', 'perl-Tk', 'perl-Tk-Canvas-GradientColor', 'perl-Tk-ColoredButton', 'perl-Tk-EntryCheck', 'perl-Tk-Getopt', 'perl-Tk-Pod', 'perl-URI', 'perl-WWW-RobotRules', 'perl-Wx', 'perl-XML-LibXML', 'perl-XML-NamespaceSupport', 'perl-XML-Parser', 'perl-XML-SAX', 'perl-XML-SAX-Base', 'perl-XML-Simple', 'perl-YAML', 'phodav', 'phonon', 'phonon-backend-gstreamer', 'phonon4qt5', 'phonon4qt5-backend-gstreamer', 'php', 'php-Archive_Tar', 'php-Console_Getopt', 'php-jsonc', 'php-PEAR', 'php-Structures_Graph', 'php-XML_Util', 'picmi', 'pixman', 'pkg-config', 'planet', 'pluma', 'pluma-plugins', 'po4a', 'poppler', 'poppler-data', 'portaudio', 'portmidi', 'presentproto', 'prison', 'pulseaudio', 'putty', 'python', 'python-beautifulsoup', 'python-bsddb3', 'python-cairo', 'python-cffi', 'python-chardet', 'python-cryptography', 'python-cython', 'python-dbus', 'python-doc', 'python-enum34', 'python-gi', 'python-gobject', 'python-goocanvas', 'python-gst0.10', 'python-gtk2.0', 'python-gtksourceview2', 'python-htmltmpl', 'python-imaging', 'python-lxml', 'python-mako', 'python-markupsafe', 'python-mx', 'python-numpy', 'python-opengl', 'python-opengl-accelerate', 'python-openssl', 'python-orbit', 'python-ply', 'python-pyasn1', 'python-pycparser', 'python-pygame', 'python-pygments', 'python-pykde4', 'python-pypdf', 'python-pyqt4', 'python-pyqt5', 'python-pyrex', 'python-reportlab', 'python-requests', 'python-setuptools', 'python-simplejson', 'python-sip', 'python-six', 'python-twisted', 'python-unidecode', 'python-urllib3', 'python-webkit', 'python-xdg', 'python-yaml', 'python-zope.interface', 'python3', 'python3-bsddb3', 'python3-cairo', 'python3-cffi', 'python3-chardet', 'python3-cryptography', 'python3-cython', 'python3-dbus', 'python3-doc', 'python3-imaging', 'python3-lxml', 'python3-mako', 'python3-markupsafe', 'python3-numpy', 'python3-openssl', 'python3-ply', 'python3-pyasn1', 'python3-pycparser', 'python3-pygments', 'python3-pykde4', 'python3-pyqt4', 'python3-pyqt5', 'python3-requests', 'python3-setuptools', 'python3-simplejson', 'python3-sip', 'python3-six', 'python3-unidecode', 'python3-urllib3', 'python3-xdg', 'python3-yaml', 'python3-zope.interface', 'pyzy', 'qca', 'qimageblitz', 'qjson', 'qoauth', 'qqwing', 'qrencode', 'qscintilla2', 'qt3', 'qt4', 'qt4-webkit', 'qt5-base', 'qt5-declarative', 'qt5-doc', 'qt5-enginio', 'qt5-graphicaleffects', 'qt5-imageformats', 'qt5-location', 'qt5-multimedia', 'qt5-quick1', 'qt5-quickcontrols', 'qt5-script', 'qt5-serialport', 'qt5-svg', 'qt5-tools', 'qt5-translations', 'qt5-webchannel', 'qt5-webkit', 'qt5-webkit-examples', 'qt5-websockets', 'qt5-x11extras', 'qt5-xmlpatterns', 'quadrapassel', 'quvi', 'randrproto', 'rarian', 'recordproto', 'rendercheck', 'renderproto', 'resourceproto', 'rgb', 'ristretto', 'robodoc', 'rocs', 'rodent-icon-theme', 'rstart', 'ruby', 'ruby-actionmailer', 'ruby-actionpack', 'ruby-actionview', 'ruby-activejob', 'ruby-activemodel', 'ruby-activerecord', 'ruby-activerecord-deprecated_finders', 'ruby-activesupport', 'ruby-arel', 'ruby-atk', 'ruby-bcrypt', 'ruby-bigdecimal', 'ruby-binding_of_caller', 'ruby-builder', 'ruby-bundler', 'ruby-byebug', 'ruby-cairo', 'ruby-cairo-gobject', 'ruby-celluloid', 'ruby-clutter', 'ruby-clutter-gtk', 'ruby-coffee-rails', 'ruby-coffee-script', 'ruby-coffee-script-source', 'ruby-columnize', 'ruby-curses', 'ruby-dbus', 'ruby-debug_inspector', 'ruby-erubis', 'ruby-execjs', 'ruby-gdk3', 'ruby-gdk_pixbuf2', 'ruby-gettext', 'ruby-gio2', 'ruby-glib2', 'ruby-globalid', 'ruby-gobject-introspection', 'ruby-goocanvas1', 'ruby-goocanvas2', 'ruby-gstreamer0.10', 'ruby-gstreamer1.0', 'ruby-gtk2', 'ruby-gtk3', 'ruby-gtksourceview2', 'ruby-gtksourceview3', 'ruby-hike', 'ruby-hitimes', 'ruby-hoe', 'ruby-i18n', 'ruby-io-console', 'ruby-jbuilder', 'ruby-journey', 'ruby-jquery-rails', 'ruby-json', 'ruby-kgio', 'ruby-listen', 'ruby-locale', 'ruby-loofah', 'ruby-mail', 'ruby-mime-types', 'ruby-minitest', 'ruby-minitest4', 'ruby-minitest5', 'ruby-molinillo', 'ruby-multi_json', 'ruby-mysql2', 'ruby-net-http-persistent', 'ruby-nokogiri', 'ruby-oj', 'ruby-pango', 'ruby-pg', 'ruby-pkg-config', 'ruby-polyglot', 'ruby-poppler', 'ruby-psych', 'ruby-racc', 'ruby-rack', 'ruby-rack-cache', 'ruby-rack-ssl', 'ruby-rack-test', 'ruby-rails', 'ruby-rails-deprecated_sanitizer', 'ruby-rails-dom-testing', 'ruby-rails-html-sanitizer', 'ruby-railties', 'ruby-raindrops', 'ruby-rake', 'ruby-rake-compiler', 'ruby-rdoc', 'ruby-rsvg2', 'ruby-sass', 'ruby-sass-rails', 'ruby-sdoc', 'ruby-sprockets', 'ruby-sprockets-rails', 'ruby-sqlite3', 'ruby-test-unit', 'ruby-text', 'ruby-thor', 'ruby-thread_safe', 'ruby-tilt', 'ruby-timers', 'ruby-treetop', 'ruby-turbolinks', 'ruby-tzinfo', 'ruby-uglifier', 'ruby-unicorn', 'ruby-vte', 'ruby-vte3', 'ruby-web-console', 'ruby-webkit-gtk2', 'ruby-yajl', 'rubygems', 'rxvt-unicode', 'scowl', 'scrnsaverproto', 'SDL', 'SDL2', 'SDL2_image', 'SDL2_mixer', 'SDL2_net', 'SDL2_ttf', 'SDL_gfx', 'SDL_image', 'SDL_mixer', 'SDL_net', 'SDL_Pango', 'SDL_sound', 'SDL_ttf', 'seahorse', 'sessreg', 'setxkbmap', 'sgml-common', 'shared-mime-info', 'showfont', 'simsu', 'sj-fonts', 'skkdic', 'sl', 'smproxy', 'snownews', 'sound-theme-freedesktop', 'source-highlight', 'sox', 'spice-gtk', 'spice-protocol', 'startup-notification', 'step', 'strigi', 'suomi-malaga', 'sweeper', 'swell-foop', 'swig', 'taglib', 'tali', 'tanglet', 'tcl', 'tcl-itcl', 'tcl-itk', 'tcl-iwidgets', 'tcl-tix', 'tcl-tk', 'tcl-togl', 'tdb', 'telepathy-farstream', 'telepathy-gabble', 'telepathy-glib', 'telepathy-idle', 'telepathy-logger', 'telepathy-mission-control', 'telepathy-qt', 'terminus-fonts', 'tetzle', 'Thunar', 'tidy', 'tiff', 'tigervnc', 'timidity++', 'totem', 'totem-pl-parser', 'transmission', 'transset', 'trayer', 'tumbler', 'twm', 'tzcode', 'unifont', 'unzip', 'upower', 'usbredir', 'usbutils', 'util-linux', 'vala', 'viewres', 'vim', 'vinagre', 'vino', 'vte', 'vte2.90', 'vte2.91', 'wavpack', 'webkitgtk', 'webrtc-audio-processing', 'wildmidi', 'WindowMaker', 'windowswmproto', 'wxWidgets2.8', 'wxWidgets3.0', 'x11perf', 'xapian-bindings', 'xapian-core', 'xarchiver', 'xauth', 'xbiff', 'xbitmaps', 'xcalc', 'xcb-proto', 'xcb-util', 'xcb-util-cursor', 'xcb-util-image', 'xcb-util-keysyms', 'xcb-util-renderutil', 'xcb-util-wm', 'xclipboard', 'xclock', 'xcmiscproto', 'xcmsdb', 'xcompmgr', 'xconsole', 'xcursor-themes', 'xcursorgen', 'xdbedizzy', 'xdg-user-dirs', 'xdg-user-dirs-gtk', 'xditview', 'xdpyinfo', 'xedit', 'xerces-c', 'xev', 'xextproto', 'xeyes', 'xf86-video-dummy', 'xf86-video-nested', 'xf86bigfontproto', 'xfce-themes', 'xfce4-appfinder', 'xfce4-clipman-plugin', 'xfce4-cpugraph-plugin', 'xfce4-dev-tools', 'xfce4-dict', 'xfce4-embed-plugin', 'xfce4-equake-plugin', 'xfce4-eyes-plugin', 'xfce4-fsguard-plugin', 'xfce4-genmon-plugin', 'xfce4-mailwatch-plugin', 'xfce4-mixer', 'xfce4-notes-plugin', 'xfce4-notifyd', 'xfce4-panel', 'xfce4-places-plugin', 'xfce4-screenshooter', 'xfce4-session', 'xfce4-settings', 'xfce4-smartbookmark-plugin', 'xfce4-taskmanager', 'xfce4-terminal', 'xfce4-time-out-plugin', 'xfce4-timer-plugin', 'xfce4-verve-plugin', 'xfce4-weather-plugin', 'xfce4-whiskermenu-plugin', 'xfce4-wmdock-plugin', 'xfce4-xkb-plugin', 'xfconf', 'xfd', 'xfdesktop', 'xfontsel', 'xfs', 'xfsinfo', 'xfwm4', 'xfwm4-themes', 'xgc', 'xhost', 'xineramaproto', 'xinit', 'xinput', 'xkbcomp', 'xkbevd', 'xkbprint', 'xkbutils', 'xkeyboard-config', 'xkill', 'xload', 'xlogo', 'xlsatoms', 'xlsclients', 'xlsfonts', 'xmag', 'xman', 'xmessage', 'xmh', 'xmlto', 'xmltoman', 'xmodmap', 'xmore', 'xorg-cf-files', 'xorg-docs', 'xorg-scripts', 'xorg-sgml-doctools', 'xorg-util-macros', 'xorg-x11-fonts', 'xpr', 'xprop', 'xproto', 'xrandr', 'xrdb', 'xrefresh', 'xscope', 'xset', 'xsetroot', 'xsm', 'xstdcmap', 'xterm', 'xtrans', 'xwd', 'xwininfo', 'xwinwm', 'xwud', 'xz', 'yakuake', 'yaml', 'yelp', 'yelp-tools', 'yelp-xsl', 'zathura', 'zathura-cb', 'zathura-djvu', 'zathura-pdf-poppler', 'zathura-ps', 'zeitgeist', 'zeitgeist-datasources', 'zenity', 'zinnia', 'zinnia-tomoe', 'zip', 'zlib', 'zziplib']),
+ 'Yitzchak Scott-Thoennes': maintainers.Maintainer('Yitzchak Scott-Thoennes', [], ['fortune-mod']),
+ 'Yue Ren': maintainers.Maintainer('Yue Ren', [], ['4ti2', 'cddlib', 'flint', 'ntl', 'singular', 'surf'])}
diff --git a/test/testdata/process_arch/homedir.expected b/test/testdata/process_arch/homedir.expected
new file mode 100644
index 0000000..1c52158
--- /dev/null
+++ b/test/testdata/process_arch/homedir.expected
@@ -0,0 +1,18 @@
+{'.': ['an_unexpected_file'],
+ 'Blooey McFooey': [],
+ 'Blooey McFooey/noarch': [],
+ 'Blooey McFooey/noarch/release': [],
+ 'Blooey McFooey/noarch/release/perl-Net-SMTP-SSL': [],
+ 'Blooey McFooey/x86': [],
+ 'Blooey McFooey/x86/release': [],
+ 'Blooey McFooey/x86/release/after-ready': ['after-ready-1.0-1.tar.bz2', 'setup.hint'],
+ 'Blooey McFooey/x86/release/not-on-maintainer-list': ['not-on-maintainer-list-1.0-1.tar.bz2', 'setup.hint'],
+ 'Blooey McFooey/x86/release/not-on-package-list': ['not-on-package-list-1.0-1.tar.bz2', 'setup.hint'],
+ 'Blooey McFooey/x86/release/not-ready': ['-not-ready-0.9-1.tar.bz2', 'not-ready-1.0-1.tar.bz2', 'setup.hint'],
+ 'Blooey McFooey/x86/release/testpackage': [],
+ 'Blooey McFooey/x86/release/testpackage/testpackage-subpackage': [],
+ 'Blooey McFooey/x86/release/testpackage2': ['setup.hint', 'testpackage2-1.0-1.tar.bz2'],
+ 'Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage': ['inprogress.SftpXFR.1234',
+                                                                     'setup.hint',
+                                                                     'testpackage2-subpackage-1.0-1.tar.bz2'],
+ 'Jon Turney': ['!email']}
diff --git a/test/testdata/process_arch/htdocs.expected b/test/testdata/process_arch/htdocs.expected
new file mode 100644
index 0000000..4670972
--- /dev/null
+++ b/test/testdata/process_arch/htdocs.expected
@@ -0,0 +1,29 @@
+{'.': [],
+ 'x86': ['.htaccess', 'packages.inc'],
+ 'x86/arc': ['.htaccess', 'arc-4.32.7-10', 'arc-4.32.7-10-src'],
+ 'x86/base-cygwin': ['.htaccess', 'base-cygwin-3.6-1', 'base-cygwin-3.8-1'],
+ 'x86/cygwin': ['.htaccess',
+                'cygwin-2.2.0-1',
+                'cygwin-2.2.0-1-src',
+                'cygwin-2.2.1-1',
+                'cygwin-2.2.1-1-src',
+                'cygwin-2.3.0-0.3',
+                'cygwin-2.3.0-0.3-src'],
+ 'x86/cygwin-debuginfo': ['.htaccess',
+                          'cygwin-debuginfo-2.2.0-1',
+                          'cygwin-debuginfo-2.2.1-1',
+                          'cygwin-debuginfo-2.3.0-0.3'],
+ 'x86/cygwin-devel': ['.htaccess', 'cygwin-devel-2.2.0-1', 'cygwin-devel-2.2.1-1', 'cygwin-devel-2.3.0-0.3'],
+ 'x86/keychain': ['.htaccess', 'keychain-2.6.8-1', 'keychain-2.6.8-1-src', 'keychain-2.7.1-1', 'keychain-2.7.1-1-src'],
+ 'x86/libdns_sd-devel': ['.htaccess', 'libdns_sd-devel-379.32.1-1'],
+ 'x86/libdns_sd1': ['.htaccess', 'libdns_sd1-379.32.1-1'],
+ 'x86/mDNSResponder': ['.htaccess', 'mDNSResponder-379.32.1-1', 'mDNSResponder-379.32.1-1-src'],
+ 'x86/openssh': ['.htaccess', 'openssh-7.2p2-1', 'openssh-7.2p2-1-src'],
+ 'x86/perl-Net-SMTP-SSL': ['.htaccess',
+                           'perl-Net-SMTP-SSL-1.03-1',
+                           'perl-Net-SMTP-SSL-1.03-1-src',
+                           'perl-Net-SMTP-SSL-1.03-2',
+                           'perl-Net-SMTP-SSL-1.03-2-src'],
+ 'x86/rpm-doc': ['.htaccess', 'rpm-doc-4.1-2', 'rpm-doc-4.1-2-src', 'rpm-doc-999-1'],
+ 'x86/testpackage': ['.htaccess', 'testpackage-1.0-1', 'testpackage-1.0-1-src'],
+ 'x86/testpackage-subpackage': ['.htaccess', 'testpackage-subpackage-1.0-1']}
diff --git a/test/testdata/process_arch/rel_area.expected b/test/testdata/process_arch/rel_area.expected
new file mode 100644
index 0000000..44161bf
--- /dev/null
+++ b/test/testdata/process_arch/rel_area.expected
@@ -0,0 +1,66 @@
+{'.': ['setup.ini'],
+ 'noarch': ['sha512.sum'],
+ 'noarch/release': ['sha512.sum'],
+ 'noarch/release/perl-Net-SMTP-SSL': ['perl-Net-SMTP-SSL-1.03-1-src.tar.xz',
+                                      'perl-Net-SMTP-SSL-1.03-1.tar.xz',
+                                      'perl-Net-SMTP-SSL-1.03-2-src.tar.xz',
+                                      'perl-Net-SMTP-SSL-1.03-2.tar.xz',
+                                      'setup.hint',
+                                      'sha512.sum'],
+ 'x86': ['sha512.sum'],
+ 'x86/release': ['sha512.sum'],
+ 'x86/release/arc': ['arc-4.32.7-10-src.tar.bz2', 'arc-4.32.7-10.tar.bz2', 'setup.hint', 'sha512.sum'],
+ 'x86/release/base-cygwin': ['base-cygwin-3.6-1.tar.xz', 'base-cygwin-3.8-1.tar.xz', 'setup.hint', 'sha512.sum'],
+ 'x86/release/cygwin': ['.this-should-be-ignored',
+                        'cygwin-2.2.0-1-src.tar.xz',
+                        'cygwin-2.2.0-1.tar.xz',
+                        'cygwin-2.2.1-1-src.tar.xz',
+                        'cygwin-2.2.1-1.tar.xz',
+                        'cygwin-2.3.0-0.3-src.tar.xz',
+                        'cygwin-2.3.0-0.3.tar.xz',
+                        'setup.hint',
+                        'sha512.sum'],
+ 'x86/release/cygwin/cygwin-debuginfo': ['cygwin-debuginfo-2.2.0-1.tar.xz',
+                                         'cygwin-debuginfo-2.2.1-1.tar.xz',
+                                         'cygwin-debuginfo-2.3.0-0.3.tar.xz',
+                                         'setup.hint',
+                                         'sha512.sum'],
+ 'x86/release/cygwin/cygwin-devel': ['cygwin-devel-2.2.0-1.tar.xz',
+                                     'cygwin-devel-2.2.1-1.tar.xz',
+                                     'cygwin-devel-2.3.0-0.3.tar.xz',
+                                     'setup.hint',
+                                     'sha512.sum'],
+ 'x86/release/invalid': ['setup.hint', 'sha512.sum'],
+ 'x86/release/keychain': ['keychain-2.6.8-1-src.tar.bz2',
+                          'keychain-2.6.8-1.tar.bz2',
+                          'keychain-2.7.1-1-src.tar.bz2',
+                          'keychain-2.7.1-1.tar.bz2',
+                          'setup.hint',
+                          'sha512.sum'],
+ 'x86/release/libspiro': ['setup.hint', 'sha512.sum'],
+ 'x86/release/libspiro/libspiro-devel': ['setup.hint', 'sha512.sum'],
+ 'x86/release/libspiro/libspiro0': ['setup.hint', 'sha512.sum'],
+ 'x86/release/libtextcat': ['libtextcat-2.2-2-src.tar.bz2', 'libtextcat-2.2-2.tar.bz2', 'setup.hint', 'sha512.sum'],
+ 'x86/release/libtextcat/libtextcat-devel': ['libtextcat-devel-2.2-2.tar.bz2', 'setup.hint', 'sha512.sum'],
+ 'x86/release/libtextcat/libtextcat0': ['libtextcat0-2.2-2.tar.bz2', 'setup.hint', 'sha512.sum'],
+ 'x86/release/mDNSResponder': ['mDNSResponder-379.32.1-1-src.tar.bz2',
+                               'mDNSResponder-379.32.1-1.tar.bz2',
+                               'setup.hint',
+                               'sha512.sum'],
+ 'x86/release/mDNSResponder/libdns_sd-devel': ['libdns_sd-devel-379.32.1-1.tar.bz2', 'setup.hint', 'sha512.sum'],
+ 'x86/release/mDNSResponder/libdns_sd1': ['libdns_sd1-379.32.1-1.tar.bz2', 'setup.hint', 'sha512.sum'],
+ 'x86/release/mingw64-i686-binutils': ['setup.hint', 'sha512.sum'],
+ 'x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo': ['setup.hint', 'sha512.sum'],
+ 'x86/release/naim': ['setup.hint'],
+ 'x86/release/openssh': ['openssh-7.2p2-1-src.tar.xz', 'openssh-7.2p2-1.tar.xz', 'setup.hint', 'sha512.sum'],
+ 'x86/release/proj': ['setup.hint', 'sha512.sum'],
+ 'x86/release/proj/libproj-devel': ['setup.hint', 'sha512.sum'],
+ 'x86/release/proj/libproj1': ['setup.hint', 'sha512.sum'],
+ 'x86/release/rpm-doc': ['rpm-doc-4.1-2-src.tar.bz2',
+                         'rpm-doc-4.1-2.tar.bz2',
+                         'rpm-doc-999-1.tar.bz2',
+                         'setup.hint',
+                         'sha512.sum'],
+ 'x86/release/splint': ['setup.hint', 'sha512.sum'],
+ 'x86/release/testpackage': ['setup.hint', 'sha512.sum', 'testpackage-1.0-1-src.tar.bz2', 'testpackage-1.0-1.tar.bz2'],
+ 'x86/release/testpackage/testpackage-subpackage': ['setup.hint', 'testpackage-subpackage-1.0-1.tar.bz2']}
diff --git a/test/testdata/process_arch/vault.expected b/test/testdata/process_arch/vault.expected
new file mode 100644
index 0000000..a87938b
--- /dev/null
+++ b/test/testdata/process_arch/vault.expected
@@ -0,0 +1 @@
+{'.': [], 'x86': [], 'x86/release': [], 'x86/release/testpackage': ['testpackage-0.1-1.tar.bz2']}
diff --git a/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz b/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz
new file mode 100644
index 0000000..9e7f93d
Binary files /dev/null and b/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz differ
diff --git a/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz b/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz
new file mode 100644
index 0000000..d986060
Binary files /dev/null and b/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz differ
diff --git a/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/setup.hint b/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/setup.hint
new file mode 100644
index 0000000..f91a0e1
--- /dev/null
+++ b/test/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/setup.hint
@@ -0,0 +1,5 @@
+category: Perl
+requires:
+sdesc: "Perl distribution Net-SMTP-SSL"
+ldesc: "Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
+its network operations in order to support encrypted connections."
diff --git a/test/testdata/relarea/x86/release/arc/arc-4.32.7-10-src.tar.bz2 b/test/testdata/relarea/x86/release/arc/arc-4.32.7-10-src.tar.bz2
new file mode 100644
index 0000000..b56f3b9
Binary files /dev/null and b/test/testdata/relarea/x86/release/arc/arc-4.32.7-10-src.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/arc/arc-4.32.7-10.tar.bz2 b/test/testdata/relarea/x86/release/arc/arc-4.32.7-10.tar.bz2
new file mode 100644
index 0000000..b56f3b9
Binary files /dev/null and b/test/testdata/relarea/x86/release/arc/arc-4.32.7-10.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/arc/setup.hint b/test/testdata/relarea/x86/release/arc/setup.hint
new file mode 100644
index 0000000..718cb55
--- /dev/null
+++ b/test/testdata/relarea/x86/release/arc/setup.hint
@@ -0,0 +1,8 @@
+sdesc: "The ARC archive utility"
+ldesc: "This program is based on the MSDOS ARC program, version 5.21, plus a
+few enhancements. ARC performs Huffman Squeezing on data. The Huffman
+Squeeze algorithm was removed from MSDOS ARC after version 5.12. It
+turns out to be more efficient than Lempel-Ziv style compression when
+compressing graphic images. Squeeze analysis is always done now, and
+the best of packing, squeezing, or crunching is used."
+category: Archive
diff --git a/test/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz b/test/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz b/test/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/base-cygwin/setup.hint b/test/testdata/relarea/x86/release/base-cygwin/setup.hint
new file mode 100644
index 0000000..f6f64b2
--- /dev/null
+++ b/test/testdata/relarea/x86/release/base-cygwin/setup.hint
@@ -0,0 +1,4 @@
+sdesc: "Initial base installation helper script."
+ldesc: "Initial base installation helper script."
+category: Base
+requires: 
diff --git a/test/testdata/relarea/x86/release/cygwin/.this-should-be-ignored b/test/testdata/relarea/x86/release/cygwin/.this-should-be-ignored
new file mode 100644
index 0000000..e69de29
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/setup.hint b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/setup.hint
new file mode 100644
index 0000000..5ed452c
--- /dev/null
+++ b/test/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/setup.hint
@@ -0,0 +1,9 @@
+category: Debug
+requires: cygwin-debuginfo
+external-source: cygwin
+sdesc: "Debug info for cygwin"
+ldesc: "This package contains files necessary for debugging the
+cygwin package with gdb."
+prev: 2.2.0-1
+curr: 2.2.1-1
+test: 2.3.0-0.3
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/cygwin/cygwin-devel/setup.hint b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/setup.hint
new file mode 100644
index 0000000..97170e3
--- /dev/null
+++ b/test/testdata/relarea/x86/release/cygwin/cygwin-devel/setup.hint
@@ -0,0 +1,8 @@
+category: Devel
+requires:
+sdesc: "Core development files"
+ldesc: "Core development files required to build Cygwin packages"
+external-source: cygwin
+prev: 2.2.0-1
+curr: 2.2.1-1
+test: 2.3.0-0.3
diff --git a/test/testdata/relarea/x86/release/cygwin/setup.hint b/test/testdata/relarea/x86/release/cygwin/setup.hint
new file mode 100644
index 0000000..d0c4b26
--- /dev/null
+++ b/test/testdata/relarea/x86/release/cygwin/setup.hint
@@ -0,0 +1,7 @@
+sdesc: "The UNIX emulation engine"
+ldesc: "The UNIX emulation engine"
+category: Base
+requires: base-cygwin
+prev: 2.2.0-1
+curr: 2.2.1-1
+test: 2.3.0-0.3
diff --git a/test/testdata/relarea/x86/release/invalid/setup.hint b/test/testdata/relarea/x86/release/invalid/setup.hint
new file mode 100644
index 0000000..279c8c4
--- /dev/null
+++ b/test/testdata/relarea/x86/release/invalid/setup.hint
@@ -0,0 +1,2 @@
+unknown-key: invalid-value
+invalid-construct
diff --git a/test/testdata/relarea/x86/release/keychain/keychain-2.6.8-1-src.tar.bz2 b/test/testdata/relarea/x86/release/keychain/keychain-2.6.8-1-src.tar.bz2
new file mode 100644
index 0000000..ec4c57b
Binary files /dev/null and b/test/testdata/relarea/x86/release/keychain/keychain-2.6.8-1-src.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/keychain/keychain-2.6.8-1.tar.bz2 b/test/testdata/relarea/x86/release/keychain/keychain-2.6.8-1.tar.bz2
new file mode 100644
index 0000000..a8fd52f
Binary files /dev/null and b/test/testdata/relarea/x86/release/keychain/keychain-2.6.8-1.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/keychain/keychain-2.7.1-1-src.tar.bz2 b/test/testdata/relarea/x86/release/keychain/keychain-2.7.1-1-src.tar.bz2
new file mode 100644
index 0000000..08be499
Binary files /dev/null and b/test/testdata/relarea/x86/release/keychain/keychain-2.7.1-1-src.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/keychain/keychain-2.7.1-1.tar.bz2 b/test/testdata/relarea/x86/release/keychain/keychain-2.7.1-1.tar.bz2
new file mode 100644
index 0000000..4982bf6
Binary files /dev/null and b/test/testdata/relarea/x86/release/keychain/keychain-2.7.1-1.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/keychain/setup.hint b/test/testdata/relarea/x86/release/keychain/setup.hint
new file mode 100644
index 0000000..7870969
--- /dev/null
+++ b/test/testdata/relarea/x86/release/keychain/setup.hint
@@ -0,0 +1,12 @@
+sdesc: "Key manager for OpenSSH"
+ldesc: "Keychain is an OpenSSH key manager, typically run from
+~/.bash_profile. When keychain is run, it checks for a running
+ssh-agent, otherwise it starts one. It saves the ssh-agent environment
+variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins
+and non-interactive shells such as cron jobs can source the file and
+make passwordless ssh connections. In addition, when keychain runs, it
+verifies that the key files specified on the command-line are known to
+ssh-agent, otherwise it loads them, prompting you for a password if
+necessary"
+category: Utils
+requires: openssh
diff --git a/test/testdata/relarea/x86/release/libspiro/libspiro-devel/setup.hint b/test/testdata/relarea/x86/release/libspiro/libspiro-devel/setup.hint
new file mode 100644
index 0000000..37dcfd7
--- /dev/null
+++ b/test/testdata/relarea/x86/release/libspiro/libspiro-devel/setup.hint
@@ -0,0 +1,11 @@
+category: Graphics
+requires: libspiro0
+external-source: libspiro
+sdesc: "Library for converting clothoid splines to bezier curves (development)"
+ldesc: "Spiro is the creation of Raph Levien. It simplifies the drawing 
+of beautiful curves.
+
+Using bézier splines an artist can easily draw curves with the same 
+slope on either side of an on-curve point. Spiros, on the other hand, 
+are based on clothoid splines which make it easy to maintain constant 
+curvature as well as constant slope. Such curves will simply look nicer."
diff --git a/test/testdata/relarea/x86/release/libspiro/libspiro0/setup.hint b/test/testdata/relarea/x86/release/libspiro/libspiro0/setup.hint
new file mode 100644
index 0000000..4d9ef6a
--- /dev/null
+++ b/test/testdata/relarea/x86/release/libspiro/libspiro0/setup.hint
@@ -0,0 +1,11 @@
+category: Graphics
+requires: libgcc1
+external-source: libspiro
+sdesc: "Library for converting clothoid splines to bezier curves (runtime)"
+ldesc: "Spiro is the creation of Raph Levien. It simplifies the drawing 
+of beautiful curves.
+
+Using bézier splines an artist can easily draw curves with the same 
+slope on either side of an on-curve point. Spiros, on the other hand, 
+are based on clothoid splines which make it easy to maintain constant 
+curvature as well as constant slope. Such curves will simply look nicer."
diff --git a/test/testdata/relarea/x86/release/libspiro/setup.hint b/test/testdata/relarea/x86/release/libspiro/setup.hint
new file mode 100644
index 0000000..42f7126
--- /dev/null
+++ b/test/testdata/relarea/x86/release/libspiro/setup.hint
@@ -0,0 +1,9 @@
+category: Graphics
+sdesc: "Library for converting clothoid splines to bezier curves (sources)"
+ldesc: "Spiro is the creation of Raph Levien. It simplifies the drawing 
+of beautiful curves.
+
+Using bézier splines an artist can easily draw curves with the same 
+slope on either side of an on-curve point. Spiros, on the other hand, 
+are based on clothoid splines which make it easy to maintain constant 
+curvature as well as constant slope. Such curves will simply look nicer."
diff --git a/test/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2-src.tar.bz2 b/test/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2-src.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2-src.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2.tar.bz2 b/test/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/libtextcat/libtextcat-devel/libtextcat-devel-2.2-2.tar.bz2 b/test/testdata/relarea/x86/release/libtextcat/libtextcat-devel/libtextcat-devel-2.2-2.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/libtextcat/libtextcat-devel/libtextcat-devel-2.2-2.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/libtextcat/libtextcat-devel/setup.hint b/test/testdata/relarea/x86/release/libtextcat/libtextcat-devel/setup.hint
new file mode 100644
index 0000000..f509126
--- /dev/null
+++ b/test/testdata/relarea/x86/release/libtextcat/libtextcat-devel/setup.hint
@@ -0,0 +1,11 @@
+sdesc: "Helper, header and library for libtextcat"
+ldesc: "Libtextcat is a library with functions that implement the
+classification technique described in Cavnar & Trenkle, "N-Gram-Based
+Text Categorization". It was primarily developed for language
+guessing, a task on which it is known to perform with near-perfect
+accuracy.
+BSD License.
+http://software.wise-guys.nl/libtextcat/";
+category: Devel Text
+requires: libtextcat0 libtextcat
+external-source: libtextcat
diff --git a/test/testdata/relarea/x86/release/libtextcat/libtextcat0/libtextcat0-2.2-2.tar.bz2 b/test/testdata/relarea/x86/release/libtextcat/libtextcat0/libtextcat0-2.2-2.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/libtextcat/libtextcat0/libtextcat0-2.2-2.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/libtextcat/libtextcat0/setup.hint b/test/testdata/relarea/x86/release/libtextcat/libtextcat0/setup.hint
new file mode 100644
index 0000000..f3ae673
--- /dev/null
+++ b/test/testdata/relarea/x86/release/libtextcat/libtextcat0/setup.hint
@@ -0,0 +1,11 @@
+sdesc: "Text Classification Library dll"
+ldesc: "Libtextcat is a library with functions that implement the
+classification technique described in Cavnar & Trenkle, "N-Gram-Based
+Text Categorization". It was primarily developed for language
+guessing, a task on which it is known to perform with near-perfect
+accuracy.
+BSD License.
+http://software.wise-guys.nl/libtextcat/";
+category: Text
+requires: cygwin
+external-source: libtextcat
diff --git a/test/testdata/relarea/x86/release/libtextcat/setup.hint b/test/testdata/relarea/x86/release/libtextcat/setup.hint
new file mode 100644
index 0000000..5145c2d
--- /dev/null
+++ b/test/testdata/relarea/x86/release/libtextcat/setup.hint
@@ -0,0 +1,10 @@
+sdesc: "Text Classification Library (language guessing in C)"
+ldesc: "Libtextcat is a library with functions that implement the
+classification technique described in Cavnar & Trenkle, "N-Gram-Based
+Text Categorization". It was primarily developed for language
+guessing, a task on which it is known to perform with near-perfect
+accuracy. 
+BSD License.
+http://software.wise-guys.nl/libtextcat/";
+category: Text
+requires: libtextcat0
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2 b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/setup.hint b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/setup.hint
new file mode 100644
index 0000000..c285be7
--- /dev/null
+++ b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/setup.hint
@@ -0,0 +1,7 @@
+category: Net
+requires: libdns_sd1 
+sdesc: "Bonjour Zeroconf implementation"
+ldesc: "Bonjour, also known as zero-configuration networking, enables
+automatic discovery of computers, devices, and services on IP networks using
+industry standard IP protocols."
+external-source: mDNSResponder
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2 b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/setup.hint b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/setup.hint
new file mode 100644
index 0000000..74a7a3f
--- /dev/null
+++ b/test/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/setup.hint
@@ -0,0 +1,7 @@
+category: Net
+requires:  
+sdesc: "Bonjour Zeroconf implementation"
+ldesc: "Bonjour, also known as zero-configuration networking, enables
+automatic discovery of computers, devices, and services on IP networks using
+industry standard IP protocols."
+external-source: mDNSResponder
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 b/test/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 b/test/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2
new file mode 100644
index 0000000..a1145fb
Binary files /dev/null and b/test/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/mDNSResponder/setup.hint b/test/testdata/relarea/x86/release/mDNSResponder/setup.hint
new file mode 100644
index 0000000..e50938b
--- /dev/null
+++ b/test/testdata/relarea/x86/release/mDNSResponder/setup.hint
@@ -0,0 +1,11 @@
+category: Net
+requires: libdns_sd1 
+sdesc: "Bonjour Zeroconf implementation"
+ldesc: "Bonjour, also known as zero-configuration networking, enables
+automatic discovery of computers, devices, and services on IP networks using
+industry standard IP protocols."
+
+message: mDNSResponder "The Cygwin mDNSResponder package contains only clients.
+If you do not already have the 'Bonjour Service' installed (it comes with
+a number of popular Windows programs), then you can download it at
+http://support.apple.com/kb/DL999";
diff --git a/test/testdata/relarea/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/setup.hint b/test/testdata/relarea/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/setup.hint
new file mode 100644
index 0000000..55ba552
--- /dev/null
+++ b/test/testdata/relarea/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/setup.hint
@@ -0,0 +1,6 @@
+category: Debug
+requires: cygwin-debuginfo
+external-source: mingw64-i686-binutils
+ldesc: "Debug info for mingw64-i686-binutils"
+sdesc: "This package contains files necessary for debugging the
+mingw64-i686-binutils package with gdb."
diff --git a/test/testdata/relarea/x86/release/mingw64-i686-binutils/setup.hint b/test/testdata/relarea/x86/release/mingw64-i686-binutils/setup.hint
new file mode 100644
index 0000000..f911d0d
--- /dev/null
+++ b/test/testdata/relarea/x86/release/mingw64-i686-binutils/setup.hint
@@ -0,0 +1,5 @@
+category: Devel
+requires: cygwin libintl8 zlib0 
+sdesc: "The GNU Binutils are a collection of binary tools. This package
+ is capable of targeting win32."
+ldesc: "Binutils for MinGW-w64 Win32 toolchain"
diff --git a/test/testdata/relarea/x86/release/naim/setup.hint b/test/testdata/relarea/x86/release/naim/setup.hint
new file mode 100644
index 0000000..7de6e7b
--- /dev/null
+++ b/test/testdata/relarea/x86/release/naim/setup.hint
@@ -0,0 +1,5 @@
+category: Net
+requires:
+sdesc: "Console AIM, ICQ, IRC, and Lily client"
+ldesc: " naim is a console client for AOL Instant Messenger (AIM),
+AOL I Seek You (ICQ), Internet Relay Chat (IRC), and The lily CMC."
diff --git a/test/testdata/relarea/x86/release/openssh/openssh-7.2p2-1-src.tar.xz b/test/testdata/relarea/x86/release/openssh/openssh-7.2p2-1-src.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/openssh/openssh-7.2p2-1-src.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/openssh/openssh-7.2p2-1.tar.xz b/test/testdata/relarea/x86/release/openssh/openssh-7.2p2-1.tar.xz
new file mode 100644
index 0000000..0e6f1e8
Binary files /dev/null and b/test/testdata/relarea/x86/release/openssh/openssh-7.2p2-1.tar.xz differ
diff --git a/test/testdata/relarea/x86/release/openssh/setup.hint b/test/testdata/relarea/x86/release/openssh/setup.hint
new file mode 100644
index 0000000..83aa11a
--- /dev/null
+++ b/test/testdata/relarea/x86/release/openssh/setup.hint
@@ -0,0 +1,5 @@
+category: Net
+sdesc: "The OpenSSH server and client programs"
+ldesc: "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."
diff --git a/test/testdata/relarea/x86/release/proj/libproj-devel/setup.hint b/test/testdata/relarea/x86/release/proj/libproj-devel/setup.hint
new file mode 100644
index 0000000..76d1555
--- /dev/null
+++ b/test/testdata/relarea/x86/release/proj/libproj-devel/setup.hint
@@ -0,0 +1,5 @@
+category: Graphics Libs
+requires: libproj1 
+sdesc: ""The PROJ Cartographic Projections Software (devel)"
+ldesc: "Cartographic projection library and utilities"
+external-source: proj
diff --git a/test/testdata/relarea/x86/release/proj/libproj1/setup.hint b/test/testdata/relarea/x86/release/proj/libproj1/setup.hint
new file mode 100644
index 0000000..22a79bd
--- /dev/null
+++ b/test/testdata/relarea/x86/release/proj/libproj1/setup.hint
@@ -0,0 +1,5 @@
+category: Graphics Libs
+requires:  
+sdesc: ""The PROJ Cartographic Projections Software (runtime)"
+ldesc: "Cartographic projection library and utilities"
+external-source: proj
diff --git a/test/testdata/relarea/x86/release/proj/setup.hint b/test/testdata/relarea/x86/release/proj/setup.hint
new file mode 100644
index 0000000..c5da485
--- /dev/null
+++ b/test/testdata/relarea/x86/release/proj/setup.hint
@@ -0,0 +1,4 @@
+category: Graphics Libs
+requires: libproj1 
+sdesc: ""The PROJ Cartographic Projections Software (utilities)"
+ldesc: "Cartographic projection library and utilities"
diff --git a/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2 b/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2
new file mode 100644
index 0000000..cbf838c
Binary files /dev/null and b/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2 b/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2
new file mode 100644
index 0000000..c7436b3
Binary files /dev/null and b/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-999-1.tar.bz2 b/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-999-1.tar.bz2
new file mode 100644
index 0000000..cbf838c
Binary files /dev/null and b/test/testdata/relarea/x86/release/rpm-doc/rpm-doc-999-1.tar.bz2 differ
diff --git a/test/testdata/relarea/x86/release/rpm-doc/setup.hint b/test/testdata/relarea/x86/release/rpm-doc/setup.hint
new file mode 100644
index 0000000..f3bbf78
--- /dev/null
+++ b/test/testdata/relarea/x86/release/rpm-doc/setup.hint
@@ -0,0 +1,2 @@
+sdesc: "Obsolete package for RPM package management system manual pages"
+category: _obsolete
diff --git a/test/testdata/relarea/x86/release/splint/setup.hint b/test/testdata/relarea/x86/release/splint/setup.hint
new file mode 100644
index 0000000..52b56b9
--- /dev/null
+++ b/test/testdata/relarea/x86/release/splint/setup.hint
@@ -0,0 +1,14 @@
+sdesc: "Check C programs for security vulnerabilities and programming
+mistakes."
+ldesc: "Program does many of the traditional lint checks including
+unused declarations, type inconsistencies, use before definition,
+unreachable code, ignored return values, execution paths with no
+return, likely infinite loops, and fall through cases. More powerful
+checks are made possible by additional information given in source
+code annotations. Annotations are stylized comments that document
+assumptions about functions, variables, parameters and types. In
+addition to the checks specifically enabled by annotations, many of
+the traditional lint checks are improved by exploiting this additional
+setinformation."
+category: Devel
+requires: cygwin
diff --git a/test/testdata/relarea/x86/release/testpackage/setup.hint b/test/testdata/relarea/x86/release/testpackage/setup.hint
new file mode 100644
index 0000000..10ee390
--- /dev/null
+++ b/test/testdata/relarea/x86/release/testpackage/setup.hint
@@ -0,0 +1,3 @@
+sdesc: "A test package"
+ldesc: "A test package"
+category: Devel
diff --git a/test/testdata/relarea/x86/release/testpackage/testpackage-0.1-1.tar.bz2 b/test/testdata/relarea/x86/release/testpackage/testpackage-0.1-1.tar.bz2
new file mode 100644
index 0000000..e69de29
diff --git a/test/testdata/uploads/move.expected b/test/testdata/uploads/move.expected
new file mode 100644
index 0000000..47cb0af
--- /dev/null
+++ b/test/testdata/uploads/move.expected
@@ -0,0 +1,3 @@
+{'x86/release/testpackage': ['setup.hint', 'testpackage-1.0-1-src.tar.bz2', 'testpackage-1.0-1.tar.bz2'],
+ 'x86/release/testpackage/testpackage-subpackage': ['setup.hint', 'testpackage-subpackage-1.0-1.tar.bz2'],
+ 'x86/release/testpackage2/testpackage2-subpackage': ['setup.hint', 'testpackage2-subpackage-1.0-1.tar.bz2']}
diff --git a/test/testdata/uploads/pkglist.expected b/test/testdata/uploads/pkglist.expected
new file mode 100644
index 0000000..bbe52b0
--- /dev/null
+++ b/test/testdata/uploads/pkglist.expected
@@ -0,0 +1,14 @@
+{'testpackage': Package('x86/release/testpackage', {'testpackage-1.0-1-src.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False),
+ 'testpackage-1.0-1.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False)}, {'sdesc': '"A test package"',
+ 'ldesc': '"A test package\n'
+          "It's description might contains some unicode gibberish\n"
+          'Like itâ??s youâ??re Markup Languageâ?¢ Nokogiriâ??s toolâ??that Bézier."',
+ 'category': 'Devel',
+ 'requires': 'cygwin'}),
+ 'testpackage-subpackage': Package('x86/release/testpackage/testpackage-subpackage', {'testpackage-subpackage-1.0-1.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False)}, {'sdesc': '"A test subpackage"',
+ 'ldesc': '"A test subpackage"',
+ 'category': 'Devel',
+ 'external-source': 'testpackage'}),
+ 'testpackage2-subpackage': Package('x86/release/testpackage2/testpackage2-subpackage', {'testpackage2-subpackage-1.0-1.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False)}, {'sdesc': '"A test subpackage 2"',
+ 'ldesc': '"A test subpackage 2"',
+ 'category': 'Devel'})}
diff --git a/testdata/.gitignore b/testdata/.gitignore
deleted file mode 100644
index 2dada27..0000000
--- a/testdata/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-htdocs
-results
-*.results
-setup.ini
-sha512.sum
-\!ready
-\!reminder-timestamp
diff --git a/testdata/hints/noarch/release/perl-Net-SMTP-SSL/expected b/testdata/hints/noarch/release/perl-Net-SMTP-SSL/expected
deleted file mode 100644
index 9516e05..0000000
--- a/testdata/hints/noarch/release/perl-Net-SMTP-SSL/expected
+++ /dev/null
@@ -1,5 +0,0 @@
-{'category': 'Perl',
- 'requires': '',
- 'sdesc': '"Perl distribution Net-SMTP-SSL"',
- 'ldesc': '"Implements the same API as Net::SMTP, but uses IO::Socket::SSL for\n'
-          'its network operations in order to support encrypted connections."'}
diff --git a/testdata/hints/x86/release/arc/expected b/testdata/hints/x86/release/arc/expected
deleted file mode 100644
index d0cd27b..0000000
--- a/testdata/hints/x86/release/arc/expected
+++ /dev/null
@@ -1,8 +0,0 @@
-{'sdesc': '"The ARC archive utility"',
- 'ldesc': '"This program is based on the MSDOS ARC program, version 5.21, plus a\n'
-          'few enhancements. ARC performs Huffman Squeezing on data. The Huffman\n'
-          'Squeeze algorithm was removed from MSDOS ARC after version 5.12. It\n'
-          'turns out to be more efficient than Lempel-Ziv style compression when\n'
-          'compressing graphic images. Squeeze analysis is always done now, and\n'
-          'the best of packing, squeezing, or crunching is used."',
- 'category': 'Archive'}
diff --git a/testdata/hints/x86/release/base-cygwin/expected b/testdata/hints/x86/release/base-cygwin/expected
deleted file mode 100644
index 7505632..0000000
--- a/testdata/hints/x86/release/base-cygwin/expected
+++ /dev/null
@@ -1,5 +0,0 @@
-{'sdesc': '"Initial base installation helper script"',
- 'ldesc': '"Initial base installation helper script."',
- 'category': 'Base',
- 'requires': '',
- 'parse-warnings': ["sdesc ends with '.'"]}
diff --git a/testdata/hints/x86/release/cygwin/cygwin-debuginfo/expected b/testdata/hints/x86/release/cygwin/cygwin-debuginfo/expected
deleted file mode 100644
index 7359321..0000000
--- a/testdata/hints/x86/release/cygwin/cygwin-debuginfo/expected
+++ /dev/null
@@ -1,8 +0,0 @@
-{'category': 'Debug',
- 'requires': 'cygwin-debuginfo',
- 'external-source': 'cygwin',
- 'sdesc': '"Debug info for cygwin"',
- 'ldesc': '"This package contains files necessary for debugging the\ncygwin package with gdb."',
- 'prev': '2.2.0-1',
- 'curr': '2.2.1-1',
- 'test': '2.3.0-0.3'}
diff --git a/testdata/hints/x86/release/cygwin/cygwin-devel/expected b/testdata/hints/x86/release/cygwin/cygwin-devel/expected
deleted file mode 100644
index 19c0b1e..0000000
--- a/testdata/hints/x86/release/cygwin/cygwin-devel/expected
+++ /dev/null
@@ -1,8 +0,0 @@
-{'category': 'Devel',
- 'requires': '',
- 'sdesc': '"Core development files"',
- 'ldesc': '"Core development files required to build Cygwin packages"',
- 'external-source': 'cygwin',
- 'prev': '2.2.0-1',
- 'curr': '2.2.1-1',
- 'test': '2.3.0-0.3'}
diff --git a/testdata/hints/x86/release/cygwin/expected b/testdata/hints/x86/release/cygwin/expected
deleted file mode 100644
index e2f3476..0000000
--- a/testdata/hints/x86/release/cygwin/expected
+++ /dev/null
@@ -1,7 +0,0 @@
-{'sdesc': '"The UNIX emulation engine"',
- 'ldesc': '"The UNIX emulation engine"',
- 'category': 'Base',
- 'requires': 'base-cygwin',
- 'prev': '2.2.0-1',
- 'curr': '2.2.1-1',
- 'test': '2.3.0-0.3'}
diff --git a/testdata/hints/x86/release/invalid/expected b/testdata/hints/x86/release/invalid/expected
deleted file mode 100644
index 95681a8..0000000
--- a/testdata/hints/x86/release/invalid/expected
+++ /dev/null
@@ -1,4 +0,0 @@
-{'parse-errors': ['unknown setup key unknown-key at line 0',
-                  "unknown setup construct 'invalid-construct' at line 1",
-                  "required key 'category' missing",
-                  "required key 'sdesc' missing"]}
diff --git a/testdata/hints/x86/release/keychain/expected b/testdata/hints/x86/release/keychain/expected
deleted file mode 100644
index 4113a2d..0000000
--- a/testdata/hints/x86/release/keychain/expected
+++ /dev/null
@@ -1,12 +0,0 @@
-{'sdesc': '"Key manager for OpenSSH"',
- 'ldesc': '"Keychain is an OpenSSH key manager, typically run from\n'
-          '~/.bash_profile. When keychain is run, it checks for a running\n'
-          'ssh-agent, otherwise it starts one. It saves the ssh-agent environment\n'
-          'variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins\n'
-          'and non-interactive shells such as cron jobs can source the file and\n'
-          'make passwordless ssh connections. In addition, when keychain runs, it\n'
-          'verifies that the key files specified on the command-line are known to\n'
-          'ssh-agent, otherwise it loads them, prompting you for a password if\n'
-          'necessary"',
- 'category': 'Utils',
- 'requires': 'openssh'}
diff --git a/testdata/hints/x86/release/libspiro/expected b/testdata/hints/x86/release/libspiro/expected
deleted file mode 100644
index b16efe0..0000000
--- a/testdata/hints/x86/release/libspiro/expected
+++ /dev/null
@@ -1 +0,0 @@
-OrderedDict([('parse-errors', ['invalid UTF-8'])])
diff --git a/testdata/hints/x86/release/libspiro/libspiro-devel/expected b/testdata/hints/x86/release/libspiro/libspiro-devel/expected
deleted file mode 100644
index b16efe0..0000000
--- a/testdata/hints/x86/release/libspiro/libspiro-devel/expected
+++ /dev/null
@@ -1 +0,0 @@
-OrderedDict([('parse-errors', ['invalid UTF-8'])])
diff --git a/testdata/hints/x86/release/libspiro/libspiro0/expected b/testdata/hints/x86/release/libspiro/libspiro0/expected
deleted file mode 100644
index b16efe0..0000000
--- a/testdata/hints/x86/release/libspiro/libspiro0/expected
+++ /dev/null
@@ -1 +0,0 @@
-OrderedDict([('parse-errors', ['invalid UTF-8'])])
diff --git a/testdata/hints/x86/release/libtextcat/expected b/testdata/hints/x86/release/libtextcat/expected
deleted file mode 100644
index 498e7e5..0000000
--- a/testdata/hints/x86/release/libtextcat/expected
+++ /dev/null
@@ -1,11 +0,0 @@
-{'sdesc': '"Text Classification Library (language guessing in C)"',
- 'ldesc': '"Libtextcat is a library with functions that implement the\n'
-          'classification technique described in Cavnar & Trenkle, "N-Gram-Based\n'
-          'Text Categorization". It was primarily developed for language\n'
-          'guessing, a task on which it is known to perform with near-perfect\n'
-          'accuracy.\n'
-          'BSD License.\n'
-          'http://software.wise-guys.nl/libtextcat/";',
- 'category': 'Text',
- 'requires': 'libtextcat0',
- 'parse-errors': ['embedded quote at line 7']}
diff --git a/testdata/hints/x86/release/libtextcat/libtextcat-devel/expected b/testdata/hints/x86/release/libtextcat/libtextcat-devel/expected
deleted file mode 100644
index aca0db6..0000000
--- a/testdata/hints/x86/release/libtextcat/libtextcat-devel/expected
+++ /dev/null
@@ -1,12 +0,0 @@
-{'sdesc': '"Helper, header and library for libtextcat"',
- 'ldesc': '"Libtextcat is a library with functions that implement the\n'
-          'classification technique described in Cavnar & Trenkle, "N-Gram-Based\n'
-          'Text Categorization". It was primarily developed for language\n'
-          'guessing, a task on which it is known to perform with near-perfect\n'
-          'accuracy.\n'
-          'BSD License.\n'
-          'http://software.wise-guys.nl/libtextcat/";',
- 'category': 'Devel Text',
- 'requires': 'libtextcat libtextcat0',
- 'external-source': 'libtextcat',
- 'parse-errors': ['embedded quote at line 7']}
diff --git a/testdata/hints/x86/release/libtextcat/libtextcat0/expected b/testdata/hints/x86/release/libtextcat/libtextcat0/expected
deleted file mode 100644
index 7f186d6..0000000
--- a/testdata/hints/x86/release/libtextcat/libtextcat0/expected
+++ /dev/null
@@ -1,12 +0,0 @@
-{'sdesc': '"Text Classification Library dll"',
- 'ldesc': '"Libtextcat is a library with functions that implement the\n'
-          'classification technique described in Cavnar & Trenkle, "N-Gram-Based\n'
-          'Text Categorization". It was primarily developed for language\n'
-          'guessing, a task on which it is known to perform with near-perfect\n'
-          'accuracy.\n'
-          'BSD License.\n'
-          'http://software.wise-guys.nl/libtextcat/";',
- 'category': 'Text',
- 'requires': 'cygwin',
- 'external-source': 'libtextcat',
- 'parse-errors': ['embedded quote at line 7']}
diff --git a/testdata/hints/x86/release/mDNSResponder/expected b/testdata/hints/x86/release/mDNSResponder/expected
deleted file mode 100644
index f02a324..0000000
--- a/testdata/hints/x86/release/mDNSResponder/expected
+++ /dev/null
@@ -1,10 +0,0 @@
-{'category': 'Net',
- 'requires': 'libdns_sd1',
- 'sdesc': '"Bonjour Zeroconf implementation"',
- 'ldesc': '"Bonjour, also known as zero-configuration networking, enables\n'
-          'automatic discovery of computers, devices, and services on IP networks using\n'
-          'industry standard IP protocols."',
- 'message': 'mDNSResponder "The Cygwin mDNSResponder package contains only clients.\n'
-            "If you do not already have the 'Bonjour Service' installed (it comes with\n"
-            'a number of popular Windows programs), then you can download it at\n'
-            'http://support.apple.com/kb/DL999";'}
diff --git a/testdata/hints/x86/release/mDNSResponder/libdns_sd-devel/expected b/testdata/hints/x86/release/mDNSResponder/libdns_sd-devel/expected
deleted file mode 100644
index 8e93797..0000000
--- a/testdata/hints/x86/release/mDNSResponder/libdns_sd-devel/expected
+++ /dev/null
@@ -1,7 +0,0 @@
-{'category': 'Net',
- 'requires': 'libdns_sd1',
- 'sdesc': '"Bonjour Zeroconf implementation"',
- 'ldesc': '"Bonjour, also known as zero-configuration networking, enables\n'
-          'automatic discovery of computers, devices, and services on IP networks using\n'
-          'industry standard IP protocols."',
- 'external-source': 'mDNSResponder'}
diff --git a/testdata/hints/x86/release/mDNSResponder/libdns_sd1/expected b/testdata/hints/x86/release/mDNSResponder/libdns_sd1/expected
deleted file mode 100644
index 45d0032..0000000
--- a/testdata/hints/x86/release/mDNSResponder/libdns_sd1/expected
+++ /dev/null
@@ -1,7 +0,0 @@
-{'category': 'Net',
- 'requires': '',
- 'sdesc': '"Bonjour Zeroconf implementation"',
- 'ldesc': '"Bonjour, also known as zero-configuration networking, enables\n'
-          'automatic discovery of computers, devices, and services on IP networks using\n'
-          'industry standard IP protocols."',
- 'external-source': 'mDNSResponder'}
diff --git a/testdata/hints/x86/release/mingw64-i686-binutils/expected b/testdata/hints/x86/release/mingw64-i686-binutils/expected
deleted file mode 100644
index 114e53c..0000000
--- a/testdata/hints/x86/release/mingw64-i686-binutils/expected
+++ /dev/null
@@ -1,6 +0,0 @@
-{'category': 'Devel',
- 'requires': 'cygwin libintl8 zlib0',
- 'sdesc': '"The GNU Binutils are a collection of binary tools. This package\n is capable of targeting win32"',
- 'ldesc': '"Binutils for MinGW-w64 Win32 toolchain"',
- 'parse-errors': ['key sdesc has multi-line value'],
- 'parse-warnings': ["sdesc ends with '.'", 'sdesc is much longer than ldesc']}
diff --git a/testdata/hints/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/expected b/testdata/hints/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/expected
deleted file mode 100644
index c936ff6..0000000
--- a/testdata/hints/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/expected
+++ /dev/null
@@ -1,7 +0,0 @@
-{'category': 'Debug',
- 'requires': 'cygwin-debuginfo',
- 'external-source': 'mingw64-i686-binutils',
- 'ldesc': '"Debug info for mingw64-i686-binutils"',
- 'sdesc': '"This package contains files necessary for debugging the\nmingw64-i686-binutils package with gdb"',
- 'parse-errors': ['key sdesc has multi-line value'],
- 'parse-warnings': ["sdesc ends with '.'", 'sdesc is much longer than ldesc']}
diff --git a/testdata/hints/x86/release/naim/expected b/testdata/hints/x86/release/naim/expected
deleted file mode 100644
index 9f7710c..0000000
--- a/testdata/hints/x86/release/naim/expected
+++ /dev/null
@@ -1,6 +0,0 @@
-{'category': 'Net',
- 'requires': '',
- 'sdesc': '"Console AIM, ICQ, IRC, and Lily client"',
- 'ldesc': '" naim is a console client for AOL Instant Messenger (AIM),\n'
-          'AOL I Seek You (ICQ), Internet Relay Chat (IRC), and The lily CMC."',
- 'parse-warnings': ['value for key ldesc starts with quoted whitespace']}
diff --git a/testdata/hints/x86/release/openssh/expected b/testdata/hints/x86/release/openssh/expected
deleted file mode 100644
index 8eeefad..0000000
--- a/testdata/hints/x86/release/openssh/expected
+++ /dev/null
@@ -1,5 +0,0 @@
-{'category': 'Net',
- 'sdesc': '"The OpenSSH server and client programs"',
- 'ldesc': '"OpenSSH is a program for logging into a remote machine and for\n'
-          '\texecuting commands on a remote machine.  It can replace rlogin and rsh,\n'
-          '\tproviding encrypted communication between two machines."'}
diff --git a/testdata/hints/x86/release/proj/expected b/testdata/hints/x86/release/proj/expected
deleted file mode 100644
index 40db455..0000000
--- a/testdata/hints/x86/release/proj/expected
+++ /dev/null
@@ -1,5 +0,0 @@
-{'category': 'Graphics Libs',
- 'requires': 'libproj1',
- 'sdesc': '""The PROJ Cartographic Projections Software (utilities)"\n'
-          'ldesc: "Cartographic projection library and utilities"',
- 'parse-errors': ['embedded quote at line 3', 'key sdesc has multi-line value']}
diff --git a/testdata/hints/x86/release/proj/libproj-devel/expected b/testdata/hints/x86/release/proj/libproj-devel/expected
deleted file mode 100644
index 620f019..0000000
--- a/testdata/hints/x86/release/proj/libproj-devel/expected
+++ /dev/null
@@ -1,6 +0,0 @@
-{'category': 'Graphics Libs',
- 'requires': 'libproj1',
- 'sdesc': '""The PROJ Cartographic Projections Software (devel)"\n'
-          'ldesc: "Cartographic projection library and utilities"',
- 'external-source': 'proj',
- 'parse-errors': ['embedded quote at line 3', 'key sdesc has multi-line value']}
diff --git a/testdata/hints/x86/release/proj/libproj1/expected b/testdata/hints/x86/release/proj/libproj1/expected
deleted file mode 100644
index cc05b73..0000000
--- a/testdata/hints/x86/release/proj/libproj1/expected
+++ /dev/null
@@ -1,6 +0,0 @@
-{'category': 'Graphics Libs',
- 'requires': '',
- 'sdesc': '""The PROJ Cartographic Projections Software (runtime)"\n'
-          'ldesc: "Cartographic projection library and utilities"',
- 'external-source': 'proj',
- 'parse-errors': ['embedded quote at line 3', 'key sdesc has multi-line value']}
diff --git a/testdata/hints/x86/release/proj/proj-debuginfo/expected b/testdata/hints/x86/release/proj/proj-debuginfo/expected
deleted file mode 100644
index 6af3a7b..0000000
--- a/testdata/hints/x86/release/proj/proj-debuginfo/expected
+++ /dev/null
@@ -1,5 +0,0 @@
-{'category': 'Debug',
- 'requires': 'cygwin-debuginfo',
- 'external-source': 'proj',
- 'sdesc': '"Debug info for proj"',
- 'ldesc': '"This package contains files necessary for debugging the\nproj package with gdb."'}
diff --git a/testdata/hints/x86/release/rpm-doc/expected b/testdata/hints/x86/release/rpm-doc/expected
deleted file mode 100644
index db48c82..0000000
--- a/testdata/hints/x86/release/rpm-doc/expected
+++ /dev/null
@@ -1,2 +0,0 @@
-{'sdesc': '"Obsolete package for RPM package management system manual pages"',
- 'category': '_obsolete'}
diff --git a/testdata/hints/x86/release/splint/expected b/testdata/hints/x86/release/splint/expected
deleted file mode 100644
index 5667e4b..0000000
--- a/testdata/hints/x86/release/splint/expected
+++ /dev/null
@@ -1,15 +0,0 @@
-{'sdesc': '"Check C programs for security vulnerabilities and programming\nmistakes"',
- 'ldesc': '"Program does many of the traditional lint checks including\n'
-          'unused declarations, type inconsistencies, use before definition,\n'
-          'unreachable code, ignored return values, execution paths with no\n'
-          'return, likely infinite loops, and fall through cases. More powerful\n'
-          'checks are made possible by additional information given in source\n'
-          'code annotations. Annotations are stylized comments that document\n'
-          'assumptions about functions, variables, parameters and types. In\n'
-          'addition to the checks specifically enabled by annotations, many of\n'
-          'the traditional lint checks are improved by exploiting this additional\n'
-          'setinformation."',
- 'category': 'Devel',
- 'requires': 'cygwin',
- 'parse-errors': ['key sdesc has multi-line value'],
- 'parse-warnings': ["sdesc ends with '.'"]}
diff --git a/testdata/hints/x86/release/testpackage/expected b/testdata/hints/x86/release/testpackage/expected
deleted file mode 100644
index de11656..0000000
--- a/testdata/hints/x86/release/testpackage/expected
+++ /dev/null
@@ -1 +0,0 @@
-OrderedDict([('sdesc', '"A test package"'), ('ldesc', '"A test package"'), ('category', 'Devel')])
diff --git a/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2-src.tar.xz b/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2-src.tar.xz
deleted file mode 100644
index 9e7f93d..0000000
Binary files a/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2-src.tar.xz and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2.tar.xz b/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2.tar.xz
deleted file mode 100644
index d986060..0000000
Binary files a/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-2.tar.xz and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/setup.hint b/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/setup.hint
deleted file mode 100644
index f91a0e1..0000000
--- a/testdata/homes/Blooey McFooey/noarch/release/perl-Net-SMTP-SSL/setup.hint	
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Perl
-requires:
-sdesc: "Perl distribution Net-SMTP-SSL"
-ldesc: "Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
-its network operations in order to support encrypted connections."
diff --git a/testdata/homes/Blooey McFooey/x86/release/after-ready/after-ready-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/after-ready/after-ready-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/after-ready/after-ready-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/after-ready/setup.hint b/testdata/homes/Blooey McFooey/x86/release/after-ready/setup.hint
deleted file mode 100644
index 676f218..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/after-ready/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test package which is ignored because it's uploaded after ready"
-ldesc: "A test package which is ignored because it's uploaded after ready"
-category: Devel
-
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/not-on-maintainer-list-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/not-on-maintainer-list-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/not-on-maintainer-list-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/setup.hint b/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/setup.hint
deleted file mode 100644
index c5cf25f..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/not-on-maintainer-list/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test package which is ignored because it's not on the maintainer list"
-ldesc: "A test package which is ignored because it's not on the maintainer list"
-category: Devel
-
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/not-on-package-list-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/not-on-package-list-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/not-on-package-list-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/setup.hint b/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/setup.hint
deleted file mode 100644
index 3a5d066..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/not-on-package-list/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test package which is ignored because it's not in the package list"
-ldesc: "A test package which is ignored because it's not in the package list"
-category: Devel
-
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-ready/-not-ready-0.9-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/not-ready/-not-ready-0.9-1.tar.bz2
deleted file mode 100644
index e69de29..0000000
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-ready/not-ready-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/not-ready/not-ready-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/not-ready/not-ready-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/not-ready/setup.hint b/testdata/homes/Blooey McFooey/x86/release/not-ready/setup.hint
deleted file mode 100644
index f459a37..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/not-ready/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test package which is ignored because it's not ready"
-ldesc: "A test package which is ignored because it's not ready"
-category: Devel
-
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage/-testpackage-0.1-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/testpackage/-testpackage-0.1-1.tar.bz2
deleted file mode 100644
index e69de29..0000000
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage/setup.hint b/testdata/homes/Blooey McFooey/x86/release/testpackage/setup.hint
deleted file mode 100644
index 290111b..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/testpackage/setup.hint	
+++ /dev/null
@@ -1,6 +0,0 @@
-sdesc: "A test package"
-ldesc: "A test package
-It's description might contains some unicode gibberish
-Like itâ??s youâ??re Markup Languageâ?¢ Nokogiriâ??s toolâ??that Bézier."
-category: Devel
-requires: cygwin
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1-src.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1-src.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1-src.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/setup.hint b/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/setup.hint
deleted file mode 100644
index 90f7384..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test subpackage"
-ldesc: "A test subpackage"
-category: Devel
-external-source: testpackage
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/testpackage-subpackage-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/testpackage-subpackage-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/testpackage/testpackage-subpackage/testpackage-subpackage-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage2/setup.hint b/testdata/homes/Blooey McFooey/x86/release/testpackage2/setup.hint
deleted file mode 100644
index 5ac3a09..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/testpackage2/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test package 2"
-ldesc: "A test package 2"
-category: Devel
-
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/inprogress.SftpXFR.1234 b/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/inprogress.SftpXFR.1234
deleted file mode 100644
index e69de29..0000000
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/setup.hint b/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/setup.hint
deleted file mode 100644
index 6871ea5..0000000
--- a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/setup.hint	
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "A test subpackage 2"
-ldesc: "A test subpackage 2"
-category: Devel
-
diff --git a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/testpackage2-subpackage-1.0-1.tar.bz2 b/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/testpackage2-subpackage-1.0-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/homes/Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage/testpackage2-subpackage-1.0-1.tar.bz2 and /dev/null differ
diff --git a/testdata/homes/Jon Turney/!email b/testdata/homes/Jon Turney/!email
deleted file mode 100644
index 1c1f109..0000000
--- a/testdata/homes/Jon Turney/!email	
+++ /dev/null
@@ -1 +0,0 @@
-jon@invalid.local
diff --git a/testdata/homes/an_unexpected_file b/testdata/homes/an_unexpected_file
deleted file mode 100644
index e69de29..0000000
diff --git a/testdata/htdocs.expected/x86/.htaccess b/testdata/htdocs.expected/x86/.htaccess
deleted file mode 100644
index 1ea7b18..0000000
--- a/testdata/htdocs.expected/x86/.htaccess
+++ /dev/null
@@ -1 +0,0 @@
-Redirect temp /packages/x86/index.html https://cygwin.com/packages/package_list.html
diff --git a/testdata/htdocs.expected/x86/arc/.htaccess b/testdata/htdocs.expected/x86/arc/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/arc/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/arc/arc-4.32.7-10 b/testdata/htdocs.expected/x86/arc/arc-4.32.7-10
deleted file mode 100644
index caaa863..0000000
--- a/testdata/htdocs.expected/x86/arc/arc-4.32.7-10
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<h1>arc: The ARC archive utility (installed binaries and support files)</h1>
-<tt><pre>
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src b/testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src
deleted file mode 100644
index d5ad98a..0000000
--- a/testdata/htdocs.expected/x86/arc/arc-4.32.7-10-src
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<h1>arc: The ARC archive utility (source code)</h1>
-<tt><pre>
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/base-cygwin/.htaccess b/testdata/htdocs.expected/x86/base-cygwin/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/base-cygwin/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.6-1 b/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.6-1
deleted file mode 100644
index a6c9d6c..0000000
--- a/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.6-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>base-cygwin: Initial base installation helper script (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.8-1 b/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.8-1
deleted file mode 100644
index a6c9d6c..0000000
--- a/testdata/htdocs.expected/x86/base-cygwin/base-cygwin-3.8-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>base-cygwin: Initial base installation helper script (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin-debuginfo/.htaccess b/testdata/htdocs.expected/x86/cygwin-debuginfo/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/cygwin-debuginfo/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1 b/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1
deleted file mode 100644
index df6375b..0000000
--- a/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1 b/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1
deleted file mode 100644
index df6375b..0000000
--- a/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3 b/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3
deleted file mode 100644
index df6375b..0000000
--- a/testdata/htdocs.expected/x86/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin-devel/.htaccess b/testdata/htdocs.expected/x86/cygwin-devel/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/cygwin-devel/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.0-1 b/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.0-1
deleted file mode 100644
index fe87025..0000000
--- a/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.0-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin-devel: Core development files (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.1-1 b/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.1-1
deleted file mode 100644
index fe87025..0000000
--- a/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.2.1-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin-devel: Core development files (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.3.0-0.3 b/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.3.0-0.3
deleted file mode 100644
index fe87025..0000000
--- a/testdata/htdocs.expected/x86/cygwin-devel/cygwin-devel-2.3.0-0.3
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin-devel: Core development files (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin/.htaccess b/testdata/htdocs.expected/x86/cygwin/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/cygwin/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1 b/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1
deleted file mode 100644
index 11bb5f6..0000000
--- a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin: The UNIX emulation engine (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src b/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src
deleted file mode 100644
index ab98562..0000000
--- a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.0-1-src
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin: The UNIX emulation engine (source code)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1 b/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1
deleted file mode 100644
index 11bb5f6..0000000
--- a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin: The UNIX emulation engine (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src b/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src
deleted file mode 100644
index ab98562..0000000
--- a/testdata/htdocs.expected/x86/cygwin/cygwin-2.2.1-1-src
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin: The UNIX emulation engine (source code)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3 b/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3
deleted file mode 100644
index 11bb5f6..0000000
--- a/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin: The UNIX emulation engine (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3-src b/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3-src
deleted file mode 100644
index ab98562..0000000
--- a/testdata/htdocs.expected/x86/cygwin/cygwin-2.3.0-0.3-src
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>cygwin: The UNIX emulation engine (source code)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/keychain/.htaccess b/testdata/htdocs.expected/x86/keychain/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/keychain/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1 b/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1
deleted file mode 100644
index 543226a..0000000
--- a/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1
+++ /dev/null
@@ -1,19 +0,0 @@
-<html>
-<h1>keychain: Key manager for OpenSSH (installed binaries and support files)</h1>
-<tt><pre>
-    2006-11-09 04:58           0 usr/
-    2006-11-09 04:58           0 usr/bin/
-    2006-11-09 04:58       53740 usr/bin/keychain
-    2006-11-09 04:58           0 usr/share/
-    2006-11-09 04:58           0 usr/share/doc/
-    2006-11-09 04:58           0 usr/share/doc/Cygwin/
-    2006-11-09 04:58        1534 usr/share/doc/Cygwin/keychain-2.6.8.README
-    2006-11-09 04:58           0 usr/share/doc/keychain-2.6.8/
-    2006-11-09 04:58       19017 usr/share/doc/keychain-2.6.8/ChangeLog
-    2006-11-09 04:58       18009 usr/share/doc/keychain-2.6.8/COPYING
-    2006-11-09 04:58         787 usr/share/doc/keychain-2.6.8/README
-    2006-11-09 04:58           0 usr/share/man/
-    2006-11-09 04:58           0 usr/share/man/man1/
-    2006-11-09 04:58       13240 usr/share/man/man1/keychain.1
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1-src b/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1-src
deleted file mode 100644
index 0b4f281..0000000
--- a/testdata/htdocs.expected/x86/keychain/keychain-2.6.8-1-src
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
-<h1>keychain: Key manager for OpenSSH (source code)</h1>
-<tt><pre>
-    2006-11-09 04:59        3051 keychain-2.6.8-1.patch
-    2006-11-09 04:59        5621 keychain-2.6.8-1.sh
-    2006-11-09 04:59       31531 keychain-2.6.8.tar.bz2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1 b/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1
deleted file mode 100644
index c6bfe4f..0000000
--- a/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1
+++ /dev/null
@@ -1,19 +0,0 @@
-<html>
-<h1>keychain: Key manager for OpenSSH (installed binaries and support files)</h1>
-<tt><pre>
-    2012-10-10 05:40           0 usr/
-    2012-10-10 05:40           0 usr/bin/
-    2012-10-10 05:40       50490 usr/bin/keychain
-    2012-10-10 05:40           0 usr/share/
-    2012-10-10 05:40           0 usr/share/doc/
-    2012-10-10 05:40           0 usr/share/doc/Cygwin/
-    2012-10-10 05:40        2120 usr/share/doc/Cygwin/keychain-2.7.1.README
-    2012-10-10 05:40           0 usr/share/doc/keychain/
-    2012-10-10 05:40       17921 usr/share/doc/keychain/COPYING.txt
-    2012-10-10 05:40        8980 usr/share/doc/keychain/keychain.txt
-    2012-10-10 05:40       14144 usr/share/doc/keychain/README.rst
-    2012-10-10 05:40           0 usr/share/man/
-    2012-10-10 05:40           0 usr/share/man/man1/
-    2012-10-10 05:40        5326 usr/share/man/man1/keychain.1.gz
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1-src b/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1-src
deleted file mode 100644
index ce348ee..0000000
--- a/testdata/htdocs.expected/x86/keychain/keychain-2.7.1-1-src
+++ /dev/null
@@ -1,10 +0,0 @@
-<html>
-<h1>keychain: Key manager for OpenSSH (source code)</h1>
-<tt><pre>
-    2012-10-10 05:40       24455 keychain-2.7.1-1-cygwin.patch
-    2012-10-10 05:40         270 keychain-2.7.1-1-cygwin.patch.sig
-    2012-10-10 05:40      320093 keychain-2.7.1-1.sh
-    2012-10-10 05:40         260 keychain-2.7.1-1.sh.sig
-    2012-10-10 05:40       65211 keychain_2.7.1.orig.tar.gz
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/libdns_sd-devel/.htaccess b/testdata/htdocs.expected/x86/libdns_sd-devel/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/libdns_sd-devel/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1 b/testdata/htdocs.expected/x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1
deleted file mode 100644
index 487ca66..0000000
--- a/testdata/htdocs.expected/x86/libdns_sd-devel/libdns_sd-devel-379.32.1-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>libdns_sd-devel: Bonjour Zeroconf implementation (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/libdns_sd1/.htaccess b/testdata/htdocs.expected/x86/libdns_sd1/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/libdns_sd1/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/libdns_sd1/libdns_sd1-379.32.1-1 b/testdata/htdocs.expected/x86/libdns_sd1/libdns_sd1-379.32.1-1
deleted file mode 100644
index ef59595..0000000
--- a/testdata/htdocs.expected/x86/libdns_sd1/libdns_sd1-379.32.1-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>libdns_sd1: Bonjour Zeroconf implementation (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/libtextcat-devel/.htaccess b/testdata/htdocs.expected/x86/libtextcat-devel/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/libtextcat-devel/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/libtextcat-devel/libtextcat-devel-2.2-2 b/testdata/htdocs.expected/x86/libtextcat-devel/libtextcat-devel-2.2-2
deleted file mode 100644
index 03d1ee6..0000000
--- a/testdata/htdocs.expected/x86/libtextcat-devel/libtextcat-devel-2.2-2
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>libtextcat-devel: Helper, header and library for libtextcat (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/libtextcat0/.htaccess b/testdata/htdocs.expected/x86/libtextcat0/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/libtextcat0/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/libtextcat0/libtextcat0-2.2-2 b/testdata/htdocs.expected/x86/libtextcat0/libtextcat0-2.2-2
deleted file mode 100644
index 076ed7a..0000000
--- a/testdata/htdocs.expected/x86/libtextcat0/libtextcat0-2.2-2
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>libtextcat0: Text Classification Library dll (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/mDNSResponder/.htaccess b/testdata/htdocs.expected/x86/mDNSResponder/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/mDNSResponder/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1 b/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1
deleted file mode 100644
index 67c4449..0000000
--- a/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>mDNSResponder: Bonjour Zeroconf implementation (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1-src b/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1-src
deleted file mode 100644
index 9a7db69..0000000
--- a/testdata/htdocs.expected/x86/mDNSResponder/mDNSResponder-379.32.1-1-src
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>mDNSResponder: Bonjour Zeroconf implementation (source code)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/naim/.htaccess b/testdata/htdocs.expected/x86/naim/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/naim/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/openssh/.htaccess b/testdata/htdocs.expected/x86/openssh/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/openssh/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1 b/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1
deleted file mode 100644
index cb2b272..0000000
--- a/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>openssh: The OpenSSH server and client programs (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1-src b/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1-src
deleted file mode 100644
index e85cbee..0000000
--- a/testdata/htdocs.expected/x86/openssh/openssh-7.2p2-1-src
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>openssh: The OpenSSH server and client programs (source code)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/packages.inc b/testdata/htdocs.expected/x86/packages.inc
deleted file mode 100755
index 289a07e..0000000
--- a/testdata/htdocs.expected/x86/packages.inc
+++ /dev/null
@@ -1,23 +0,0 @@
-<div id="x86">
-<div id="background">
-<b class="rtop"><b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b></b>
-<h2>Available Packages for x86</h2>
-<b class="rbottom"><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b></b>
-</div>
-<br>
-<table class="pkglist">
-<tr><td><a href="x86/arc">arc</a></td><td>The ARC archive utility</td></tr>
-<tr><td><a href="x86/base-cygwin">base-cygwin</a></td><td>Initial base installation helper script</td></tr>
-<tr><td><a href="x86/cygwin">cygwin</a></td><td>The UNIX emulation engine</td></tr>
-<tr><td><a href="x86/cygwin-debuginfo">cygwin-debuginfo</a></td><td>Debug info for cygwin</td></tr>
-<tr><td><a href="x86/cygwin-devel">cygwin-devel</a></td><td>Core development files</td></tr>
-<tr><td><a href="x86/keychain">keychain</a></td><td>Key manager for OpenSSH</td></tr>
-<tr><td><a href="x86/libdns_sd-devel">libdns_sd-devel</a></td><td>Bonjour Zeroconf implementation</td></tr>
-<tr><td><a href="x86/libdns_sd1">libdns_sd1</a></td><td>Bonjour Zeroconf implementation</td></tr>
-<tr><td><a href="x86/mDNSResponder">mDNSResponder</a></td><td>Bonjour Zeroconf implementation</td></tr>
-<tr><td><a href="x86/openssh">openssh</a></td><td>The OpenSSH server and client programs</td></tr>
-<tr><td><a href="x86/perl-Net-SMTP-SSL">perl-Net-SMTP-SSL</a></td><td>Perl distribution Net-SMTP-SSL</td></tr>
-<tr><td><a href="x86/rpm-doc">rpm-doc</a></td><td>Obsolete package for RPM package management system manual pages</td></tr>
-<tr><td><a href="x86/testpackage">testpackage</a></td><td>A test package</td></tr>
-</table>
-</div>
diff --git a/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/.htaccess b/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1 b/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1
deleted file mode 100644
index 0f6212c..0000000
--- a/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1
+++ /dev/null
@@ -1,21 +0,0 @@
-<html>
-<h1>perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (installed binaries and support files)</h1>
-<tt><pre>
-    2015-06-26 19:10           0 usr/
-    2015-06-26 19:10           0 usr/lib/
-    2015-06-26 19:10           0 usr/lib/perl5/
-    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/
-    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/5.22/
-    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/5.22/Net/
-    2015-06-26 19:10           0 usr/lib/perl5/vendor_perl/5.22/Net/SMTP/
-    2015-06-21 01:58        1462 usr/lib/perl5/vendor_perl/5.22/Net/SMTP/SSL.pm
-    2015-06-26 19:10           0 usr/share/
-    2015-06-26 19:10           0 usr/share/doc/
-    2015-06-26 19:10           0 usr/share/doc/perl-Net-SMTP-SSL/
-    2015-06-26 19:10         199 usr/share/doc/perl-Net-SMTP-SSL/Changes
-    2015-06-26 19:10         867 usr/share/doc/perl-Net-SMTP-SSL/README
-    2015-06-26 19:10           0 usr/share/man/
-    2015-06-26 19:10           0 usr/share/man/man3/
-    2015-06-26 19:10        1619 usr/share/man/man3/Net.SMTP.SSL.3pm.gz
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src b/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src
deleted file mode 100644
index 76e9a50..0000000
--- a/testdata/htdocs.expected/x86/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
-<h1>perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (source code)</h1>
-<tt><pre>
-    2015-06-26 19:10           0 perl-Net-SMTP-SSL-1.03-1.src/
-    2015-06-26 19:10        2271 perl-Net-SMTP-SSL-1.03-1.src/Net-SMTP-SSL-1.03.tar.gz
-    2015-06-26 19:10         296 perl-Net-SMTP-SSL-1.03-1.src/perl-Net-SMTP-SSL.cygport
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/proj-debuginfo/.htaccess b/testdata/htdocs.expected/x86/proj-debuginfo/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/proj-debuginfo/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/proj-debuginfo/proj-debuginfo-4.8.0-1 b/testdata/htdocs.expected/x86/proj-debuginfo/proj-debuginfo-4.8.0-1
deleted file mode 100644
index d8a0fc4..0000000
--- a/testdata/htdocs.expected/x86/proj-debuginfo/proj-debuginfo-4.8.0-1
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-<h1>proj-debuginfo: Debug info for proj (installed binaries and support files)</h1>
-<tt><pre>
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/rpm-doc/.htaccess b/testdata/htdocs.expected/x86/rpm-doc/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/rpm-doc/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2 b/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2
deleted file mode 100644
index 8ffbe70..0000000
--- a/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2
+++ /dev/null
@@ -1,18 +0,0 @@
-<html>
-<h1>rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)</h1>
-<tt><pre>
-    2003-05-02 11:46       25562 usr/man/fr/man8/rpm.8
-    2003-05-02 11:46       39721 usr/man/ja/man8/rpm.8
-    2003-05-02 11:46         962 usr/man/ja/man8/rpm2cpio.8
-    2003-05-02 11:46       10925 usr/man/ko/man8/rpm.8
-    2003-05-02 11:46         675 usr/man/ko/man8/rpm2cpio.8
-    2003-05-02 11:46        1642 usr/man/man1/gendiff.1
-    2003-05-02 11:46       28286 usr/man/man8/rpm.8
-    2003-05-02 11:46         603 usr/man/man8/rpm2cpio.8
-    2003-05-02 11:46       21387 usr/man/pl/man8/rpm.8
-    2003-05-02 11:46         657 usr/man/pl/man8/rpm2cpio.8
-    2003-05-02 11:46       22681 usr/man/ru/man8/rpm.8
-    2003-05-02 11:46         603 usr/man/ru/man8/rpm2cpio.8
-    2003-05-02 11:46       23159 usr/man/sk/man8/rpm.8
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src b/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src
deleted file mode 100644
index 3566e39..0000000
--- a/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-4.1-2-src
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<h1>rpm-doc: Obsolete package for RPM package management system manual pages (source code)</h1>
-<tt><pre>
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1 b/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1
deleted file mode 100644
index b5b04ec..0000000
--- a/testdata/htdocs.expected/x86/rpm-doc/rpm-doc-999-1
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<h1>rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)</h1>
-<tt><pre>
-</pre></tt>
-</html>
diff --git a/testdata/htdocs.expected/x86/testpackage/.htaccess b/testdata/htdocs.expected/x86/testpackage/.htaccess
deleted file mode 100644
index 3196d64..0000000
--- a/testdata/htdocs.expected/x86/testpackage/.htaccess
+++ /dev/null
@@ -1,3 +0,0 @@
-Options Indexes
-IndexOptions -FancyIndexing
-AddType text/html 1 2 3 4 5 6 7 8 9
diff --git a/testdata/htdocs.expected/x86/testpackage/testpackage-0.1-1 b/testdata/htdocs.expected/x86/testpackage/testpackage-0.1-1
deleted file mode 100644
index 76208aa..0000000
--- a/testdata/htdocs.expected/x86/testpackage/testpackage-0.1-1
+++ /dev/null
@@ -1,5 +0,0 @@
-<html>
-<h1>testpackage: A test package (installed binaries and support files)</h1>
-<tt><pre>
-</pre></tt>
-</html>
diff --git a/testdata/inifile/setup.ini.expected b/testdata/inifile/setup.ini.expected
deleted file mode 100644
index c41865a..0000000
--- a/testdata/inifile/setup.ini.expected
+++ /dev/null
@@ -1,215 +0,0 @@
-('# This file is automatically generated.  If you edit it, your\n'
- '# edits will be discarded next time the file is generated.\n'
- '# See http://cygwin.com/setup.html for details.\n'
- '#\n'
- 'release: testing\n'
- 'arch: x86\n'
- 'setup-timestamp: 1458221800\n'
- 'setup-version: 4.321\n'
- '\n'
- '@ arc\n'
- 'sdesc: "The ARC archive utility"\n'
- 'ldesc: "This program is based on the MSDOS ARC program, version 5.21, plus a\n'
- 'few enhancements. ARC performs Huffman Squeezing on data. The Huffman\n'
- 'Squeeze algorithm was removed from MSDOS ARC after version 5.12. It\n'
- 'turns out to be more efficient than Lempel-Ziv style compression when\n'
- 'compressing graphic images. Squeeze analysis is always done now, and\n'
- 'the best of packing, squeezing, or crunching is used."\n'
- 'category: Archive\n'
- 'version: 4.32.7-10\n'
- 'install: x86/release/arc/arc-4.32.7-10.tar.bz2 14 '
- '6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348\n'
- 'source: x86/release/arc/arc-4.32.7-10-src.tar.bz2 14 '
- '6de201dfed1d45412509c65deb34690dc2d09c6aafccfe491fd2f440f92842b9c755b61dc7bcdd4cc0c9f18cf46c2b3a1241e99c4c2a33fff5555e7b2f0b6348\n'
- '\n'
- '@ base-cygwin\n'
- 'sdesc: "Initial base installation helper script"\n'
- 'ldesc: "Initial base installation helper script."\n'
- 'category: Base\n'
- 'version: 3.8-1\n'
- 'install: x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[prev]\n'
- 'version: 3.6-1\n'
- 'install: x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '\n'
- '@ cygwin\n'
- 'sdesc: "The UNIX emulation engine"\n'
- 'ldesc: "The UNIX emulation engine"\n'
- 'category: Base\n'
- 'requires: base-cygwin\n'
- 'version: 2.2.1-1\n'
- 'install: x86/release/cygwin/cygwin-2.2.1-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[prev]\n'
- 'version: 2.2.0-1\n'
- 'install: x86/release/cygwin/cygwin-2.2.0-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[test]\n'
- 'version: 2.3.0-0.3\n'
- 'install: x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '\n'
- '@ cygwin-debuginfo\n'
- 'sdesc: "Debug info for cygwin"\n'
- 'ldesc: "This package contains files necessary for debugging the\n'
- 'cygwin package with gdb."\n'
- 'category: Debug\n'
- 'requires: cygwin-debuginfo\n'
- 'version: 2.2.1-1\n'
- 'install: x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[prev]\n'
- 'version: 2.2.0-1\n'
- 'install: x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[test]\n'
- 'version: 2.3.0-0.3\n'
- 'install: x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '\n'
- '@ cygwin-devel\n'
- 'sdesc: "Core development files"\n'
- 'ldesc: "Core development files required to build Cygwin packages"\n'
- 'category: Devel\n'
- 'version: 2.2.1-1\n'
- 'install: x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[prev]\n'
- 'version: 2.2.0-1\n'
- 'install: x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '[test]\n'
- 'version: 2.3.0-0.3\n'
- 'install: x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '\n'
- '@ keychain\n'
- 'sdesc: "Key manager for OpenSSH"\n'
- 'ldesc: "Keychain is an OpenSSH key manager, typically run from\n'
- '~/.bash_profile. When keychain is run, it checks for a running\n'
- 'ssh-agent, otherwise it starts one. It saves the ssh-agent environment\n'
- 'variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins\n'
- 'and non-interactive shells such as cron jobs can source the file and\n'
- 'make passwordless ssh connections. In addition, when keychain runs, it\n'
- 'verifies that the key files specified on the command-line are known to\n'
- 'ssh-agent, otherwise it loads them, prompting you for a password if\n'
- 'necessary"\n'
- 'category: Utils\n'
- 'requires: openssh\n'
- 'version: 2.7.1-1\n'
- 'install: x86/release/keychain/keychain-2.7.1-1.tar.bz2 32219 '
- '0c7b7ad2636b6e23e40e8cb593196b3fabe9c44f7618ea9b2021b89ecdc08720a7f824be0beaa75c9e62dda9a7b5ed7e9c1ed147a1875c582e80866ad09533a2\n'
- 'source: x86/release/keychain/keychain-2.7.1-1-src.tar.bz2 134875 '
- 'cef733c5f1ba7380088ce4b12be0a70c3d657fd0e26beae11cf96bbbc2a02c492dafef700adac1059ee643208d76b5f19042e01d9628b2463b916b3dea13aa54\n'
- '[prev]\n'
- 'version: 2.6.8-1\n'
- 'install: x86/release/keychain/keychain-2.6.8-1.tar.bz2 30476 '
- '05af40c0fabbd2ea8f8b74719434371a47c7751986fe6411c17e18cda7d03947c5785ed164dfe59b7238831cc10d8e29f4f88bf3414420bd3231423f424c00bd\n'
- 'source: x86/release/keychain/keychain-2.6.8-1-src.tar.bz2 36347 '
- '2151b73a9ec2ece63a842ddad6de19bcfdf097b86d4cae932eeadfc64640997051254001f31081e80272e020887b9599188990368c833ba10886f0ba32a3415e\n'
- '\n'
- '@ libdns_sd-devel\n'
- 'sdesc: "Bonjour Zeroconf implementation"\n'
- 'ldesc: "Bonjour, also known as zero-configuration networking, enables\n'
- 'automatic discovery of computers, devices, and services on IP networks using\n'
- 'industry standard IP protocols."\n'
- 'category: Net\n'
- 'requires: libdns_sd1\n'
- 'version: 379.32.1-1\n'
- 'install: x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2 195 '
- 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
- 'source: x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 195 '
- 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
- '\n'
- '@ libdns_sd1\n'
- 'sdesc: "Bonjour Zeroconf implementation"\n'
- 'ldesc: "Bonjour, also known as zero-configuration networking, enables\n'
- 'automatic discovery of computers, devices, and services on IP networks using\n'
- 'industry standard IP protocols."\n'
- 'category: Net\n'
- 'version: 379.32.1-1\n'
- 'install: x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2 195 '
- 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
- 'source: x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 195 '
- 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
- '\n'
- '@ mDNSResponder\n'
- 'sdesc: "Bonjour Zeroconf implementation"\n'
- 'ldesc: "Bonjour, also known as zero-configuration networking, enables\n'
- 'automatic discovery of computers, devices, and services on IP networks using\n'
- 'industry standard IP protocols."\n'
- 'category: Net\n'
- 'requires: libdns_sd1\n'
- 'version: 379.32.1-1\n'
- 'install: x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 195 '
- 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
- 'source: x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 195 '
- 'aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83\n'
- 'message: mDNSResponder "The Cygwin mDNSResponder package contains only clients.\n'
- "If you do not already have the 'Bonjour Service' installed (it comes with\n"
- 'a number of popular Windows programs), then you can download it at\n'
- 'http://support.apple.com/kb/DL999"\n'
- '\n'
- '@ openssh\n'
- 'sdesc: "The OpenSSH server and client programs"\n'
- 'ldesc: "OpenSSH is a program for logging into a remote machine and for\n'
- '\texecuting commands on a remote machine.  It can replace rlogin and rsh,\n'
- '\tproviding encrypted communication between two machines."\n'
- 'category: Net\n'
- 'version: 7.2p2-1\n'
- 'install: x86/release/openssh/openssh-7.2p2-1.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- 'source: x86/release/openssh/openssh-7.2p2-1-src.tar.xz 228 '
- 'e675b0ac4bc2c3e1c4971bc56d77b0cd53a9bdf5632873a235d7582e29dfd3e8a7bb04b28f6cdee3e6b3d14c25ed39392538e3f628a9bfda6c905646ebc3c225\n'
- '\n'
- '@ perl-Net-SMTP-SSL\n'
- 'sdesc: "Perl distribution Net-SMTP-SSL"\n'
- 'ldesc: "Implements the same API as Net::SMTP, but uses IO::Socket::SSL for\n'
- 'its network operations in order to support encrypted connections."\n'
- 'category: Perl\n'
- 'version: 1.03-1\n'
- 'install: noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz 3180 '
- 'aac6428f56fed431da1430242a327f36f1ec1ca6106366acb6752dd87f1b9adb87767709be9279b2f9435d16cee003f119a5ed4519c7365c8411404555618e66\n'
- 'source: noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz 2752 '
- '4de528554acb0b63f2a964bc8a0421118f96ce05cb4c9d111983aaea1a4a93025b31627fd66875fa09c2dfaecc11a89f2a294bdd3c77055bfaa93a27fdfc1f07\n'
- '\n'
- '@ rpm-doc\n'
- 'sdesc: "Obsolete package for RPM package management system manual pages"\n'
- 'category: _obsolete\n'
- 'version: 999-1\n'
- 'install: x86/release/rpm-doc/rpm-doc-999-1.tar.bz2 42 '
- '28c70b843fe01d90a3eeab4a3617551d236cd0b7d69668d1b1b6c8b14a9fd050e4039c192894c93bdf31575771c58c1fea2a41c24c8da22d10080d8b032b6369\n'
- '[prev]\n'
- 'version: 4.1-2\n'
- 'install: x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2 50941 '
- '7cc9db802364252e3206ce9f75c8ca53813d8308a22a425b50ef695dd8e51568740b06739d3aa3399a83fb3d3e1345ab7e2ad03a1e9d47c02dded3363bf4f493\n'
- 'source: x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2 42 '
- '28c70b843fe01d90a3eeab4a3617551d236cd0b7d69668d1b1b6c8b14a9fd050e4039c192894c93bdf31575771c58c1fea2a41c24c8da22d10080d8b032b6369\n'
- '\n'
- '@ testpackage\n'
- 'sdesc: "A test package"\n'
- 'ldesc: "A test package"\n'
- 'category: Devel\n'
- 'version: 0.1-1\n'
- 'install: x86/release/testpackage/testpackage-0.1-1.tar.bz2 0 '
- 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e\n',)
diff --git a/testdata/pkglist/cygwin-pkg-maint b/testdata/pkglist/cygwin-pkg-maint
deleted file mode 100644
index c157e17..0000000
--- a/testdata/pkglist/cygwin-pkg-maint
+++ /dev/null
@@ -1,2501 +0,0 @@
-4ti2                                         Yue Ren/Marco Atzeri
-a2ps                                         Yaakov Selkowitz
-aalib                                        Dr. Volker Zell
-abook                                        Jari Aalto
-accerciser                                   Yaakov Selkowitz
-activity-log-manager                         Yaakov Selkowitz
-adobe-source-code-pro-fonts                  Yaakov Selkowitz
-adobe-source-sans-pro-fonts                  Yaakov Selkowitz
-adobe-source-serif-pro-fonts                 Yaakov Selkowitz
-adwaita-icon-theme                           Yaakov Selkowitz
-aewm++                                       Jari Aalto
-aewm++-goodies                               Jari Aalto
-afio                                         Jari Aalto
-akonadi                                      Yaakov Selkowitz
-alacarte                                     Yaakov Selkowitz
-alef-fonts                                   Yaakov Selkowitz
-algol68g                                     Thomas Wolff
-alternatives                                 ORPHANED (Charles Wilson)
-amd                                          Marco Atzeri
-amor                                         Yaakov Selkowitz
-analitza                                     Yaakov Selkowitz
-anjuta                                       Yaakov Selkowitz
-annoyance-filter                             Jari Aalto
-anthy                                        Yaakov Selkowitz
-antiword                                     Jari Aalto
-apng2gif                                     Jari Aalto
-apngasm                                      Jari Aalto
-apngdis                                      Jari Aalto
-apngopt                                      Jari Aalto
-apngtools                                    Jari Aalto
-appdata-tools                                Yaakov Selkowitz
-appres                                       Yaakov Selkowitz
-appstream-glib                               Yaakov Selkowitz
-arc                                          Jari Aalto
-archivemail                                  Jari Aalto
-aria2                                        ORPHANED
-arj                                          Jari Aalto
-ark                                          Yaakov Selkowitz
-arpack                                       Marco Atzeri
-artwiz-aleczapka-fonts                       Yaakov Selkowitz
-ascii                                        Yaakov Selkowitz
-asciidoc                                     ORPHANED (Eric Blake)
-aspell                                       Dr. Volker Zell
-aspell-de                                    Dr. Volker Zell
-aspell-en                                    Dr. Volker Zell
-aspell-pl                                    Dr. Volker Zell
-aspell-sv                                    Dr. Volker Zell
-astyle                                       ORPHANED (Chris Sutcliffe)
-asymptote                                    Ken Brown
-at-spi2-atk                                  Yaakov Selkowitz
-at-spi2-core                                 Yaakov Selkowitz
-atk1.0                                       Yaakov Selkowitz
-atkmm1.6                                     Yaakov Selkowitz
-AtomicParsley                                David Stacey
-atool                                        Andrew Schulman
-atril                                        Yaakov Selkowitz
-attica                                       Yaakov Selkowitz
-attr                                         Corinna Vinschen
-audiofile                                    Yaakov Selkowitz
-autobuild                                    ORPHANED (Charles Wilson)
-autoconf                                     Yaakov Selkowitz
-autoconf-archive                             Yaakov Selkowitz
-autoconf2.1                                  Yaakov Selkowitz
-autoconf2.5                                  Yaakov Selkowitz
-autogen                                      Yaakov Selkowitz
-automake                                     Yaakov Selkowitz
-automake1.10                                 Yaakov Selkowitz
-automake1.11                                 Yaakov Selkowitz
-automake1.12                                 Yaakov Selkowitz
-automake1.13                                 Yaakov Selkowitz
-automake1.14                                 Yaakov Selkowitz
-automake1.15                                 Yaakov Selkowitz
-automake1.4                                  Yaakov Selkowitz
-automake1.5                                  Yaakov Selkowitz
-automake1.6                                  Yaakov Selkowitz
-automake1.7                                  Yaakov Selkowitz
-automake1.8                                  Yaakov Selkowitz
-automake1.9                                  Yaakov Selkowitz
-automoc4                                     Yaakov Selkowitz
-autossh                                      Andrew Schulman
-autotrace                                    Marco Atzeri
-avahi                                        Yaakov Selkowitz
-aview                                        Jari Aalto
-balance                                      Dr. Volker Zell
-baloo                                        Yaakov Selkowitz
-baloo-widgets                                Yaakov Selkowitz
-baobab                                       Yaakov Selkowitz
-base-cygwin                                  Corinna Vinschen
-base-files                                   Achim Gratz
-bash                                         Eric Blake
-bash-completion                              Eric Blake
-bashdb                                       Eric Blake
-bc                                           Andrew Schulman
-bcrypt                                       Jari Aalto
-bdftopcf                                     Yaakov Selkowitz
-beforelight                                  Yaakov Selkowitz
-biber                                        Ken Brown
-bigreqsproto                                 Yaakov Selkowitz
-bind                                         Yaakov Selkowitz
-binutils                                     Jonathan Yong
-bison                                        Eric Blake
-bitmap                                       Yaakov Selkowitz
-blinken                                      Yaakov Selkowitz
-bmp2png                                      Jari Aalto
-bogofilter                                   Yaakov Selkowitz
-bomber                                       Yaakov Selkowitz
-bool                                         Jari Aalto
-boost                                        Yaakov Selkowitz
-botan1.10                                    Yaakov Selkowitz
-bovo                                         Yaakov Selkowitz
-boxes                                        Jari Aalto
-bsdiff                                       Marco Atzeri
-bsfilter                                     Jari Aalto
-bsflite                                      Dr. Volker Zell
-btf                                          Marco Atzeri
-build-docbook-catalog                        Yaakov Selkowitz
-buildbot-slave                               Jon Turney
-busybox                                      Christian Franke
-bvi                                          Jari Aalto
-byacc                                        ORPHANED
-bzip2                                        Yaakov Selkowitz
-bzr                                          Jari Aalto
-bzr-fastimport                               Ken Brown
-ca-certificates                              Yaakov Selkowitz
-cabextract                                   Stuart Caie
-cadaver                                      Dr. Volker Zell
-cairo                                        Yaakov Selkowitz
-cairomm1.0                                   Yaakov Selkowitz
-caja                                         Yaakov Selkowitz
-caja-actions                                 Yaakov Selkowitz
-caja-extensions                              Yaakov Selkowitz
-caja-follow-symlink                          Yaakov Selkowitz
-caja-python                                  Yaakov Selkowitz
-camd                                         Marco Atzeri
-cantarell-fonts                              Yaakov Selkowitz
-cantor                                       Yaakov Selkowitz
-caribou                                      Yaakov Selkowitz
-catdoc                                       Marco Atzeri
-catgets                                      Corinna Vinschen
-ccache                                       ORPHANED
-cccc                                         Jari Aalto
-ccdoc                                        ORPHANED (Joe Linoff)
-ccolamd                                      Marco Atzeri
-ccrypt                                       Marco Atzeri
-cdargs                                       Jari Aalto
-cddlib                                       Yue Ren/Marco Atzeri
-cdrkit                                       Christian Franke
-celt051                                      Yaakov Selkowitz
-cfget                                        Jari Aalto
-cfourcc                                      Jari Aalto
-cfv                                          Jari Aalto
-cgdb                                         Jari Aalto
-cgoban                                       ORPHANED (Teun Burgers)
-check                                        Yaakov Selkowitz
-checkbashisms                                Jari Aalto
-chere                                        Dave Kilroy
-chewmail                                     Jari Aalto
-chicken                                      Christian Kellermann
-chkconfig                                    Jari Aalto
-cholmod                                      Marco Atzeri
-choqok                                       Yaakov Selkowitz
-clamav                                       Yaakov Selkowitz
-clisp                                        Ken Brown
-cln                                          Yaakov Selkowitz
-cloog-isl                                    Achim Gratz
-clutter-gtk0.10                              Yaakov Selkowitz
-clutter-gtk1.0                               Yaakov Selkowitz
-clutter1.0                                   Yaakov Selkowitz
-cmake                                        Tony Kelman/William A. Hoffman
-cocom                                        Yaakov Selkowitz
-code2html                                    Jari Aalto
-codeville                                    Jari Aalto
-cogl                                         Yaakov Selkowitz
-colamd                                       Marco Atzeri
-colordiff                                    ORPHANED (Kostya Altukhov)
-colorgcc                                     Jari Aalto
-compface                                     Dr. Volker Zell
-compositeproto                               Yaakov Selkowitz
-connect-proxy                                Marco Atzeri
-connectagram                                 Yaakov Selkowitz
-convmv                                       Jari Aalto
-copyright-update                             Jari Aalto
-corebird                                     Yaakov Selkowitz
-coreutils                                    Eric Blake
-corkscrew                                    Jari Aalto
-cpio                                         Corinna Vinschen/Yaakov Selkowitz
-cppcheck                                     David Stacey
-cppi                                         Eric Blake
-cppunit                                      Yaakov Selkowitz
-cramfs                                       ORPHANED (Sam Robb)
-cron                                         Pierre A. Humblet
-crypt                                        Corinna Vinschen
-cscope                                       Jari Aalto
-csih                                         Corinna Vinschen
-ctags                                        Warren Young
-ctorrent                                     Jari Aalto
-ctris                                        ORPHANED
-culmus-fonts                                 Yaakov Selkowitz
-CUnit                                        Marco Atzeri
-curl                                         Yaakov Selkowitz
-cutemaze                                     Yaakov Selkowitz
-cvs                                          Marco Atzeri
-cvs2svn                                      Yaakov Selkowitz
-cvsps                                        ORPHANED (Eric Blake)
-cvsutils                                     Eric Blake
-cxsparse                                     Marco Atzeri
-cygcheck-dep                                 Mikhail Usenko
-cygport                                      Yaakov Selkowitz
-cygrunsrv                                    Corinna Vinschen
-cygutils                                     ORPHANED (Charles Wilson)
-cygwin                                       Corinna Vinschen/Yaakov Selkowitz
-cygwin-devel                                 Corinna Vinschen
-cygwin-doc                                   Jon Turney
-cygwin-x-doc                                 Jon Turney
-cygwin32                                     Yaakov Selkowitz
-cygwin32-binutils                            Yaakov Selkowitz
-cygwin32-bzip2                               Yaakov Selkowitz
-cygwin32-catgets                             Yaakov Selkowitz
-cygwin32-clang                               Yaakov Selkowitz
-cygwin32-cloog-isl                           Yaakov Selkowitz
-cygwin32-crypt                               Yaakov Selkowitz
-cygwin32-default-manifest                    Yaakov Selkowitz
-cygwin32-expat                               Yaakov Selkowitz
-cygwin32-freetype2                           Yaakov Selkowitz
-cygwin32-gcc                                 Yaakov Selkowitz
-cygwin32-gettext                             Yaakov Selkowitz
-cygwin32-gmp                                 Yaakov Selkowitz
-cygwin32-gnutls                              Yaakov Selkowitz
-cygwin32-isl                                 Yaakov Selkowitz
-cygwin32-jbigkit                             Yaakov Selkowitz
-cygwin32-libbfd                              Yaakov Selkowitz
-cygwin32-libedit                             Yaakov Selkowitz
-cygwin32-libffi                              Yaakov Selkowitz
-cygwin32-libiconv                            Yaakov Selkowitz
-cygwin32-libmpc                              Yaakov Selkowitz
-cygwin32-libpng                              Yaakov Selkowitz
-cygwin32-libtasn1                            Yaakov Selkowitz
-cygwin32-libtool                             Yaakov Selkowitz
-cygwin32-libX11                              Yaakov Selkowitz
-cygwin32-libXau                              Yaakov Selkowitz
-cygwin32-libxcb                              Yaakov Selkowitz
-cygwin32-libXdmcp                            Yaakov Selkowitz
-cygwin32-lzo2                                Yaakov Selkowitz
-cygwin32-mpfr                                Yaakov Selkowitz
-cygwin32-ncurses                             Yaakov Selkowitz
-cygwin32-nettle                              Yaakov Selkowitz
-cygwin32-openssl                             Yaakov Selkowitz
-cygwin32-p11-kit                             Yaakov Selkowitz
-cygwin32-pcre                                Yaakov Selkowitz
-cygwin32-pkg-config                          Yaakov Selkowitz
-cygwin32-readline                            Yaakov Selkowitz
-cygwin32-w32api-headers                      Yaakov Selkowitz
-cygwin32-w32api-runtime                      Yaakov Selkowitz
-cygwin32-xproto                              Yaakov Selkowitz
-cygwin32-zlib                                Yaakov Selkowitz
-cygwin64                                     Yaakov Selkowitz
-cygwin64-binutils                            Yaakov Selkowitz
-cygwin64-bzip2                               Yaakov Selkowitz
-cygwin64-catgets                             Yaakov Selkowitz
-cygwin64-clang                               Yaakov Selkowitz
-cygwin64-cloog-isl                           Yaakov Selkowitz
-cygwin64-crypt                               Yaakov Selkowitz
-cygwin64-db                                  Yaakov Selkowitz
-cygwin64-default-manifest                    Yaakov Selkowitz
-cygwin64-e2fsprogs                           Yaakov Selkowitz
-cygwin64-expat                               Yaakov Selkowitz
-cygwin64-fontconfig                          Yaakov Selkowitz
-cygwin64-freetype2                           Yaakov Selkowitz
-cygwin64-gcc                                 Yaakov Selkowitz
-cygwin64-gdbm                                Yaakov Selkowitz
-cygwin64-gettext                             Yaakov Selkowitz
-cygwin64-gmp                                 Yaakov Selkowitz
-cygwin64-gnutls                              Yaakov Selkowitz
-cygwin64-isl                                 Yaakov Selkowitz
-cygwin64-jbigkit                             Yaakov Selkowitz
-cygwin64-libarchive                          Yaakov Selkowitz
-cygwin64-libbfd                              Yaakov Selkowitz
-cygwin64-libdmx                              Yaakov Selkowitz
-cygwin64-libedit                             Yaakov Selkowitz
-cygwin64-libffi                              Yaakov Selkowitz
-cygwin64-libfontenc                          Yaakov Selkowitz
-cygwin64-libgcrypt                           Yaakov Selkowitz
-cygwin64-libgpg-error                        Yaakov Selkowitz
-cygwin64-libICE                              Yaakov Selkowitz
-cygwin64-libiconv                            Yaakov Selkowitz
-cygwin64-libjpeg-turbo                       Yaakov Selkowitz
-cygwin64-libmagic                            Yaakov Selkowitz
-cygwin64-libmpc                              Yaakov Selkowitz
-cygwin64-libpng                              Yaakov Selkowitz
-cygwin64-libSM                               Yaakov Selkowitz
-cygwin64-libssh2                             Yaakov Selkowitz
-cygwin64-libtasn1                            Yaakov Selkowitz
-cygwin64-libtool                             Yaakov Selkowitz
-cygwin64-libX11                              Yaakov Selkowitz
-cygwin64-libXau                              Yaakov Selkowitz
-cygwin64-libXaw                              Yaakov Selkowitz
-cygwin64-libxcb                              Yaakov Selkowitz
-cygwin64-libXcomposite                       Yaakov Selkowitz
-cygwin64-libXdamage                          Yaakov Selkowitz
-cygwin64-libXdmcp                            Yaakov Selkowitz
-cygwin64-libXext                             Yaakov Selkowitz
-cygwin64-libXfixes                           Yaakov Selkowitz
-cygwin64-libXft                              Yaakov Selkowitz
-cygwin64-libXi                               Yaakov Selkowitz
-cygwin64-libxml2                             Yaakov Selkowitz
-cygwin64-libXmu                              Yaakov Selkowitz
-cygwin64-libXpm                              Yaakov Selkowitz
-cygwin64-libXrandr                           Yaakov Selkowitz
-cygwin64-libXrender                          Yaakov Selkowitz
-cygwin64-libxslt                             Yaakov Selkowitz
-cygwin64-libXss                              Yaakov Selkowitz
-cygwin64-libXt                               Yaakov Selkowitz
-cygwin64-lzo2                                Yaakov Selkowitz
-cygwin64-mpfr                                Yaakov Selkowitz
-cygwin64-ncurses                             Yaakov Selkowitz
-cygwin64-nettle                              Yaakov Selkowitz
-cygwin64-openssl                             Yaakov Selkowitz
-cygwin64-p11-kit                             Yaakov Selkowitz
-cygwin64-pcre                                Yaakov Selkowitz
-cygwin64-pixman                              Yaakov Selkowitz
-cygwin64-pkg-config                          Yaakov Selkowitz
-cygwin64-popt                                Yaakov Selkowitz
-cygwin64-python                              Yaakov Selkowitz
-cygwin64-readline                            Yaakov Selkowitz
-cygwin64-sqlite3                             Yaakov Selkowitz
-cygwin64-tcl                                 Yaakov Selkowitz
-cygwin64-tiff                                Yaakov Selkowitz
-cygwin64-tk                                  Yaakov Selkowitz
-cygwin64-util-linux                          Yaakov Selkowitz
-cygwin64-w32api-headers                      Yaakov Selkowitz
-cygwin64-w32api-runtime                      Yaakov Selkowitz
-cygwin64-xcb-util                            Yaakov Selkowitz
-cygwin64-xcb-util-image                      Yaakov Selkowitz
-cygwin64-xcb-util-wm                         Yaakov Selkowitz
-cygwin64-xproto                              Yaakov Selkowitz
-cygwin64-zlib                                Yaakov Selkowitz
-cyrus-sasl                                   David Rothenberger
-damageproto                                  Yaakov Selkowitz
-dash                                         Eric Blake
-db                                           Dr. Volker Zell
-db4.5                                        Dr. Volker Zell
-db4.8                                        Dr. Volker Zell
-dblatex                                      Yaakov Selkowitz
-dbus                                         Yaakov Selkowitz
-dbus-glib                                    Yaakov Selkowitz
-dconf                                        Yaakov Selkowitz
-ddd                                          Jon Turney
-ddir                                         Jari Aalto
-ddrescue                                     Christian Franke
-dejagnu                                      Yaakov Selkowitz
-dejavu-fonts                                 Yaakov Selkowitz
-delta                                        Jari Aalto
-deroff                                       Jari Aalto
-desktop-file-utils                           Yaakov Selkowitz
-devhelp                                      Yaakov Selkowitz
-dhttpd                                       Jari Aalto
-dialog                                       Yaakov Selkowitz
-diffstat                                     Eric Blake
-diffutils                                    Eric Blake
-discus                                       Andrew Schulman
-distcc                                       ORPHANED (Harold L Hunt II)
-djvulibre                                    Yaakov Selkowitz
-dmalloc                                      Jon Turney
-dmtx-utils                                   Yaakov Selkowitz
-dmxproto                                     Yaakov Selkowitz
-docbook-dsssl                                Yaakov Selkowitz
-docbook-sgml30                               Yaakov Selkowitz
-docbook-sgml31                               Yaakov Selkowitz
-docbook-sgml40                               Yaakov Selkowitz
-docbook-sgml41                               Yaakov Selkowitz
-docbook-sgml42                               Yaakov Selkowitz
-docbook-sgml43                               Yaakov Selkowitz
-docbook-sgml44                               Yaakov Selkowitz
-docbook-sgml45                               Yaakov Selkowitz
-docbook-utils                                Yaakov Selkowitz
-docbook-xml-simple10                         Yaakov Selkowitz
-docbook-xml-simple11                         Yaakov Selkowitz
-docbook-xml412                               Yaakov Selkowitz
-docbook-xml42                                Yaakov Selkowitz
-docbook-xml43                                Yaakov Selkowitz
-docbook-xml44                                Yaakov Selkowitz
-docbook-xml45                                Yaakov Selkowitz
-docbook-xsl                                  Yaakov Selkowitz
-docbook-xsl-ns                               Yaakov Selkowitz
-docbook2X                                    Yaakov Selkowitz
-dog                                          Jari Aalto
-dos2unix                                     Erwin Waterlander
-doxygen                                      David Stacey
-duff                                         Jari Aalto
-e2fsimage                                    Yaakov Selkowitz
-e2fsprogs                                    Yaakov Selkowitz
-ebook-tools                                  Yaakov Selkowitz
-ed                                           Marco Atzeri
-editres                                      Yaakov Selkowitz
-editrights                                   Corinna Vinschen
-eekboard                                     Yaakov Selkowitz
-eigen3                                       Yaakov Selkowitz
-ELFIO                                        Serge Lamikhov-Center
-emacs                                        Ken Brown
-emacs-auctex                                 Ken Brown
-email                                        Corinna Vinschen
-empathy                                      Yaakov Selkowitz
-enchant                                      Yaakov Selkowitz
-engrampa                                     Yaakov Selkowitz
-enscript                                     Dr. Volker Zell
-eog                                          Yaakov Selkowitz
-eog-plugins                                  Yaakov Selkowitz
-eom                                          Yaakov Selkowitz
-epiphany                                     Yaakov Selkowitz
-epstool                                      Jari Aalto
-esound                                       Yaakov Selkowitz
-eventlog                                     Corinna Vinschen
-evince                                       Yaakov Selkowitz
-evolution                                    Yaakov Selkowitz
-evolution-data-server                        Yaakov Selkowitz
-evolution-ews                                Yaakov Selkowitz
-exempi                                       Yaakov Selkowitz
-exif                                         Yaakov Selkowitz
-exim                                         Pierre A. Humblet
-exiv2                                        Yaakov Selkowitz
-exo                                          Yaakov Selkowitz
-expat                                        Warren Young
-expect                                       Yaakov Selkowitz
-extra-cmake-modules                          Yaakov Selkowitz
-faience-icon-theme                           Yaakov Selkowitz
-farstream0.2                                 Yaakov Selkowitz
-fbpanel                                      Yaakov Selkowitz
-fbxkb                                        Yaakov Selkowitz
-fcgi                                         Ken Brown
-fcrackzip                                    Jari Aalto
-fdupes                                       Jari Aalto
-fetchmail                                    Corinna Vinschen
-ffcall                                       Ken Brown
-fftw3                                        Marco Atzeri
-figlet                                       Jari Aalto
-file                                         Corinna Vinschen/Yaakov Selkowitz
-file-roller                                  Yaakov Selkowitz
-findutils                                    Eric Blake
-fish                                         Andrew Schulman
-five-or-more                                 Yaakov Selkowitz
-fixesproto                                   Yaakov Selkowitz
-flac                                         David Rothenberger
-flawfinder                                   Jari Aalto
-flex                                         ORPHANED
-flexdll                                      Yaakov Selkowitz
-flint                                        Yue Ren/Marco Atzeri
-flip                                         Jari Aalto
-flog                                         Jari Aalto
-fltk                                         Yaakov Selkowitz
-fluidsynth                                   Yaakov Selkowitz
-focuswriter                                  Yaakov Selkowitz
-folks                                        Yaakov Selkowitz
-font-bitstream-vera-ttf                      Jon Turney
-font-util                                    Yaakov Selkowitz
-fontconfig                                   Yaakov Selkowitz
-fontforge                                    Yaakov Selkowitz
-fontsproto                                   Yaakov Selkowitz
-fonttosfnt                                   Yaakov Selkowitz
-foobillard                                   David Stacey
-fortune-mod                                  Yitzchak Scott-Thoennes
-fossil                                       Jari Aalto
-four-in-a-row                                Yaakov Selkowitz
-freeglut                                     Dr. Volker Zell
-freerdp                                      Yaakov Selkowitz
-freetds                                      Yaakov Selkowitz
-freetype2                                    Yaakov Selkowitz
-fribidi                                      Yaakov Selkowitz
-fslsfonts                                    Yaakov Selkowitz
-fstobdf                                      Yaakov Selkowitz
-fvwm                                         Yaakov Selkowitz
-gaffitter                                    ORPHANED (Kostya Altukhov)
-gamin                                        Yaakov Selkowitz
-garcon                                       Yaakov Selkowitz
-gawk                                         Corinna Vinschen
-gcc                                          Jonathan Yong
-gcc-tools-epoch1-autoconf                    ORPHANED (Charles Wilson)
-gcc-tools-epoch1-automake                    ORPHANED (Charles Wilson)
-gcc-tools-epoch2-autoconf                    ORPHANED (Charles Wilson)
-gcc-tools-epoch2-automake                    ORPHANED (Charles Wilson)
-gccmakedep                                   Yaakov Selkowitz
-GConf2                                       Yaakov Selkowitz
-gconfmm2.6                                   Yaakov Selkowitz
-gcr                                          Yaakov Selkowitz
-gd                                           Dr. Volker Zell
-gdb                                          Corinna Vinschen/Yaakov Selkowitz/Jon Turney
-gdbm                                         Yaakov Selkowitz
-gdk-pixbuf2.0                                Yaakov Selkowitz
-gdl3                                         Yaakov Selkowitz
-gedit                                        Yaakov Selkowitz
-gedit-code-assistance                        Yaakov Selkowitz
-gedit-plugins                                Yaakov Selkowitz
-gendef                                       Jonathan Yong
-geoclue                                      Yaakov Selkowitz
-geocode-glib                                 Yaakov Selkowitz
-GeoIP                                        Yaakov Selkowitz
-GeoIP-database                               Yaakov Selkowitz
-getent                                       Corinna Vinschen
-getmail                                      Jari Aalto
-gettext                                      Yaakov Selkowitz
-ghostscript                                  Dr. Volker Zell
-ghostscript-fonts-other                      Dr. Volker Zell
-ghostscript-fonts-std                        Dr. Volker Zell
-gif2apng                                     Jari Aalto
-giflib                                       Yaakov Selkowitz
-gigolo                                       Yaakov Selkowitz
-girara                                       Yaakov Selkowitz
-git                                          Adam Dinwoodie
-git-oodiff                                   Jari Aalto
-git-review                                   David Rothenberger
-gl2ps                                        Marco Atzeri
-glade                                        Yaakov Selkowitz
-glade2                                       Yaakov Selkowitz
-glade3                                       Yaakov Selkowitz
-gle                                          Yaakov Selkowitz
-glew                                         Yaakov Selkowitz
-glib1.2                                      Yaakov Selkowitz
-glib2.0                                      Yaakov Selkowitz
-glib2.0-networking                           Yaakov Selkowitz
-glibmm2.4                                    Yaakov Selkowitz
-glpk                                         Marco Atzeri
-glproto                                      Yaakov Selkowitz
-glu                                          Yaakov Selkowitz
-glw                                          Yaakov Selkowitz
-gmime2.6                                     Yaakov Selkowitz
-gmp                                          Achim Gratz
-gnome-activity-journal                       Yaakov Selkowitz
-gnome-applets                                Yaakov Selkowitz
-gnome-backgrounds                            Yaakov Selkowitz
-gnome-calculator                             Yaakov Selkowitz
-gnome-chess                                  Yaakov Selkowitz
-gnome-clocks                                 Yaakov Selkowitz
-gnome-code-assistance                        Yaakov Selkowitz
-gnome-common                                 Yaakov Selkowitz
-gnome-contacts                               Yaakov Selkowitz
-gnome-control-center                         Yaakov Selkowitz
-gnome-desktop                                Yaakov Selkowitz
-gnome-devel-docs                             Yaakov Selkowitz
-gnome-dictionary                             Yaakov Selkowitz
-gnome-doc-utils                              Yaakov Selkowitz
-gnome-flashback                              Yaakov Selkowitz
-gnome-font-viewer                            Yaakov Selkowitz
-gnome-getting-started-docs                   Yaakov Selkowitz
-gnome-icon-theme                             Yaakov Selkowitz
-gnome-keyring                                Yaakov Selkowitz
-gnome-klotski                                Yaakov Selkowitz
-gnome-mahjongg                               Yaakov Selkowitz
-gnome-menus                                  Yaakov Selkowitz
-gnome-mime-data                              Yaakov Selkowitz
-gnome-mines                                  Yaakov Selkowitz
-gnome-nibbles                                Yaakov Selkowitz
-gnome-online-accounts                        Yaakov Selkowitz
-gnome-panel                                  Yaakov Selkowitz
-gnome-python                                 Yaakov Selkowitz
-gnome-python-desktop                         Yaakov Selkowitz
-gnome-python-extras                          Yaakov Selkowitz
-gnome-robots                                 Yaakov Selkowitz
-gnome-screenshot                             Yaakov Selkowitz
-gnome-session                                Yaakov Selkowitz
-gnome-settings-daemon                        Yaakov Selkowitz
-gnome-sudoku                                 Yaakov Selkowitz
-gnome-system-log                             Yaakov Selkowitz
-gnome-system-monitor                         Yaakov Selkowitz
-gnome-terminal                               Yaakov Selkowitz
-gnome-tetravex                               Yaakov Selkowitz
-gnome-themes-standard                        Yaakov Selkowitz
-gnome-tweak-tool                             Yaakov Selkowitz
-gnome-user-docs                              Yaakov Selkowitz
-gnome-vfs2                                   Yaakov Selkowitz
-gnome-vfsmm2.6                               Yaakov Selkowitz
-gnu-free-fonts                               Yaakov Selkowitz
-gnubg                                        Dr. Volker Zell
-gnucap                                       Achim Gratz
-gnuchess                                     Yaakov Selkowitz
-gnugo                                        ORPHANED
-gnupg                                        Marco Atzeri
-gnuplot                                      Dr. Volker Zell
-gnutls                                       Dr. Volker Zell
-gob2                                         Yaakov Selkowitz
-gobject-introspection                        Yaakov Selkowitz
-goffice0.10                                  Yaakov Selkowitz
-goffice0.8                                   Yaakov Selkowitz
-gom                                          Yaakov Selkowitz
-goocanvas                                    Yaakov Selkowitz
-goocanvas2.0                                 Yaakov Selkowitz
-goocanvasmm2.0                               Yaakov Selkowitz
-google-breakpad                              Jon Turney
-googlecl                                     ORPHANED (Chris Sutcliffe)
-gottet                                       Yaakov Selkowitz
-gperf                                        Eric Blake
-gpgme                                        Yaakov Selkowitz
-gpicview                                     Yaakov Selkowitz
-gq                                           Dr. Volker Zell
-grace                                        Yaakov Selkowitz
-granatier                                    Yaakov Selkowitz
-GraphicsMagick                               Marco Atzeri
-graphite2                                    Yaakov Selkowitz
-graphviz                                     Yaakov Selkowitz
-greed                                        Jari Aalto
-grep                                         Eric Blake
-grepmail                                     Jari Aalto
-grilo0.2                                     Yaakov Selkowitz
-grilo0.2-plugins                             Yaakov Selkowitz
-groff                                        Achim Gratz
-gsettings-desktop-schemas                    Yaakov Selkowitz
-gsl                                          ORPHANED (Teun Burgers)
-gsm                                          Yaakov Selkowitz
-gstreamer0.10                                Yaakov Selkowitz
-gstreamer0.10-plugins-base                   Yaakov Selkowitz
-gstreamer0.10-plugins-good                   Yaakov Selkowitz
-gstreamer1.0                                 Yaakov Selkowitz
-gstreamer1.0-plugins-base                    Yaakov Selkowitz
-gstreamer1.0-plugins-good                    Yaakov Selkowitz
-gt                                           Yaakov Selkowitz
-gt5                                          Jari Aalto
-gtk-doc                                      Yaakov Selkowitz
-gtk-vnc                                      Yaakov Selkowitz
-gtk1.2                                       Yaakov Selkowitz
-gtk1.2-engines                               Yaakov Selkowitz
-gtk2.0                                       Yaakov Selkowitz
-gtk2.0-engines                               Yaakov Selkowitz
-gtk2.0-engines-murrine                       Yaakov Selkowitz
-gtk2.0-engines-smooth                        Yaakov Selkowitz
-gtk3                                         Yaakov Selkowitz
-gtk3-engines-unico                           Yaakov Selkowitz
-gtkglarea2.0                                 Yaakov Selkowitz
-gtkglext1.0                                  Yaakov Selkowitz
-gtkhtml4.0                                   Yaakov Selkowitz
-gtkmm2.4                                     Yaakov Selkowitz
-gtkmm3.0                                     Yaakov Selkowitz
-gtkperf                                      Mike DePaulo
-gtksourceview2.0                             Yaakov Selkowitz
-gtksourceview3.0                             Yaakov Selkowitz
-gtksourceviewmm2.0                           Yaakov Selkowitz
-gtksourceviewmm3.0                           Yaakov Selkowitz
-gtkspell                                     Yaakov Selkowitz
-gtkspell3                                    Yaakov Selkowitz
-gts                                          Yaakov Selkowitz
-gtypist                                      Yaakov Selkowitz
-gucharmap                                    Yaakov Selkowitz
-guile                                        Marco Atzeri
-guilt                                        Jari Aalto
-gv                                           Dr. Volker Zell
-gvfs                                         Yaakov Selkowitz
-gzip                                         Eric Blake
-harfbuzz                                     Yaakov Selkowitz
-hdf5                                         Marco Atzeri
-hdparm                                       ORPHANED (Christian Franke)
-help2man                                     Yaakov Selkowitz
-hexalate                                     Yaakov Selkowitz
-hexchat                                      Yaakov Selkowitz
-hexedit                                      ORPHANED
-hicolor-icon-theme                           Yaakov Selkowitz
-hidapi                                       Wei-Ren Chen
-highlight                                    Yaakov Selkowitz
-hitori                                       Yaakov Selkowitz
-hostname                                     Christian Franke
-hp2xx                                        Dr. Volker Zell
-html2ps                                      Yaakov Selkowitz
-httpd                                        Yaakov Selkowitz
-httperf                                      Dr. Volker Zell
-httping                                      Jari Aalto
-httptunnel                                   Jari Aalto
-hunspell                                     Yaakov Selkowitz
-hwloc                                        Marco Atzeri
-iagno                                        Yaakov Selkowitz
-ibus                                         Yaakov Selkowitz
-ibus-anthy                                   Yaakov Selkowitz
-ibus-chewing                                 Yaakov Selkowitz
-ibus-gucharmap                               Yaakov Selkowitz
-ibus-handwrite                               Yaakov Selkowitz
-ibus-hangul                                  Yaakov Selkowitz
-ibus-input-pad                               Yaakov Selkowitz
-ibus-kkc                                     Yaakov Selkowitz
-ibus-m17n                                    Yaakov Selkowitz
-ibus-pinyin                                  Yaakov Selkowitz
-ibus-qt                                      Yaakov Selkowitz
-ibus-skk                                     Yaakov Selkowitz
-ibus-unikey                                  Yaakov Selkowitz
-ibus-xkb                                     Yaakov Selkowitz
-iceauth                                      Yaakov Selkowitz
-ico                                          Yaakov Selkowitz
-icon-naming-utils                            Yaakov Selkowitz
-icoutils                                     David Stacey
-icu                                          Ken Brown
-ifile                                        Jari Aalto
-ii                                           Jari Aalto
-ilmbase                                      Yaakov Selkowitz
-im-chooser                                   Yaakov Selkowitz
-ImageMagick                                  Marco Atzeri
-imake                                        Yaakov Selkowitz
-imlib                                        Yaakov Selkowitz
-imlib2                                       Yaakov Selkowitz
-imsettings                                   Yaakov Selkowitz
-inconsolata-fonts                            Yaakov Selkowitz
-indent                                       Jari Aalto
-inetutils                                    ORPHANED (Charles Wilson)
-initscripts                                  Dr. Volker Zell
-input-pad                                    Yaakov Selkowitz
-inputproto                                   Yaakov Selkowitz
-integrit                                     Jari Aalto
-intltool                                     Yaakov Selkowitz
-ioperm                                       ORPHANED (Marcel Telka)
-ipc-utils                                    Corinna Vinschen
-ipcalc                                       Jari Aalto
-iperf                                        Joel Johnson
-iprint                                       Jari Aalto
-irssi                                        Marco Atzeri
-iselect                                      Jari Aalto
-isl                                          Achim Gratz
-iso-codes                                    Yaakov Selkowitz
-isomaster                                    Christian Franke
-itstool                                      Yaakov Selkowitz
-jasper                                       Dr. Volker Zell
-jbigkit                                      Yaakov Selkowitz
-jgraph                                       Dr. Volker Zell
-jlint                                        Jari Aalto
-joe                                          Jari Aalto
-js185                                        Yaakov Selkowitz
-json-c                                       Yaakov Selkowitz
-json-glib1.0                                 Yaakov Selkowitz
-kactivities                                  Yaakov Selkowitz
-kajongg                                      Yaakov Selkowitz
-kalgebra                                     Yaakov Selkowitz
-kalzium                                      Yaakov Selkowitz
-kanagram                                     Yaakov Selkowitz
-kanjistrokeorders-fonts                      Yaakov Selkowitz
-kapman                                       Yaakov Selkowitz
-kapow                                        Yaakov Selkowitz
-kasumi                                       Yaakov Selkowitz
-kate                                         Yaakov Selkowitz
-kate4                                        Yaakov Selkowitz
-katomic                                      Yaakov Selkowitz
-kblackbox                                    Yaakov Selkowitz
-kblocks                                      Yaakov Selkowitz
-kbounce                                      Yaakov Selkowitz
-kbproto                                      Yaakov Selkowitz
-kbrickbuster                                 Yaakov Selkowitz
-kbruch                                       Yaakov Selkowitz
-kcalc                                        Yaakov Selkowitz
-kcharselect                                  Yaakov Selkowitz
-kde-base-artwork                             Yaakov Selkowitz
-kde-baseapps                                 Yaakov Selkowitz
-kde-l10n-ar                                  Yaakov Selkowitz
-kde-l10n-bg                                  Yaakov Selkowitz
-kde-l10n-bs                                  Yaakov Selkowitz
-kde-l10n-ca                                  Yaakov Selkowitz
-kde-l10n-ca-valencia                         Yaakov Selkowitz
-kde-l10n-cs                                  Yaakov Selkowitz
-kde-l10n-da                                  Yaakov Selkowitz
-kde-l10n-de                                  Yaakov Selkowitz
-kde-l10n-el                                  Yaakov Selkowitz
-kde-l10n-en_GB                               Yaakov Selkowitz
-kde-l10n-es                                  Yaakov Selkowitz
-kde-l10n-et                                  Yaakov Selkowitz
-kde-l10n-eu                                  Yaakov Selkowitz
-kde-l10n-fa                                  Yaakov Selkowitz
-kde-l10n-fi                                  Yaakov Selkowitz
-kde-l10n-fr                                  Yaakov Selkowitz
-kde-l10n-ga                                  Yaakov Selkowitz
-kde-l10n-gl                                  Yaakov Selkowitz
-kde-l10n-he                                  Yaakov Selkowitz
-kde-l10n-hi                                  Yaakov Selkowitz
-kde-l10n-hr                                  Yaakov Selkowitz
-kde-l10n-hu                                  Yaakov Selkowitz
-kde-l10n-ia                                  Yaakov Selkowitz
-kde-l10n-id                                  Yaakov Selkowitz
-kde-l10n-is                                  Yaakov Selkowitz
-kde-l10n-it                                  Yaakov Selkowitz
-kde-l10n-ja                                  Yaakov Selkowitz
-kde-l10n-kk                                  Yaakov Selkowitz
-kde-l10n-km                                  Yaakov Selkowitz
-kde-l10n-kn                                  Yaakov Selkowitz
-kde-l10n-ko                                  Yaakov Selkowitz
-kde-l10n-lt                                  Yaakov Selkowitz
-kde-l10n-lv                                  Yaakov Selkowitz
-kde-l10n-mr                                  Yaakov Selkowitz
-kde-l10n-nb                                  Yaakov Selkowitz
-kde-l10n-nds                                 Yaakov Selkowitz
-kde-l10n-nl                                  Yaakov Selkowitz
-kde-l10n-nn                                  Yaakov Selkowitz
-kde-l10n-pa                                  Yaakov Selkowitz
-kde-l10n-pl                                  Yaakov Selkowitz
-kde-l10n-pt                                  Yaakov Selkowitz
-kde-l10n-pt_BR                               Yaakov Selkowitz
-kde-l10n-ro                                  Yaakov Selkowitz
-kde-l10n-ru                                  Yaakov Selkowitz
-kde-l10n-si                                  Yaakov Selkowitz
-kde-l10n-sk                                  Yaakov Selkowitz
-kde-l10n-sl                                  Yaakov Selkowitz
-kde-l10n-sr                                  Yaakov Selkowitz
-kde-l10n-sv                                  Yaakov Selkowitz
-kde-l10n-tg                                  Yaakov Selkowitz
-kde-l10n-th                                  Yaakov Selkowitz
-kde-l10n-tr                                  Yaakov Selkowitz
-kde-l10n-ug                                  Yaakov Selkowitz
-kde-l10n-uk                                  Yaakov Selkowitz
-kde-l10n-vi                                  Yaakov Selkowitz
-kde-l10n-wa                                  Yaakov Selkowitz
-kde-l10n-zh_CN                               Yaakov Selkowitz
-kde-l10n-zh_TW                               Yaakov Selkowitz
-kde-runtime                                  Yaakov Selkowitz
-kde-wallpapers                               Yaakov Selkowitz
-kde-workspace                                Yaakov Selkowitz
-kdeedu-data                                  Yaakov Selkowitz
-kdegraphics-mobipocket                       Yaakov Selkowitz
-kdelibs                                      Yaakov Selkowitz
-kdepimlibs                                   Yaakov Selkowitz
-kdewebdev                                    Yaakov Selkowitz
-kdf                                          Yaakov Selkowitz
-kdiamond                                     Yaakov Selkowitz
-keepassx                                     David Stacey
-keychain                                     Jari Aalto
-kf5-attica                                   Yaakov Selkowitz
-kf5-frameworkintegration                     Yaakov Selkowitz
-kf5-kactivities                              Yaakov Selkowitz
-kf5-kapidox                                  Yaakov Selkowitz
-kf5-karchive                                 Yaakov Selkowitz
-kf5-kauth                                    Yaakov Selkowitz
-kf5-kbookmarks                               Yaakov Selkowitz
-kf5-kcmutils                                 Yaakov Selkowitz
-kf5-kcodecs                                  Yaakov Selkowitz
-kf5-kcompletion                              Yaakov Selkowitz
-kf5-kconfig                                  Yaakov Selkowitz
-kf5-kconfigwidgets                           Yaakov Selkowitz
-kf5-kcoreaddons                              Yaakov Selkowitz
-kf5-kcrash                                   Yaakov Selkowitz
-kf5-kdbusaddons                              Yaakov Selkowitz
-kf5-kdeclarative                             Yaakov Selkowitz
-kf5-kded                                     Yaakov Selkowitz
-kf5-kdelibs4support                          Yaakov Selkowitz
-kf5-kdesignerplugin                          Yaakov Selkowitz
-kf5-kdewebkit                                Yaakov Selkowitz
-kf5-kdnssd                                   Yaakov Selkowitz
-kf5-kdoctools                                Yaakov Selkowitz
-kf5-kemoticons                               Yaakov Selkowitz
-kf5-kglobalaccel                             Yaakov Selkowitz
-kf5-kguiaddons                               Yaakov Selkowitz
-kf5-khtml                                    Yaakov Selkowitz
-kf5-ki18n                                    Yaakov Selkowitz
-kf5-kiconthemes                              Yaakov Selkowitz
-kf5-kidletime                                Yaakov Selkowitz
-kf5-kimageformats                            Yaakov Selkowitz
-kf5-kinit                                    Yaakov Selkowitz
-kf5-kio                                      Yaakov Selkowitz
-kf5-kitemmodels                              Yaakov Selkowitz
-kf5-kitemviews                               Yaakov Selkowitz
-kf5-kjobwidgets                              Yaakov Selkowitz
-kf5-kjs                                      Yaakov Selkowitz
-kf5-kjsembed                                 Yaakov Selkowitz
-kf5-kmediaplayer                             Yaakov Selkowitz
-kf5-knewstuff                                Yaakov Selkowitz
-kf5-knotifications                           Yaakov Selkowitz
-kf5-knotifyconfig                            Yaakov Selkowitz
-kf5-kpackage                                 Yaakov Selkowitz
-kf5-kparts                                   Yaakov Selkowitz
-kf5-kpeople                                  Yaakov Selkowitz
-kf5-kplotting                                Yaakov Selkowitz
-kf5-kpty                                     Yaakov Selkowitz
-kf5-kross                                    Yaakov Selkowitz
-kf5-kross-interpreters                       Yaakov Selkowitz
-kf5-krunner                                  Yaakov Selkowitz
-kf5-kservice                                 Yaakov Selkowitz
-kf5-ktexteditor                              Yaakov Selkowitz
-kf5-ktextwidgets                             Yaakov Selkowitz
-kf5-kunitconversion                          Yaakov Selkowitz
-kf5-kwallet                                  Yaakov Selkowitz
-kf5-kwidgetsaddons                           Yaakov Selkowitz
-kf5-kwindowsystem                            Yaakov Selkowitz
-kf5-kxmlgui                                  Yaakov Selkowitz
-kf5-kxmlrpcclient                            Yaakov Selkowitz
-kf5-libkdegames                              Yaakov Selkowitz
-kf5-libkmahjongg                             Yaakov Selkowitz
-kf5-plasma                                   Yaakov Selkowitz
-kf5-solid                                    Yaakov Selkowitz
-kf5-sonnet                                   Yaakov Selkowitz
-kf5-threadweaver                             Yaakov Selkowitz
-kfilemetadata                                Yaakov Selkowitz
-kfourinline                                  Yaakov Selkowitz
-kgb                                          Jari Aalto
-kgeography                                   Yaakov Selkowitz
-kget                                         Yaakov Selkowitz
-kgoldrunner                                  Yaakov Selkowitz
-kgpg                                         Yaakov Selkowitz
-khangman                                     Yaakov Selkowitz
-khronos-opengl-registry                      Jon Turney
-kig                                          Yaakov Selkowitz
-kigo                                         Yaakov Selkowitz
-killbots                                     Yaakov Selkowitz
-kiriki                                       Yaakov Selkowitz
-kiten                                        Yaakov Selkowitz
-kjumpingcube                                 Yaakov Selkowitz
-klavaro                                      Yaakov Selkowitz
-klettres                                     Yaakov Selkowitz
-klickety                                     Yaakov Selkowitz
-klines                                       Yaakov Selkowitz
-klu                                          Marco Atzeri
-kmahjongg                                    Yaakov Selkowitz
-kmines                                       Yaakov Selkowitz
-kmplot                                       Yaakov Selkowitz
-knavalbattle                                 Yaakov Selkowitz
-knetwalk                                     Yaakov Selkowitz
-kolf                                         Yaakov Selkowitz
-kollision                                    Yaakov Selkowitz
-konquest                                     Yaakov Selkowitz
-konsole                                      Yaakov Selkowitz
-konsole4                                     Yaakov Selkowitz
-konversation                                 Yaakov Selkowitz
-kpat                                         Yaakov Selkowitz
-krb5                                         Yaakov Selkowitz
-krb5-auth-dialog                             Yaakov Selkowitz
-krdc                                         Yaakov Selkowitz
-kreversi                                     Yaakov Selkowitz
-krfb                                         Yaakov Selkowitz
-kshisen                                      Yaakov Selkowitz
-ksirk                                        Yaakov Selkowitz
-ksnakeduel                                   Yaakov Selkowitz
-kspaceduel                                   Yaakov Selkowitz
-ksquares                                     Yaakov Selkowitz
-kstars                                       Yaakov Selkowitz
-ksudoku                                      Yaakov Selkowitz
-ksystemlog                                   Yaakov Selkowitz
-kteatime                                     Yaakov Selkowitz
-ktimer                                       Yaakov Selkowitz
-ktorrent                                     Yaakov Selkowitz
-ktouch                                       Yaakov Selkowitz
-ktuberling                                   Yaakov Selkowitz
-kturtle                                      Yaakov Selkowitz
-kubrick                                      Yaakov Selkowitz
-kwalletmanager                               Yaakov Selkowitz
-kwebkitpart                                  Yaakov Selkowitz
-kwordquiz                                    Yaakov Selkowitz
-lapack                                       Marco Atzeri
-lasem0.4                                     Yaakov Selkowitz
-lcab                                         Jari Aalto
-lcms                                         Dr. Volker Zell
-lcms2                                        Dr. Volker Zell
-ldl                                          Marco Atzeri
-leafpad                                      Yaakov Selkowitz
-leptonica                                    Marco Atzeri
-less                                         Marco Atzeri
-lftp                                         Andrew Schulman
-libao                                        David Rothenberger
-libapr1                                      David Rothenberger
-libaprutil1                                  David Rothenberger
-libarchive                                   Yaakov Selkowitz
-libargp                                      Andrew Schulman
-libart_lgpl_2                                Yaakov Selkowitz
-libassuan                                    ORPHANED (Charles Wilson)
-libasyncns                                   Yaakov Selkowitz
-libbonobo2                                   Yaakov Selkowitz
-libbonoboui2                                 Yaakov Selkowitz
-libcaca                                      Yaakov Selkowitz
-libcanberra                                  Yaakov Selkowitz
-libchamplain0.12                             Yaakov Selkowitz
-libchewing                                   Yaakov Selkowitz
-libcroco0.6                                  Yaakov Selkowitz
-libdaemon                                    Yaakov Selkowitz
-libdatrie                                    Yaakov Selkowitz
-libdbusmenu-qt                               Yaakov Selkowitz
-libdbusmenu-qt5                              Yaakov Selkowitz
-libdiscid                                    Dr. Volker Zell
-libdmapsharing3.0                            Yaakov Selkowitz
-libdmtx                                      Yaakov Selkowitz
-libdmx                                       Yaakov Selkowitz
-libdv                                        Yaakov Selkowitz
-libebml                                      David Stacey
-libedit                                      Corinna Vinschen
-libelf                                       Yaakov Selkowitz
-libEMF                                       Dr. Volker Zell
-libepoxy                                     Yaakov Selkowitz
-liberation-fonts                             Yaakov Selkowitz
-libesmtp                                     Yaakov Selkowitz
-libevent                                     Yaakov Selkowitz
-libexif                                      Yaakov Selkowitz
-libfakesu                                    Daniel Boland
-libffi                                       Yaakov Selkowitz
-libfm                                        Yaakov Selkowitz
-libfontenc                                   Yaakov Selkowitz
-libfpx                                       Dr. Volker Zell
-libFS                                        Yaakov Selkowitz
-libgc                                        Bob Heckel
-libgcrypt                                    Yaakov Selkowitz
-libgda5.0                                    Yaakov Selkowitz
-libgdamm5.0                                  Yaakov Selkowitz
-libgdata                                     Yaakov Selkowitz
-libgee                                       Yaakov Selkowitz
-libgee0.8                                    Yaakov Selkowitz
-libgeotiff                                   Marco Atzeri
-libggi2                                      Peter Rosin
-libggimisc2                                  Peter Rosin
-libggiwmh0                                   Peter Rosin
-libgii1                                      Peter Rosin
-libgit2                                      Yaakov Selkowitz
-libgit2-glib1.0                              Yaakov Selkowitz
-libglade2.0                                  Yaakov Selkowitz
-libglademm2.4                                Yaakov Selkowitz
-libgnome-keyring                             Yaakov Selkowitz
-libgnome2                                    Yaakov Selkowitz
-libgnomecanvas2                              Yaakov Selkowitz
-libgnomecanvasmm2.6                          Yaakov Selkowitz
-libgnomekbd                                  Yaakov Selkowitz
-libgnomemm2.6                                Yaakov Selkowitz
-libgnomeui2                                  Yaakov Selkowitz
-libgnomeuimm2.6                              Yaakov Selkowitz
-libgpg-error                                 Yaakov Selkowitz
-libgsf                                       Yaakov Selkowitz
-libgtop2.0                                   Yaakov Selkowitz
-libgucharmap                                 Yaakov Selkowitz
-libgweather                                  Yaakov Selkowitz
-libgxps                                      Yaakov Selkowitz
-libhangul                                    Yaakov Selkowitz
-libical                                      Yaakov Selkowitz
-libICE                                       Yaakov Selkowitz
-libiconv                                     Yaakov Selkowitz
-libid3tag                                    Yaakov Selkowitz
-libIDL2                                      Yaakov Selkowitz
-libidn                                       Dr. Volker Zell
-libiodbc                                     Yaakov Selkowitz
-libjpeg-turbo                                Yaakov Selkowitz
-libkate                                      David Rothenberger
-libkdeedu                                    Yaakov Selkowitz
-libkdegames                                  Yaakov Selkowitz
-libkeduvocdocument                           Yaakov Selkowitz
-libkkc                                       Yaakov Selkowitz
-libkkc-data                                  Yaakov Selkowitz
-libkmahjongg                                 Yaakov Selkowitz
-libksba                                      ORPHANED (Charles Wilson)
-libktorrent                                  Yaakov Selkowitz
-libLASi                                      Yaakov Selkowitz
-liblqr1                                      Yaakov Selkowitz
-liblzo2                                      Dr. Volker Zell
-libmangle                                    Jonathan Yong
-libmatekbd                                   Yaakov Selkowitz
-libmateweather                               Yaakov Selkowitz
-libmatroska                                  David Stacey
-libmcrypt                                    Dr. Volker Zell
-libmediaart1.0                               Yaakov Selkowitz
-libmetalink                                  Yaakov Selkowitz
-libmikmod                                    Yaakov Selkowitz
-libmng                                       Dr. Volker Zell
-libmodplug                                   Yaakov Selkowitz
-libmspack                                    Yaakov Selkowitz
-libnfc                                       Marcos Vives Del Sol
-libnice                                      Yaakov Selkowitz
-libnotify                                    Yaakov Selkowitz
-liboauth                                     Yaakov Selkowitz
-libogg                                       David Rothenberger
-libotf                                       Yaakov Selkowitz
-libpaper                                     Yaakov Selkowitz
-libpeas                                      Yaakov Selkowitz
-libpipeline                                  Erwin Waterlander
-libpng                                       Yaakov Selkowitz
-libpng10                                     Yaakov Selkowitz
-libpng12                                     Yaakov Selkowitz
-libpng14                                     Yaakov Selkowitz
-libpng15                                     Yaakov Selkowitz
-libproxy                                     Yaakov Selkowitz
-libpst                                       Yaakov Selkowitz
-libqalculate                                 Yaakov Selkowitz
-libquvi0.9                                   Yaakov Selkowitz
-libquvi0.9-scripts                           Yaakov Selkowitz
-libqzeitgeist                                Yaakov Selkowitz
-librest0.7                                   Yaakov Selkowitz
-librsvg2                                     Yaakov Selkowitz
-librsync                                     David Rothenberger
-libsamplerate                                Yaakov Selkowitz
-libsecret1                                   Yaakov Selkowitz
-libshout                                     Yaakov Selkowitz
-libsigc2.0                                   Yaakov Selkowitz
-libsigsegv                                   Eric Blake
-libskk                                       Yaakov Selkowitz
-libSM                                        Yaakov Selkowitz
-libsmi                                       Dr. Volker Zell
-libsndfile                                   Yaakov Selkowitz
-libsoup2.4                                   Yaakov Selkowitz
-libspectre                                   Yaakov Selkowitz
-libspiro                                     Yaakov Selkowitz
-libssh                                       Yaakov Selkowitz
-libssh2                                      Yaakov Selkowitz
-libtasn1                                     Dr. Volker Zell
-libtextcat                                   ORPHANED (Reini Urban)
-libthai                                      Yaakov Selkowitz
-libtheora                                    David Rothenberger
-libtimidity                                  Yaakov Selkowitz
-libtirpc                                     Yaakov Selkowitz
-libtool                                      Yaakov Selkowitz
-libtorrent                                   Marco Atzeri
-libungif                                     Yaakov Selkowitz
-libuninameslist                              Yaakov Selkowitz
-libunique1.0                                 Yaakov Selkowitz
-libunique3.0                                 Yaakov Selkowitz
-libunistring                                 Erwin Waterlander
-libusb-win32                                 Yaakov Selkowitz
-libusb1.0                                    Yaakov Selkowitz
-libustr                                      ORPHANED (Charles Wilson)
-libverto                                     Yaakov Selkowitz
-libvncserver                                 Yaakov Selkowitz
-libvoikko                                    Yaakov Selkowitz
-libvorbis                                    David Rothenberger
-libvpx                                       Yaakov Selkowitz
-libwebp                                      Yaakov Selkowitz
-libWindowsWM                                 Yaakov Selkowitz
-libwmf                                       Dr. Volker Zell
-libwnck                                      Yaakov Selkowitz
-libwnck3                                     Yaakov Selkowitz
-libX11                                       Yaakov Selkowitz
-libXau                                       Yaakov Selkowitz
-libXaw                                       Yaakov Selkowitz
-libXaw3d                                     Yaakov Selkowitz
-libxcb                                       Yaakov Selkowitz
-libXcomposite                                Yaakov Selkowitz
-libXcursor                                   Yaakov Selkowitz
-libxcwm                                      Jon Turney
-libXdamage                                   Yaakov Selkowitz
-libXdmcp                                     Yaakov Selkowitz
-libXext                                      Yaakov Selkowitz
-libxfce4ui                                   Yaakov Selkowitz
-libxfce4util                                 Yaakov Selkowitz
-libxfcegui4                                  Yaakov Selkowitz
-libXfixes                                    Yaakov Selkowitz
-libXfont                                     Yaakov Selkowitz
-libXft                                       Yaakov Selkowitz
-libXi                                        Yaakov Selkowitz
-libXinerama                                  Yaakov Selkowitz
-libxkbcommon                                 Yaakov Selkowitz
-libxkbfile                                   Yaakov Selkowitz
-libxklavier                                  Yaakov Selkowitz
-libxml++2.6                                  Yaakov Selkowitz
-libxml2                                      Yaakov Selkowitz
-libXmu                                       Yaakov Selkowitz
-libXpm                                       Yaakov Selkowitz
-libXpm-noX                                   ORPHANED (Charles Wilson)
-libXrandr                                    Yaakov Selkowitz
-libXrender                                   Yaakov Selkowitz
-libXres                                      Yaakov Selkowitz
-libXScrnSaver                                Yaakov Selkowitz
-libxslt                                      Yaakov Selkowitz
-libXt                                        Yaakov Selkowitz
-libXtst                                      Yaakov Selkowitz
-libytnef                                     Yaakov Selkowitz
-libzeitgiest1.0                              Yaakov Selkowitz
-libzip                                       Yaakov Selkowitz
-licensecheck                                 Jari Aalto
-lightsoff                                    Yaakov Selkowitz
-lighttpd                                     Yaakov Selkowitz
-lilypond                                     Marco Atzeri
-linklint                                     Jari Aalto
-links                                        Jari Aalto
-linux-libertine-fonts                        Yaakov Selkowitz
-listres                                      Yaakov Selkowitz
-llvm                                         Yaakov Selkowitz
-lndir                                        Yaakov Selkowitz
-login                                        Corinna Vinschen/Yaakov Selkowitz
-logiweb                                      Klaus Grue
-lrzip                                        Yaakov Selkowitz
-lskat                                        Yaakov Selkowitz
-lua                                          Yaakov Selkowitz
-lua-bit                                      Yaakov Selkowitz
-lua-crypto                                   Yaakov Selkowitz
-lua-json                                     Yaakov Selkowitz
-lua-lfs                                      Yaakov Selkowitz
-lua-logging                                  Yaakov Selkowitz
-lua-lpeg                                     Yaakov Selkowitz
-lua-luadoc                                   Yaakov Selkowitz
-lua-lxp                                      Yaakov Selkowitz
-lua-socket                                   Yaakov Selkowitz
-lua5.1                                       Yaakov Selkowitz
-luit                                         Yaakov Selkowitz
-lv                                           Jari Aalto
-lxappearance                                 Yaakov Selkowitz
-lxappearance-obconf                          Yaakov Selkowitz
-lxde-common                                  Yaakov Selkowitz
-lxde-icon-theme                              Yaakov Selkowitz
-lxinput                                      Yaakov Selkowitz
-lxmenu-data                                  Yaakov Selkowitz
-lxpanel                                      Yaakov Selkowitz
-lxsession                                    Yaakov Selkowitz
-lxtask                                       Yaakov Selkowitz
-lxterminal                                   Yaakov Selkowitz
-lynx                                         Corinna Vinschen
-lyx                                          Marco Atzeri
-lzip                                         Jonathan Yong
-lziprecover                                  Jonathan Yong
-lzo2                                         Dr. Volker Zell
-lzop                                         Jari Aalto
-m17n-contrib                                 Yaakov Selkowitz
-m17n-db                                      Yaakov Selkowitz
-m17n-lib                                     Yaakov Selkowitz
-m4                                           Eric Blake
-mairix                                       Jari Aalto
-make                                         Marco Atzeri
-makedepend                                   Yaakov Selkowitz
-makepasswd                                   Jari Aalto
-makeself                                     Jari Aalto
-malaga                                       Yaakov Selkowitz
-man-db                                       Chris J. Breisch/Yaakov Selkowitz
-maradns                                      ORPHANED (Steven Monai)
-marble                                       Yaakov Selkowitz
-marco                                        Yaakov Selkowitz
-marisa                                       Yaakov Selkowitz
-mate-applets                                 Yaakov Selkowitz
-mate-backgrounds                             Yaakov Selkowitz
-mate-calc                                    Yaakov Selkowitz
-mate-common                                  Yaakov Selkowitz
-mate-control-center                          Yaakov Selkowitz
-mate-desktop                                 Yaakov Selkowitz
-mate-dialogs                                 Yaakov Selkowitz
-mate-icon-theme                              Yaakov Selkowitz
-mate-media                                   Yaakov Selkowitz
-mate-menus                                   Yaakov Selkowitz
-mate-notification-daemon                     Yaakov Selkowitz
-mate-panel                                   Yaakov Selkowitz
-mate-session-manager                         Yaakov Selkowitz
-mate-settings-daemon                         Yaakov Selkowitz
-mate-system-monitor                          Yaakov Selkowitz
-mate-terminal                                Yaakov Selkowitz
-mate-themes                                  Yaakov Selkowitz
-mate-themes-extras                           Yaakov Selkowitz
-mate-utils                                   Yaakov Selkowitz
-mathomatic                                   ORPHANED (Reini Urban)
-maxima                                       Achim Gratz
-mboxcheck                                    Jari Aalto
-mc                                           Marco Atzeri
-mcpp                                         Yaakov Selkowitz
-mcrypt                                       Dr. Volker Zell
-md5deep                                      Achim Gratz
-mdbtools                                     Yaakov Selkowitz
-mDNSResponder                                Yaakov Selkowitz
-menu-cache                                   Yaakov Selkowitz
-mercurial                                    Jari Aalto
-mesa                                         Yaakov Selkowitz
-mesa-demos                                   Yaakov Selkowitz
-metacity                                     Yaakov Selkowitz
-metis                                        Marco Atzeri
-mhash                                        ORPHANED
-micro-httpd                                  Jari Aalto
-midori                                       Yaakov Selkowitz
-mined                                        Thomas Wolff
-ming                                         Dr. Volker Zell
-mingw-binutils                               ORPHANED (Charles Wilson)
-mingw-bzip2                                  ORPHANED (Charles Wilson)
-mingw-gcc                                    ORPHANED (Charles Wilson)
-mingw-libgcrypt                              ORPHANED (Charles Wilson)
-mingw-libgpg-error                           ORPHANED (Charles Wilson)
-mingw-pthreads                               ORPHANED (Charles Wilson)
-mingw-runtime                                ORPHANED (Chris Sutcliffe)
-mingw-w32api                                 ORPHANED (Chris Sutcliffe)
-mingw-xz                                     ORPHANED (Charles Wilson)
-mingw-zlib                                   ORPHANED (Charles Wilson)
-mingw64-i686-binutils                        Jonathan Yong
-mingw64-i686-bzip2                           Yaakov Selkowitz
-mingw64-i686-gcc                             Jonathan Yong
-mingw64-i686-google-breakpad                 Jon Turney
-mingw64-i686-headers                         Jonathan Yong
-mingw64-i686-hidapi                          Wei-Ren Chen
-mingw64-i686-libgcrypt                       Yaakov Selkowitz
-mingw64-i686-libgpg-error                    Yaakov Selkowitz
-mingw64-i686-pkg-config                      Yaakov Selkowitz
-mingw64-i686-pthreads                        Jonathan Yong
-mingw64-i686-runtime                         Jonathan Yong
-mingw64-i686-windows-default-manifest        Jonathan Yong
-mingw64-i686-winpthreads                     Jonathan Yong
-mingw64-i686-xz                              Yaakov Selkowitz
-mingw64-i686-zlib                            Yaakov Selkowitz
-mingw64-x86_64-binutils                      Jonathan Yong
-mingw64-x86_64-bzip2                         Yaakov Selkowitz
-mingw64-x86_64-gcc                           Jonathan Yong
-mingw64-x86_64-google-breakpad               Jon Turney
-mingw64-x86_64-headers                       Jonathan Yong
-mingw64-x86_64-hidapi                        Wei-Ren Chen
-mingw64-x86_64-libgcrypt                     Yaakov Selkowitz
-mingw64-x86_64-libgpg-error                  Yaakov Selkowitz
-mingw64-x86_64-pkg-config                    Yaakov Selkowitz
-mingw64-x86_64-pthreads                      Jonathan Yong
-mingw64-x86_64-runtime                       Jonathan Yong
-mingw64-x86_64-windows-default-manifest      Jonathan Yong
-mingw64-x86_64-winpthreads                   Jonathan Yong
-mingw64-x86_64-xz                            Yaakov Selkowitz
-mingw64-x86_64-zlib                          Yaakov Selkowitz
-mintty                                       Thomas Wolff
-mkcomposecache                               Yaakov Selkowitz
-mkfontdir                                    Yaakov Selkowitz
-mkfontscale                                  Yaakov Selkowitz
-mksh                                         ORPHANED (Chris Sutcliffe)
-mkvtoolnix                                   David Stacey
-mm-common                                    Yaakov Selkowitz
-mmv                                          Jari Aalto
-monotone                                     Yaakov Selkowitz
-mosh                                         Achim Gratz
-most                                         Jari Aalto
-motif                                        Yaakov Selkowitz
-mousepad                                     Yaakov Selkowitz
-mousetweaks                                  Yaakov Selkowitz
-mozo                                         Yaakov Selkowitz
-mpclib                                       Achim Gratz
-mpfr                                         Achim Gratz
-mscgen                                       David Stacey
-msmtp                                        Jari Aalto
-mt                                           Corinna Vinschen
-mtd                                          ORPHANED (Sam Robb)
-multitail                                    Dr. Volker Zell
-mutt                                         Marco Atzeri
-mutter                                       Yaakov Selkowitz
-mysql                                        Yaakov Selkowitz
-naim                                         ORPHANED (Jonathan C. Allen)
-nano                                         Yaakov Selkowitz
-nas                                          Yaakov Selkowitz
-nasm                                         Dean Scarff
-nautilus                                     Yaakov Selkowitz
-nc                                           Corinna Vinschen
-nc6                                          Corinna Vinschen
-ncdu                                         Christian Franke
-ncftp                                        Jari Aalto
-ncompress                                    Yaakov Selkowitz
-ncurses                                      Yaakov Selkowitz
-nedit                                        Yaakov Selkowitz
-neon                                         Dr. Volker Zell
-net-snmp                                     David Rothenberger
-netcdf                                       Marco Atzeri
-netcdf-cxx4                                  Marco Atzeri
-netcdf-fortran                               Marco Atzeri
-netpbm                                       Yaakov Selkowitz
-nettle                                       Dr. Volker Zell
-newmail                                      Jari Aalto
-nfrotz                                       ORPHANED (Charles Wilson)
-nfs-server                                   ORPHANED (Sam Robb)
-ngspice                                      Marco Atzeri
-ninvaders                                    David Stacey
-nmh                                          David Levine
-nosleep                                      Andrew Schulman
-notification-daemon                          Yaakov Selkowitz
-novprog                                      Yaakov Selkowitz
-nrss                                         Jari Aalto
-nspr                                         Yaakov Selkowitz
-nss                                          Yaakov Selkowitz
-ntl                                          Yue Ren/Marco Atzeri
-nttcp                                        Jari Aalto
-obconf                                       Yaakov Selkowitz
-ocaml                                        Damien Doligez
-ocaml-facile                                 Yaakov Selkowitz
-oclock                                       Yaakov Selkowitz
-octave                                       Marco Atzeri
-octave-bim                                   Marco Atzeri
-octave-cgi                                   Marco Atzeri
-octave-communications                        Marco Atzeri
-octave-control                               Marco Atzeri
-octave-data-smoothing                        Marco Atzeri
-octave-database                              Marco Atzeri
-octave-dataframe                             Marco Atzeri
-octave-divand                                Marco Atzeri
-octave-doctest                               Marco Atzeri
-octave-econometrics                          Marco Atzeri
-octave-financial                             Marco Atzeri
-octave-fl-core                               Marco Atzeri
-octave-fpl                                   Marco Atzeri
-octave-fuzzy-logic-toolkit                   Marco Atzeri
-octave-ga                                    Marco Atzeri
-octave-general                               Marco Atzeri
-octave-generate_html                         Marco Atzeri
-octave-geometry                              Marco Atzeri
-octave-image                                 Marco Atzeri
-octave-instrument-control                    Marco Atzeri
-octave-integration                           Marco Atzeri
-octave-interval                              Marco Atzeri
-octave-io                                    Marco Atzeri
-octave-level-set                             Marco Atzeri
-octave-linear-algebra                        Marco Atzeri
-octave-lssa                                  Marco Atzeri
-octave-ltfat                                 Marco Atzeri
-octave-mapping                               Marco Atzeri
-octave-mechanics                             Marco Atzeri
-octave-miscellaneous                         Marco Atzeri
-octave-mpi                                   Marco Atzeri
-octave-msh                                   Marco Atzeri
-octave-mvn                                   Marco Atzeri
-octave-nan                                   Marco Atzeri
-octave-ncarray                               Marco Atzeri
-octave-netcdf                                Marco Atzeri
-octave-nurbs                                 Marco Atzeri
-octave-ocs                                   Marco Atzeri
-octave-octcdf                                Marco Atzeri
-octave-octclip                               Marco Atzeri
-octave-octproj                               Marco Atzeri
-octave-odepkg                                Marco Atzeri
-octave-optics                                Marco Atzeri
-octave-optim                                 Marco Atzeri
-octave-optiminterp                           Marco Atzeri
-octave-parallel                              Marco Atzeri
-octave-quaternion                            Marco Atzeri
-octave-queueing                              Marco Atzeri
-octave-secs1d                                Marco Atzeri
-octave-secs2d                                Marco Atzeri
-octave-secs3d                                Marco Atzeri
-octave-signal                                Marco Atzeri
-octave-sockets                               Marco Atzeri
-octave-specfun                               Marco Atzeri
-octave-splines                               Marco Atzeri
-octave-statistics                            Marco Atzeri
-octave-stk                                   Marco Atzeri
-octave-strings                               Marco Atzeri
-octave-struct                                Marco Atzeri
-octave-tisean                                Marco Atzeri
-octave-tsa                                   Marco Atzeri
-octave-vrml                                  Marco Atzeri
-odbc-mysql                                   Yaakov Selkowitz
-odbc-psql                                    Yaakov Selkowitz
-odbc-sqlite3                                 Yaakov Selkowitz
-odt2txt                                      Jari Aalto
-offlineimap                                  Jari Aalto
-ogmtools                                     Jari Aalto
-okteta                                       Yaakov Selkowitz
-okteta4                                      Yaakov Selkowitz
-onc-rpc-devel                                Pavel Fedin
-onig                                         Marco Atzeri
-oodiff                                       Jari Aalto
-openal                                       Yaakov Selkowitz
-openblas                                     Marco Atzeri
-openbox                                      Yaakov Selkowitz
-opencdk                                      Dr. Volker Zell
-openexr                                      Yaakov Selkowitz
-openjade                                     Yaakov Selkowitz
-openjpeg                                     Yaakov Selkowitz
-openldap                                     Dr. Volker Zell
-openmpi                                      Marco Atzeri
-OpenSP                                       Yaakov Selkowitz
-openssh                                      Corinna Vinschen
-openssl                                      Corinna Vinschen/Yaakov Selkowitz
-optipng                                      Jari Aalto
-opus                                         Yaakov Selkowitz
-opusfile                                     Yaakov Selkowitz
-orage                                        Yaakov Selkowitz
-ORBit2                                       Yaakov Selkowitz
-orc                                          Yaakov Selkowitz
-orpie                                        Andrew Schulman
-outguess                                     Jari Aalto
-overpass-fonts                               Yaakov Selkowitz
-oxygen-fonts                                 Yaakov Selkowitz
-oxygen-icons                                 Yaakov Selkowitz
-p11-kit                                      Yaakov Selkowitz
-p7zip                                        Tony Kelman
-pairs                                        Yaakov Selkowitz
-pakchois                                     Dr. Volker Zell
-pal                                          ORPHANED (Jari Aalto)
-palapeli                                     Yaakov Selkowitz
-pango1.0                                     Yaakov Selkowitz
-pangomm1.4                                   Yaakov Selkowitz
-pangox-compat                                Yaakov Selkowitz
-paprefs                                      Yaakov Selkowitz
-par                                          David Levine
-parley                                       Yaakov Selkowitz
-patch                                        Corinna Vinschen
-patcher                                      Jari Aalto
-patchutils                                   Eric Blake
-pavucontrol                                  Yaakov Selkowitz
-pax                                          Jari Aalto
-pbzip2                                       Marco Atzeri
-pcmanfm                                      Yaakov Selkowitz
-pcre                                         Yaakov Selkowitz
-pdf2djvu                                     Yaakov Selkowitz
-pdftk                                        David Rothenberger
-peg-e                                        Yaakov Selkowitz
-perl                                         Achim Gratz
-perl-Algorithm-Diff                          Achim Gratz
-perl-Alien-wxWidgets                         Yaakov Selkowitz
-perl-Archive-Zip                             Achim Gratz/Yaakov Selkowitz
-perl-Authen-SASL                             Yaakov Selkowitz
-perl-autovivification                        Achim Gratz/Ken Brown
-perl-B-Generate                              Achim Gratz
-perl-Business-ISBN                           Achim Gratz/Ken Brown
-perl-Business-ISBN-Data                      Achim Gratz/Ken Brown
-perl-Business-ISMN                           Achim Gratz/Ken Brown
-perl-Business-ISSN                           Achim Gratz/Ken Brown
-perl-Cairo                                   Yaakov Selkowitz
-perl-Cairo-GObject                           Yaakov Selkowitz
-perl-Capture-Tiny                            Achim Gratz/Ken Brown
-perl-Carp                                    Achim Gratz
-perl-CGI                                     Yaakov Selkowitz
-perl-Class-XSAccessor                        Achim Gratz
-perl-Clone                                   Achim Gratz/Yaakov Selkowitz
-perl-common-sense                            Achim Gratz
-perl-Compress-Bzip2                          Achim Gratz
-perl-Config-AutoConf                         Achim Gratz/Ken Brown
-perl-Config-Perl-V                           Achim Gratz
-perl-Config-Tiny                             Achim Gratz
-perl-CPAN-Changes                            Achim Gratz
-perl-CPAN-DistnameInfo                       Achim Gratz
-perl-CPAN-Meta                               Achim Gratz
-perl-CPAN-Meta-Check                         Achim Gratz
-perl-CPAN-Meta-Requirements                  Achim Gratz
-perl-CPAN-Meta-YAML                          Achim Gratz
-perl-CPAN-Reporter                           Achim Gratz
-perl-CPAN-Testers-Report                     Achim Gratz
-perl-Crypt-OpenSSL-Bignum                    Achim Gratz
-perl-Crypt-OpenSSL-DSA                       Achim Gratz
-perl-Crypt-OpenSSL-EC                        Achim Gratz
-perl-Crypt-OpenSSL-ECDSA                     Achim Gratz
-perl-Crypt-OpenSSL-Random                    Achim Gratz
-perl-Crypt-OpenSSL-RSA                       Achim Gratz
-perl-Data-Alias                              Achim Gratz
-perl-Data-Compare                            Achim Gratz/Ken Brown
-perl-Data-Diver                              Achim Gratz/Ken Brown
-perl-Data-Dump                               Achim Gratz/Ken Brown
-perl-Data-GUID                               Achim Gratz
-perl-Data-OptList                            Achim Gratz
-perl-Data-UUID                               Achim Gratz
-perl-Date-Simple                             Achim Gratz/Ken Brown
-perl-DBD-mysql                               Achim Gratz/Yaakov Selkowitz
-perl-DBD-SQLite                              Achim Gratz/Yaakov Selkowitz
-perl-DBI                                     Achim Gratz/Yaakov Selkowitz
-perl-Devel-Autoflush                         Achim Gratz
-perl-Devel-Symdump                           Achim Gratz
-perl-Digest-BubbleBabble                     Achim Gratz
-perl-Digest-GOST                             Achim Gratz
-perl-Digest-HMAC                             Achim Gratz/Yaakov Selkowitz
-perl-Digest-SHA1                             Achim Gratz/Yaakov Selkowitz
-perl-Encode-EUCJPASCII                       Achim Gratz/Ken Brown
-perl-Encode-HanExtra                         Achim Gratz/Ken Brown
-perl-Encode-ISO2022                          Achim Gratz
-perl-Encode-JIS0213                          Achim Gratz
-perl-Encode-JIS2K                            Achim Gratz/Ken Brown
-perl-Encode-Locale                           Achim Gratz/Yaakov Selkowitz
-perl-Error                                   Achim Gratz
-perl-Exporter-Tiny                           Achim Gratz
-perl-ExtUtils-CBuilder                       Achim Gratz
-perl-ExtUtils-Depends                        Achim Gratz/Yaakov Selkowitz
-perl-ExtUtils-F77                            Achim Gratz
-perl-ExtUtils-LibBuilder                     Achim Gratz/Ken Brown
-perl-ExtUtils-MakeMaker                      Achim Gratz
-perl-ExtUtils-PkgConfig                      Achim Gratz/Yaakov Selkowitz
-perl-File-Copy-Recursive                     Achim Gratz
-perl-File-Find-HomeDir                       Achim Gratz
-perl-File-Find-Object                        Achim Gratz
-perl-File-Find-Object-Rule                   Achim Gratz
-perl-File-Find-Rule                          Achim Gratz/Ken Brown
-perl-File-Listing                            Achim Gratz/Yaakov Selkowitz
-perl-File-pushd                              Achim Gratz
-perl-File-Slurp                              Achim Gratz/Ken Brown
-perl-File-Slurp-Tiny                         Achim Gratz
-perl-File-Slurp-Unicode                      Achim Gratz/Ken Brown
-perl-File-Which                              Achim Gratz
-perl-GD                                      Yaakov Selkowitz
-perl-Getopt-ArgvFile                         Achim Gratz/Yaakov Selkowitz
-perl-gettext                                 Achim Gratz/Yaakov Selkowitz
-perl-Glib                                    Yaakov Selkowitz
-perl-Glib-Object-Introspection               Yaakov Selkowitz
-perl-Gnome2                                  Yaakov Selkowitz
-perl-Gnome2-Canvas                           Yaakov Selkowitz
-perl-Gnome2-GConf                            Yaakov Selkowitz
-perl-Gnome2-Rsvg                             Yaakov Selkowitz
-perl-Gnome2-VFS                              Yaakov Selkowitz
-perl-Gnome2-Vte                              Yaakov Selkowitz
-perl-Gnome2-Wnck                             Yaakov Selkowitz
-perl-GStreamer                               Yaakov Selkowitz
-perl-GStreamer-Interfaces                    Yaakov Selkowitz
-perl-Gtk2                                    Yaakov Selkowitz
-perl-Gtk2-GladeXML                           Yaakov Selkowitz
-perl-Gtk2-Notify                             Yaakov Selkowitz
-perl-Gtk2-SourceView2                        Yaakov Selkowitz
-perl-Gtk2-Spell                              Yaakov Selkowitz
-perl-Gtk2-Unique                             Yaakov Selkowitz
-perl-Gtk2-WebKit                             Yaakov Selkowitz
-perl-Gtk3                                    Yaakov Selkowitz
-perl-HTML-Parser                             Achim Gratz/Yaakov Selkowitz
-perl-HTML-Tagset                             Achim Gratz/Yaakov Selkowitz
-perl-HTTP-Cookies                            Achim Gratz/Yaakov Selkowitz
-perl-HTTP-Daemon                             Achim Gratz/Yaakov Selkowitz
-perl-HTTP-Date                               Achim Gratz/Yaakov Selkowitz
-perl-HTTP-Message                            Achim Gratz/Yaakov Selkowitz
-perl-HTTP-Negotiate                          Achim Gratz/Yaakov Selkowitz
-perl-inc-latest                              Achim Gratz
-perl-Inline                                  Achim Gratz
-perl-Inline-Files                            Achim Gratz
-perl-IO-CaptureOutput                        Achim Gratz
-perl-IO-HTML                                 Achim Gratz/Ken Brown
-perl-IO-Prompt-Tiny                          Achim Gratz
-perl-IO-Socket-INET6                         Achim Gratz
-perl-IO-Socket-IP                            Achim Gratz/Yaakov Selkowitz
-perl-IO-Socket-SSL                           Achim Gratz/Yaakov Selkowitz
-perl-IO-String                               Achim Gratz
-perl-IO-Tty                                  Achim Gratz
-perl-IPC-Cmd                                 Achim Gratz
-perl-IPC-Run                                 Achim Gratz
-perl-IPC-Run3                                Achim Gratz/Ken Brown
-perl-JSON                                    Achim Gratz
-perl-JSON-PP                                 Achim Gratz
-perl-JSON-XS                                 Achim Gratz
-perl-libwww-perl                             Achim Gratz
-perl-List-AllUtils                           Achim Gratz/Ken Brown
-perl-List-MoreUtils                          Achim Gratz/Ken Brown
-perl-Locale-gettext                          Achim Gratz/Yaakov Selkowitz
-perl-Log-Log4perl                            Achim Gratz/Ken Brown
-perl-LWP-MediaTypes                          Achim Gratz/Yaakov Selkowitz
-perl-LWP-Protocol-https                      Achim Gratz/Ken Brown
-perl-MailTools                               Yaakov Selkowitz
-perl-Metabase-Client-Simple                  Achim Gratz
-perl-Metabase-Fact                           Achim Gratz
-perl-MIME-Base32                             Achim Gratz
-perl-MIME-Charset                            Achim Gratz/Ken Brown
-perl-Module-Build                            Achim Gratz
-perl-Module-Metadata                         Achim Gratz
-perl-Module-Pluggable                        Yaakov Selkowitz
-perl-Module-ScanDeps                         Achim Gratz/Yaakov Selkowitz
-perl-Module-Signature                        Achim Gratz
-perl-Mozilla-CA                              Achim Gratz/Ken Brown
-perl-Net-DNS                                 Achim Gratz
-perl-Net-DNS-SEC                             Achim Gratz
-perl-Net-HTTP                                Achim Gratz/Yaakov Selkowitz
-perl-Net-IP                                  Achim Gratz
-perl-Net-SMTP-SSL                            Yaakov Selkowitz/Blooey McFooey
-perl-Net-SSLeay                              Achim Gratz/Yaakov Selkowitz
-perl-Number-Compare                          Achim Gratz/Ken Brown
-perl-OpenGL                                  Yaakov Selkowitz
-perl-PadWalker                               Achim Gratz
-perl-Pango                                   Yaakov Selkowitz
-perl-PAR                                     Achim Gratz/Yaakov Selkowitz
-perl-PAR-Dist                                Achim Gratz/Yaakov Selkowitz
-perl-PAR-Packer                              Yaakov Selkowitz
-perl-Params-Util                             Achim Gratz/Yaakov Selkowitz
-perl-Parse-CPAN-Meta                         Achim Gratz
-perl-Parse-RecDescent                        Achim Gratz
-perl-Path-Class                              Achim Gratz
-perl-Pod-Coverage                            Achim Gratz
-perl-Pod-Escapes                             Achim Gratz
-perl-Pod-Simple                              Achim Gratz
-perl-POD2-Base                               Achim Gratz
-perl-Probe-Perl                              Achim Gratz
-perl-Proc-ProcessTable                       Achim Gratz/Yaakov Selkowitz
-perl-Readonly                                Achim Gratz/Ken Brown
-perl-Readonly-XS                             Achim Gratz/Ken Brown
-perl-Regexp-Common                           Achim Gratz/Ken Brown
-perl-Scalar-List-Utils                       Achim Gratz
-perl-SGMLSpm                                 Yaakov Selkowitz
-perl-Socket                                  Achim Gratz/Yaakov Selkowitz
-perl-Socket6                                 Achim Gratz
-perl-Spiffy                                  Achim Gratz
-perl-Sub-Exporter                            Achim Gratz
-perl-Sub-Install                             Achim Gratz
-perl-Sub-Uplevel                             Achim Gratz
-perl-Tee                                     Achim Gratz
-perl-Term-ReadKey                            Achim Gratz/Yaakov Selkowitz
-perl-Term-ReadLine-Gnu                       Achim Gratz/Yaakov Selkowitz
-perl-Term-ReadLine-Perl                      Achim Gratz
-perl-TermReadKey                             Achim Gratz
-perl-Test-Base                               Achim Gratz
-perl-Test-CPAN-Meta                          Achim Gratz
-perl-Test-Deep                               Achim Gratz
-perl-Test-Differences                        Achim Gratz
-perl-Test-Exception                          Achim Gratz
-perl-Test-Fatal                              Achim Gratz
-perl-Test-LeakTrace                          Achim Gratz
-perl-Test-NoWarnings                         Achim Gratz
-perl-Test-Pod                                Achim Gratz
-perl-Test-Pod-Coverage                       Achim Gratz
-perl-Test-Reporter                           Achim Gratz
-perl-Test-Reporter-Transport-Metabase        Achim Gratz
-perl-Test-Requires                           Achim Gratz
-perl-Test-Script                             Achim Gratz
-perl-Test-Simple                             Achim Gratz
-perl-Test-TrailingSpace                      Achim Gratz
-perl-Test-Warn                               Achim Gratz
-perl-Test-Warnings                           Achim Gratz
-perl-Test-Without-Module                     Achim Gratz
-perl-Test-YAML                               Achim Gratz
-perl-Text-BibTeX                             Achim Gratz/Ken Brown
-perl-Text-CharWidth                          Achim Gratz/Yaakov Selkowitz
-perl-Text-CSV                                Achim Gratz/David Stacey
-perl-Text-CSV_XS                             Achim Gratz/David Stacey
-perl-Text-Diff                               Achim Gratz
-perl-Text-Glob                               Achim Gratz/Ken Brown
-perl-Text-Roman                              Achim Gratz/Ken Brown
-perl-Text-WrapI18N                           Achim Gratz/Yaakov Selkowitz
-perl-Tie-Cycle                               Achim Gratz/Ken Brown
-perl-TimeDate                                Achim Gratz/Yaakov Selkowitz
-perl-Tk                                      Yaakov Selkowitz
-perl-Tk-Canvas-GradientColor                 Yaakov Selkowitz
-perl-Tk-ColoredButton                        Yaakov Selkowitz
-perl-Tk-EntryCheck                           Yaakov Selkowitz
-perl-Tk-Getopt                               Yaakov Selkowitz
-perl-Tk-Pod                                  Yaakov Selkowitz
-perl-Try-Tiny                                Achim Gratz
-perl-Types-Serialiser                        Achim Gratz
-perl-Unicode-Collate                         Achim Gratz/Ken Brown
-perl-Unicode-GCString                        Achim Gratz/Ken Brown
-perl-Unicode-LineBreak                       Achim Gratz/Ken Brown
-perl-Unicode-Normalize                       Achim Gratz/Ken Brown
-perl-URI                                     Achim Gratz/Yaakov Selkowitz
-perl-Win32                                   Achim Gratz
-perl-WWW-Curl                                Achim Gratz
-perl-WWW-RobotRules                          Achim Gratz/Yaakov Selkowitz
-perl-Wx                                      Yaakov Selkowitz
-perl-XML-LibXML                              Achim Gratz/Yaakov Selkowitz
-perl-XML-LibXML-Simple                       Achim Gratz/Ken Brown
-perl-XML-LibXSLT                             Achim Gratz/Ken Brown
-perl-XML-NamespaceSupport                    Achim Gratz/Yaakov Selkowitz
-perl-XML-Parser                              Achim Gratz/Yaakov Selkowitz
-perl-XML-SAX                                 Achim Gratz/Yaakov Selkowitz
-perl-XML-SAX-Base                            Achim Gratz/Yaakov Selkowitz
-perl-XML-SAX-Expat                           Achim Gratz
-perl-XML-Simple                              Achim Gratz/Yaakov Selkowitz
-perl-XML-Writer                              Achim Gratz/Ken Brown
-perl-YAML                                    Achim Gratz/Yaakov Selkowitz
-perl-YAML-LibYAML                            Achim Gratz
-phodav                                       Yaakov Selkowitz
-phonon                                       Yaakov Selkowitz
-phonon-backend-gstreamer                     Yaakov Selkowitz
-phonon4qt5                                   Yaakov Selkowitz
-phonon4qt5-backend-gstreamer                 Yaakov Selkowitz
-php                                          Yaakov Selkowitz
-php-Archive_Tar                              Yaakov Selkowitz
-php-Console_Getopt                           Yaakov Selkowitz
-php-jsonc                                    Yaakov Selkowitz
-php-PEAR                                     Yaakov Selkowitz
-php-Structures_Graph                         Yaakov Selkowitz
-php-XML_Util                                 Yaakov Selkowitz
-picard                                       Dr. Volker Zell
-picmi                                        Yaakov Selkowitz
-pinentry                                     ORPHANED (Charles Wilson)
-pinfo                                        Andrew Schulman
-ping                                         Marco Atzeri
-pixman                                       Yaakov Selkowitz
-pkg-config                                   Yaakov Selkowitz
-pl                                           Corinna Vinschen
-planet                                       Yaakov Selkowitz
-ploticus                                     Andrew Schulman
-ploticus-doc                                 Andrew Schulman
-plotutils                                    Marco Atzeri
-pluma                                        Yaakov Selkowitz
-pluma-plugins                                Yaakov Selkowitz
-pngcheck                                     Jari Aalto
-pngcrush                                     Jari Aalto
-pngquant                                     Jari Aalto
-po4a                                         Yaakov Selkowitz
-poco                                         David Stacey
-poppler                                      Yaakov Selkowitz
-poppler-data                                 Yaakov Selkowitz
-popt                                         ORPHANED
-portaudio                                    Yaakov Selkowitz
-portmidi                                     Yaakov Selkowitz
-posh                                         Jari Aalto
-postfix                                      Christian Franke
-postgresql                                   Marco Atzeri
-potrace                                      Jari Aalto
-presentproto                                 Yaakov Selkowitz
-prison                                       Yaakov Selkowitz
-pristine-tar                                 Jari Aalto
-procmail                                     Daniel Boland
-procps                                       OBSOLETE (Corinna Vinschen)
-proj                                         Marco Atzeri
-protobuf                                     ORPHANED (Reini Urban)
-pscan                                        Jari Aalto
-psmisc                                       Corinna Vinschen
-pstoedit                                     Dr. Volker Zell
-pstotext                                     Jari Aalto
-pth                                          ORPHANED (Charles Wilson)
-pugixml                                      David Stacey
-pulseaudio                                   Yaakov Selkowitz
-pure-ftpd                                    Marco Atzeri
-putty                                        Yaakov Selkowitz
-pv                                           Aaron Schneider
-pwgen                                        Jari Aalto
-pwget                                        Jari Aalto
-pylint                                       Jari Aalto
-python                                       Yaakov Selkowitz
-python-backports.ssl_match_hostname          ORPHANED (Yaakov Selkowitz)
-python-beautifulsoup                         Yaakov Selkowitz
-python-bsddb3                                Yaakov Selkowitz
-python-cairo                                 Yaakov Selkowitz
-python-cffi                                  Yaakov Selkowitz
-python-chardet                               Yaakov Selkowitz
-python-crypto                                Jari Aalto
-python-cryptography                          Yaakov Selkowitz
-python-cython                                Yaakov Selkowitz
-python-dbus                                  Yaakov Selkowitz
-python-discid                                Dr. Volker Zell
-python-doc                                   Yaakov Selkowitz
-python-docutils                              Tony Kelman
-python-enum34                                Yaakov Selkowitz
-python-fastimport                            Ken Brown
-python-feedparser                            Jari Aalto
-python-gdata                                 ORPHANED (Chris Sutcliffe)
-python-gi                                    Yaakov Selkowitz
-python-gobject                               Yaakov Selkowitz
-python-goocanvas                             Yaakov Selkowitz
-python-gst0.10                               Yaakov Selkowitz
-python-gtk2.0                                Yaakov Selkowitz
-python-gtksourceview2                        Yaakov Selkowitz
-python-h5py                                  Chris LeBlanc
-python-htmltmpl                              Yaakov Selkowitz
-python-imaging                               Yaakov Selkowitz
-python-jinja2                                Tony Kelman
-python-logilab-astng                         Jari Aalto
-python-logilab-common                        Jari Aalto
-python-lxml                                  Yaakov Selkowitz
-python-mako                                  Yaakov Selkowitz
-python-markupsafe                            Yaakov Selkowitz
-python-mutagen                               Dr. Volker Zell
-python-mx                                    Yaakov Selkowitz
-python-numpy                                 Yaakov Selkowitz
-python-opengl                                Yaakov Selkowitz
-python-opengl-accelerate                     Yaakov Selkowitz
-python-openssl                               Yaakov Selkowitz
-python-orbit                                 Yaakov Selkowitz
-python-paramiko                              Jari Aalto
-python-ply                                   Yaakov Selkowitz
-python-pyasn1                                Yaakov Selkowitz
-python-pycparser                             Yaakov Selkowitz
-python-pygame                                Yaakov Selkowitz
-python-pygments                              Yaakov Selkowitz
-python-pykde4                                Yaakov Selkowitz
-python-pypdf                                 Yaakov Selkowitz
-python-pyqt4                                 Yaakov Selkowitz
-python-pyqt5                                 Yaakov Selkowitz
-python-pyrex                                 Yaakov Selkowitz
-python-reportlab                             Yaakov Selkowitz
-python-requests                              Yaakov Selkowitz
-python-setuptools                            Yaakov Selkowitz
-python-simplejson                            Yaakov Selkowitz
-python-sip                                   Yaakov Selkowitz
-python-six                                   Yaakov Selkowitz
-python-sphinx                                Tony Kelman
-python-twisted                               Yaakov Selkowitz
-python-unidecode                             Yaakov Selkowitz
-python-urllib3                               Yaakov Selkowitz
-python-webkit                                Yaakov Selkowitz
-python-xdg                                   Yaakov Selkowitz
-python-yaml                                  Yaakov Selkowitz
-python-zope.interface                        Yaakov Selkowitz
-python3                                      Yaakov Selkowitz
-python3-bsddb3                               Yaakov Selkowitz
-python3-cairo                                Yaakov Selkowitz
-python3-cffi                                 Yaakov Selkowitz
-python3-chardet                              Yaakov Selkowitz
-python3-cryptography                         Yaakov Selkowitz
-python3-cython                               Yaakov Selkowitz
-python3-dbus                                 Yaakov Selkowitz
-python3-doc                                  Yaakov Selkowitz
-python3-h5py                                 Chris LeBlanc
-python3-imaging                              Yaakov Selkowitz
-python3-lxml                                 Yaakov Selkowitz
-python3-mako                                 Yaakov Selkowitz
-python3-markupsafe                           Yaakov Selkowitz
-python3-numpy                                Yaakov Selkowitz
-python3-openssl                              Yaakov Selkowitz
-python3-ply                                  Yaakov Selkowitz
-python3-pyasn1                               Yaakov Selkowitz
-python3-pycparser                            Yaakov Selkowitz
-python3-pygments                             Yaakov Selkowitz
-python3-pykde4                               Yaakov Selkowitz
-python3-pyqt4                                Yaakov Selkowitz
-python3-pyqt5                                Yaakov Selkowitz
-python3-requests                             Yaakov Selkowitz
-python3-setuptools                           Yaakov Selkowitz
-python3-simplejson                           Yaakov Selkowitz
-python3-sip                                  Yaakov Selkowitz
-python3-six                                  Yaakov Selkowitz
-python3-unidecode                            Yaakov Selkowitz
-python3-urllib3                              Yaakov Selkowitz
-python3-xdg                                  Yaakov Selkowitz
-python3-yaml                                 Yaakov Selkowitz
-python3-zope.interface                       Yaakov Selkowitz
-pyzy                                         Yaakov Selkowitz
-qca                                          Yaakov Selkowitz
-qhull                                        Marco Atzeri
-qimageblitz                                  Yaakov Selkowitz
-qiv                                          Jari Aalto
-qjson                                        Yaakov Selkowitz
-qoauth                                       Yaakov Selkowitz
-qqwing                                       Yaakov Selkowitz
-qrencode                                     Yaakov Selkowitz
-qrupdate                                     Marco Atzeri
-qscintilla2                                  Yaakov Selkowitz
-qsf                                          Jari Aalto
-qt3                                          Yaakov Selkowitz
-qt4                                          Yaakov Selkowitz
-qt4-webkit                                   Yaakov Selkowitz
-qt5-base                                     Yaakov Selkowitz
-qt5-declarative                              Yaakov Selkowitz
-qt5-doc                                      Yaakov Selkowitz
-qt5-enginio                                  Yaakov Selkowitz
-qt5-graphicaleffects                         Yaakov Selkowitz
-qt5-imageformats                             Yaakov Selkowitz
-qt5-location                                 Yaakov Selkowitz
-qt5-multimedia                               Yaakov Selkowitz
-qt5-quick1                                   Yaakov Selkowitz
-qt5-quickcontrols                            Yaakov Selkowitz
-qt5-script                                   Yaakov Selkowitz
-qt5-serialport                               Yaakov Selkowitz
-qt5-svg                                      Yaakov Selkowitz
-qt5-tools                                    Yaakov Selkowitz
-qt5-translations                             Yaakov Selkowitz
-qt5-webchannel                               Yaakov Selkowitz
-qt5-webkit                                   Yaakov Selkowitz
-qt5-webkit-examples                          Yaakov Selkowitz
-qt5-websockets                               Yaakov Selkowitz
-qt5-x11extras                                Yaakov Selkowitz
-qt5-xmlpatterns                              Yaakov Selkowitz
-quadrapassel                                 Yaakov Selkowitz
-quilt                                        Jari Aalto
-quvi                                         Yaakov Selkowitz
-R                                            Marco Atzeri
-randrproto                                   Yaakov Selkowitz
-rarian                                       Yaakov Selkowitz
-rats                                         Jari Aalto
-rbio                                         Marco Atzeri
-rc                                           Jari Aalto
-rcs                                          Achim Gratz
-rdiff-backup                                 David Rothenberger
-rdtool                                       Jari Aalto
-readline                                     Eric Blake
-rebase                                       Corinna Vinschen
-recode                                       Corinna Vinschen
-recordproto                                  Yaakov Selkowitz
-regina-rexx                                  Mark Hessling
-renameutils                                  Jari Aalto
-renattach                                    Jari Aalto
-rendercheck                                  Yaakov Selkowitz
-renderproto                                  Yaakov Selkowitz
-resourceproto                                Yaakov Selkowitz
-rgb                                          Yaakov Selkowitz
-ristretto                                    Yaakov Selkowitz
-rlwrap                                       Corinna Vinschen
-rng-tools                                    Corinna Vinschen
-robodoc                                      Yaakov Selkowitz
-robots                                       Corinna Vinschen
-rocs                                         Yaakov Selkowitz
-rodent-icon-theme                            Yaakov Selkowitz
-rpcbind                                      Pavel Fedin
-rpm                                          Pavel Fedin
-rsh                                          ORPHANED (Charles Wilson)
-rsnapshot                                    Jari Aalto
-rstart                                       Yaakov Selkowitz
-rsync                                        Jari Aalto
-rtf2html-htdig                               Jari Aalto
-rtorrent                                     Marco Atzeri
-ruby                                         Yaakov Selkowitz
-ruby-actionmailer                            Yaakov Selkowitz
-ruby-actionpack                              Yaakov Selkowitz
-ruby-actionview                              Yaakov Selkowitz
-ruby-activejob                               Yaakov Selkowitz
-ruby-activemodel                             Yaakov Selkowitz
-ruby-activerecord                            Yaakov Selkowitz
-ruby-activerecord-deprecated_finders         Yaakov Selkowitz
-ruby-activesupport                           Yaakov Selkowitz
-ruby-arel                                    Yaakov Selkowitz
-ruby-atk                                     Yaakov Selkowitz
-ruby-bcrypt                                  Yaakov Selkowitz
-ruby-bigdecimal                              Yaakov Selkowitz
-ruby-binding_of_caller                       Yaakov Selkowitz
-ruby-builder                                 Yaakov Selkowitz
-ruby-bundler                                 Yaakov Selkowitz
-ruby-byebug                                  Yaakov Selkowitz
-ruby-cairo                                   Yaakov Selkowitz
-ruby-cairo-gobject                           Yaakov Selkowitz
-ruby-celluloid                               Yaakov Selkowitz
-ruby-clutter                                 Yaakov Selkowitz
-ruby-clutter-gtk                             Yaakov Selkowitz
-ruby-coffee-rails                            Yaakov Selkowitz
-ruby-coffee-script                           Yaakov Selkowitz
-ruby-coffee-script-source                    Yaakov Selkowitz
-ruby-columnize                               Yaakov Selkowitz
-ruby-curses                                  Yaakov Selkowitz
-ruby-dbus                                    Yaakov Selkowitz
-ruby-debug_inspector                         Yaakov Selkowitz
-ruby-erubis                                  Yaakov Selkowitz
-ruby-execjs                                  Yaakov Selkowitz
-ruby-gdk3                                    Yaakov Selkowitz
-ruby-gdk_pixbuf2                             Yaakov Selkowitz
-ruby-gettext                                 Yaakov Selkowitz
-ruby-gio2                                    Yaakov Selkowitz
-ruby-glib2                                   Yaakov Selkowitz
-ruby-globalid                                Yaakov Selkowitz
-ruby-gobject-introspection                   Yaakov Selkowitz
-ruby-goocanvas1                              Yaakov Selkowitz
-ruby-goocanvas2                              Yaakov Selkowitz
-ruby-gstreamer0.10                           Yaakov Selkowitz
-ruby-gstreamer1.0                            Yaakov Selkowitz
-ruby-gtk2                                    Yaakov Selkowitz
-ruby-gtk3                                    Yaakov Selkowitz
-ruby-gtksourceview2                          Yaakov Selkowitz
-ruby-gtksourceview3                          Yaakov Selkowitz
-ruby-hike                                    Yaakov Selkowitz
-ruby-hitimes                                 Yaakov Selkowitz
-ruby-hoe                                     Yaakov Selkowitz
-ruby-i18n                                    Yaakov Selkowitz
-ruby-io-console                              Yaakov Selkowitz
-ruby-jbuilder                                Yaakov Selkowitz
-ruby-journey                                 Yaakov Selkowitz
-ruby-jquery-rails                            Yaakov Selkowitz
-ruby-json                                    Yaakov Selkowitz
-ruby-kgio                                    Yaakov Selkowitz
-ruby-listen                                  Yaakov Selkowitz
-ruby-locale                                  Yaakov Selkowitz
-ruby-loofah                                  Yaakov Selkowitz
-ruby-mail                                    Yaakov Selkowitz
-ruby-mime-types                              Yaakov Selkowitz
-ruby-minitest                                Yaakov Selkowitz
-ruby-minitest4                               Yaakov Selkowitz
-ruby-minitest5                               Yaakov Selkowitz
-ruby-molinillo                               Yaakov Selkowitz
-ruby-multi_json                              Yaakov Selkowitz
-ruby-mysql2                                  Yaakov Selkowitz
-ruby-net-http-persistent                     Yaakov Selkowitz
-ruby-nokogiri                                Yaakov Selkowitz
-ruby-oj                                      Yaakov Selkowitz
-ruby-pango                                   Yaakov Selkowitz
-ruby-pg                                      Yaakov Selkowitz
-ruby-pkg-config                              Yaakov Selkowitz
-ruby-polyglot                                Yaakov Selkowitz
-ruby-poppler                                 Yaakov Selkowitz
-ruby-psych                                   Yaakov Selkowitz
-ruby-racc                                    Yaakov Selkowitz
-ruby-rack                                    Yaakov Selkowitz
-ruby-rack-cache                              Yaakov Selkowitz
-ruby-rack-ssl                                Yaakov Selkowitz
-ruby-rack-test                               Yaakov Selkowitz
-ruby-rails                                   Yaakov Selkowitz
-ruby-rails-deprecated_sanitizer              Yaakov Selkowitz
-ruby-rails-dom-testing                       Yaakov Selkowitz
-ruby-rails-html-sanitizer                    Yaakov Selkowitz
-ruby-railties                                Yaakov Selkowitz
-ruby-raindrops                               Yaakov Selkowitz
-ruby-rake                                    Yaakov Selkowitz
-ruby-rake-compiler                           Yaakov Selkowitz
-ruby-rdoc                                    Yaakov Selkowitz
-ruby-rsvg2                                   Yaakov Selkowitz
-ruby-sass                                    Yaakov Selkowitz
-ruby-sass-rails                              Yaakov Selkowitz
-ruby-sdoc                                    Yaakov Selkowitz
-ruby-sprockets                               Yaakov Selkowitz
-ruby-sprockets-rails                         Yaakov Selkowitz
-ruby-sqlite3                                 Yaakov Selkowitz
-ruby-test-unit                               Yaakov Selkowitz
-ruby-text                                    Yaakov Selkowitz
-ruby-thor                                    Yaakov Selkowitz
-ruby-thread_safe                             Yaakov Selkowitz
-ruby-tilt                                    Yaakov Selkowitz
-ruby-timers                                  Yaakov Selkowitz
-ruby-treetop                                 Yaakov Selkowitz
-ruby-turbolinks                              Yaakov Selkowitz
-ruby-tzinfo                                  Yaakov Selkowitz
-ruby-uglifier                                Yaakov Selkowitz
-ruby-unicorn                                 Yaakov Selkowitz
-ruby-vte                                     Yaakov Selkowitz
-ruby-vte3                                    Yaakov Selkowitz
-ruby-web-console                             Yaakov Selkowitz
-ruby-webkit-gtk2                             Yaakov Selkowitz
-ruby-yajl                                    Yaakov Selkowitz
-rubygems                                     Yaakov Selkowitz
-run                                          Achim Gratz
-run2                                         ORPHANED (Charles Wilson)
-rxp                                          Jari Aalto
-rxvt                                         ORPHANED (Charles Wilson)
-rxvt-unicode                                 Yaakov Selkowitz
-rzip                                         Jari Aalto
-scons                                        David Rothenberger
-scowl                                        Yaakov Selkowitz
-screen                                       Andrew Schulman
-scrnsaverproto                               Yaakov Selkowitz
-scsh                                         ORPHANED (Reini Urban)
-SDL                                          Yaakov Selkowitz
-SDL2                                         Yaakov Selkowitz
-SDL2_image                                   Yaakov Selkowitz
-SDL2_mixer                                   Yaakov Selkowitz
-SDL2_net                                     Yaakov Selkowitz
-SDL2_ttf                                     Yaakov Selkowitz
-SDL_gfx                                      Yaakov Selkowitz
-SDL_image                                    Yaakov Selkowitz
-SDL_mixer                                    Yaakov Selkowitz
-SDL_net                                      Yaakov Selkowitz
-SDL_Pango                                    Yaakov Selkowitz
-SDL_sound                                    Yaakov Selkowitz
-SDL_ttf                                      Yaakov Selkowitz
-seahorse                                     Yaakov Selkowitz
-sed                                          Corinna Vinschen
-sendmail                                     Daniel Boland
-sendxmpp                                     Jari Aalto
-serf                                         David Rothenberger
-sessreg                                      Yaakov Selkowitz
-setxkbmap                                    Yaakov Selkowitz
-sgml-common                                  Yaakov Selkowitz
-sgrep                                        Jari Aalto
-shared-mime-info                             Yaakov Selkowitz
-sharutils                                    Eric Blake
-shed                                         Jari Aalto
-showfont                                     Yaakov Selkowitz
-shutdown                                     Frank Fesevur
-sic                                          Jari Aalto
-signify                                      Jari Aalto
-simsu                                        Yaakov Selkowitz
-since                                        Jari Aalto
-singular                                     Yue Ren/Marco Atzeri
-sitecopy                                     Andrew Schulman
-sj-fonts                                     Yaakov Selkowitz
-skkdic                                       Yaakov Selkowitz
-sl                                           Yaakov Selkowitz
-slang                                        Marco Atzeri
-slrn                                         Marco Atzeri
-smartmontools                                Christian Franke
-smproxy                                      Yaakov Selkowitz
-sng                                          Andrew Schulman
-snownews                                     Yaakov Selkowitz
-socat                                        Andrew Schulman
-sound-theme-freedesktop                      Yaakov Selkowitz
-source-highlight                             Yaakov Selkowitz
-sox                                          Yaakov Selkowitz
-spambayes                                    Jari Aalto
-spamoracle                                   Jari Aalto
-speex                                        David Rothenberger
-spice-gtk                                    Yaakov Selkowitz
-spice-protocol                               Yaakov Selkowitz
-splint                                       Jari Aalto
-splitpatch                                   Jari Aalto
-spqr                                         Marco Atzeri
-sqlite3                                      Jan Nijtmans
-squid                                        Dr. Volker Zell
-ssh-pageant                                  Michael Wild
-ssmtp                                        Corinna Vinschen
-startup-notification                         Yaakov Selkowitz
-steghide                                     Jari Aalto
-step                                         Yaakov Selkowitz
-stgit                                        Jari Aalto
-stow                                         Andrew Schulman
-strigi                                       Yaakov Selkowitz
-stunnel                                      Andrew Schulman
-subversion                                   David Rothenberger
-suck                                         Jari Aalto
-sudoku                                       Jari Aalto
-suite3270                                    Peter A. Castro
-suitesparseconfig                            Marco Atzeri
-sunrpc                                       ORPHANED (Charles Wilson)
-suomi-malaga                                 Yaakov Selkowitz
-surf                                         Yue Ren/Marco Atzeri
-svm                                          Ken Brown
-svn-load                                     Jari Aalto
-svn_load_dirs                                David Rothenberger
-sweeper                                      Yaakov Selkowitz
-swell-foop                                   Yaakov Selkowitz
-swig                                         Yaakov Selkowitz
-symlinks                                     Jari Aalto
-syslog-ng                                    Corinna Vinschen
-sysvinit                                     Dr. Volker Zell
-t1lib                                        Dr. Volker Zell
-tack                                         ORPHANED
-taglib                                       Yaakov Selkowitz
-tailor                                       Jari Aalto
-tali                                         Yaakov Selkowitz
-tanglet                                      Yaakov Selkowitz
-tar                                          Eric Blake
-task                                         Federico Hernandez
-tcl                                          Yaakov Selkowitz
-tcl-itcl                                     Yaakov Selkowitz
-tcl-itk                                      Yaakov Selkowitz
-tcl-iwidgets                                 Yaakov Selkowitz
-tcl-tix                                      Yaakov Selkowitz
-tcl-tk                                       Yaakov Selkowitz
-tcl-togl                                     Yaakov Selkowitz
-tcm                                          Dr. Volker Zell
-tcp_wrappers                                 ORPHANED (Charles Wilson)
-tcsh                                         Corinna Vinschen
-tdb                                          Yaakov Selkowitz
-ted                                          Dr. Volker Zell
-telepathy-farstream                          Yaakov Selkowitz
-telepathy-gabble                             Yaakov Selkowitz
-telepathy-glib                               Yaakov Selkowitz
-telepathy-idle                               Yaakov Selkowitz
-telepathy-logger                             Yaakov Selkowitz
-telepathy-mission-control                    Yaakov Selkowitz
-telepathy-qt                                 Yaakov Selkowitz
-terminus-fonts                               Yaakov Selkowitz
-tesseract-ocr                                Marco Atzeri
-testpackage                                  Blooey McFooey
-tetzle                                       Yaakov Selkowitz
-texi2html                                    Dr. Volker Zell
-texinfo                                      Ken Brown
-texlive                                      Ken Brown
-texlive-collection-basic                     Ken Brown
-texlive-collection-basic-doc                 Ken Brown
-texlive-collection-bibtexextra               Ken Brown
-texlive-collection-bibtexextra-doc           Ken Brown
-texlive-collection-binextra                  Ken Brown
-texlive-collection-binextra-doc              Ken Brown
-texlive-collection-context                   Ken Brown
-texlive-collection-context-doc               Ken Brown
-texlive-collection-fontsextra                Ken Brown
-texlive-collection-fontsextra-doc            Ken Brown
-texlive-collection-fontsrecommended          Ken Brown
-texlive-collection-fontsrecommended-doc      Ken Brown
-texlive-collection-fontutils                 Ken Brown
-texlive-collection-fontutils-doc             Ken Brown
-texlive-collection-formatsextra              Ken Brown
-texlive-collection-games                     Ken Brown
-texlive-collection-genericextra              Ken Brown
-texlive-collection-genericextra-doc          Ken Brown
-texlive-collection-genericrecommended        Ken Brown
-texlive-collection-genericrecommended-doc    Ken Brown
-texlive-collection-htmlxml                   Ken Brown
-texlive-collection-humanities                Ken Brown
-texlive-collection-humanities-doc            Ken Brown
-texlive-collection-langafrican               Ken Brown
-texlive-collection-langarabic                Ken Brown
-texlive-collection-langchinese               Ken Brown
-texlive-collection-langcjk                   Ken Brown
-texlive-collection-langcyrillic              Ken Brown
-texlive-collection-langczechslovak           Ken Brown
-texlive-collection-langenglish               Ken Brown
-texlive-collection-langeuropean              Ken Brown
-texlive-collection-langfrench                Ken Brown
-texlive-collection-langgerman                Ken Brown
-texlive-collection-langgreek                 Ken Brown
-texlive-collection-langindic                 Ken Brown
-texlive-collection-langitalian               Ken Brown
-texlive-collection-langjapanese              Ken Brown
-texlive-collection-langkorean                Ken Brown
-texlive-collection-langother                 Ken Brown
-texlive-collection-langpolish                Ken Brown
-texlive-collection-langportuguese            Ken Brown
-texlive-collection-langspanish               Ken Brown
-texlive-collection-latex                     Ken Brown
-texlive-collection-latex-doc                 Ken Brown
-texlive-collection-latexextra                Ken Brown
-texlive-collection-latexextra-doc            Ken Brown
-texlive-collection-latexrecommended          Ken Brown
-texlive-collection-latexrecommended-doc      Ken Brown
-texlive-collection-luatex                    Ken Brown
-texlive-collection-luatex-doc                Ken Brown
-texlive-collection-mathextra                 Ken Brown
-texlive-collection-mathextra-doc             Ken Brown
-texlive-collection-metapost                  Ken Brown
-texlive-collection-metapost-doc              Ken Brown
-texlive-collection-music                     Ken Brown
-texlive-collection-music-doc                 Ken Brown
-texlive-collection-omega                     Ken Brown
-texlive-collection-pictures                  Ken Brown
-texlive-collection-pictures-doc              Ken Brown
-texlive-collection-plainextra                Ken Brown
-texlive-collection-pstricks                  Ken Brown
-texlive-collection-pstricks-doc              Ken Brown
-texlive-collection-publishers                Ken Brown
-texlive-collection-publishers-doc            Ken Brown
-texlive-collection-science                   Ken Brown
-texlive-collection-science-doc               Ken Brown
-texlive-collection-xetex                     Ken Brown
-texlive-collection-xetex-doc                 Ken Brown
-TeXmacs                                      Marco Atzeri
-tftp                                         Gernot Hillier
-Thunar                                       Yaakov Selkowitz
-tidy                                         Yaakov Selkowitz
-tiff                                         Yaakov Selkowitz
-tig                                          Jari Aalto
-tigervnc                                     Yaakov Selkowitz
-time                                         Andrew Schulman
-timidity++                                   Yaakov Selkowitz
-tin                                          Corinna Vinschen
-tinyirc                                      Jari Aalto
-tinyxml2                                     David Stacey
-tirc                                         Jari Aalto
-tmux                                         Michael Wild
-tnef                                         Jari Aalto
-tnftp                                        Jari Aalto
-totem                                        Yaakov Selkowitz
-totem-pl-parser                              Yaakov Selkowitz
-transfig                                     Dr. Volker Zell
-transmission                                 Yaakov Selkowitz
-transset                                     Yaakov Selkowitz
-trayer                                       Yaakov Selkowitz
-tree                                         Jari Aalto
-ttcp                                         Jari Aalto
-tumbler                                      Yaakov Selkowitz
-twm                                          Yaakov Selkowitz
-txt2regex                                    Jari Aalto
-typespeed                                    ORPHANED
-tzcode                                       Corinna Vinschen/Yaakov Selkowitz
-ucl                                          Achim Gratz
-ucspi-tcp                                    ORPHANED (Steven Monai)
-udunits                                      Marco Atzeri
-umfpack                                      Marco Atzeri
-unace                                        Jari Aalto
-unalz                                        Jari Aalto
-unifdef                                      Jari Aalto
-unifont                                      Yaakov Selkowitz
-unison2.27                                   Andrew Schulman
-unison2.32                                   Andrew Schulman
-unison2.40                                   Andrew Schulman
-unison2.45                                   Andrew Schulman
-unison2.48                                   Andrew Schulman
-units                                        ORPHANED
-unrtf                                        Jari Aalto
-untex                                        Jari Aalto
-unzip                                        Yaakov Selkowitz
-upower                                       Yaakov Selkowitz
-upx                                          Achim Gratz
-urlgrabber                                   Jari Aalto
-usbredir                                     Yaakov Selkowitz
-usbutils                                     Yaakov Selkowitz
-util-linux                                   Yaakov Selkowitz
-uw-imap                                      Dr. Volker Zell
-vala                                         Yaakov Selkowitz
-varnish                                      Jorge Díaz
-vfu                                          Jari Aalto
-viewres                                      Yaakov Selkowitz
-vim                                          Yaakov Selkowitz
-vinagre                                      Yaakov Selkowitz
-vino                                         Yaakov Selkowitz
-vorbis-tools                                 David Rothenberger
-vte                                          Yaakov Selkowitz
-vte2.90                                      Yaakov Selkowitz
-vte2.91                                      Yaakov Selkowitz
-w32api-headers                               Jonathan Yong
-w32api-runtime                               Jonathan Yong
-w3m                                          Bob Heckel
-wavpack                                      Yaakov Selkowitz
-wcd                                          Jari Aalto
-wdiff                                        Jari Aalto
-webcheck                                     Jari Aalto
-webkitgtk                                    Yaakov Selkowitz
-webrtc-audio-processing                      Yaakov Selkowitz
-weechat                                      Sebastien Helleu
-wget                                         Eric Blake
-which                                        David Rothenberger
-whois                                        David Rothenberger
-wiggle                                       Jari Aalto
-wildmidi                                     Yaakov Selkowitz
-WindowMaker                                  Yaakov Selkowitz
-windows-default-manifest                     Corinna Vinschen
-windowswmproto                               Yaakov Selkowitz
-WordNet                                      Dr. Volker Zell
-wput                                         Jari Aalto
-wtf                                          ORPHANED (Chris Sutcliffe)
-wxWidgets2.8                                 Yaakov Selkowitz
-wxWidgets3.0                                 Yaakov Selkowitz
-x11perf                                      Yaakov Selkowitz
-xapian-bindings                              Yaakov Selkowitz
-xapian-core                                  Yaakov Selkowitz
-xarchiver                                    Yaakov Selkowitz
-xauth                                        Yaakov Selkowitz
-xbiff                                        Yaakov Selkowitz
-xbitmaps                                     Yaakov Selkowitz
-xcalc                                        Yaakov Selkowitz
-xcb-proto                                    Yaakov Selkowitz
-xcb-util                                     Yaakov Selkowitz
-xcb-util-cursor                              Yaakov Selkowitz
-xcb-util-image                               Yaakov Selkowitz
-xcb-util-keysyms                             Yaakov Selkowitz
-xcb-util-renderutil                          Yaakov Selkowitz
-xcb-util-wm                                  Yaakov Selkowitz
-xclip                                        Dr. Volker Zell
-xclipboard                                   Yaakov Selkowitz
-xclock                                       Yaakov Selkowitz
-xcmiscproto                                  Yaakov Selkowitz
-xcmsdb                                       Yaakov Selkowitz
-xcompmgr                                     Yaakov Selkowitz
-xconsole                                     Yaakov Selkowitz
-xcursor-themes                               Yaakov Selkowitz
-xcursorgen                                   Yaakov Selkowitz
-xdbedizzy                                    Yaakov Selkowitz
-xdelta                                       Marco Atzeri
-xdelta3                                      Marco Atzeri
-xdg-user-dirs                                Yaakov Selkowitz
-xdg-user-dirs-gtk                            Yaakov Selkowitz
-xditview                                     Yaakov Selkowitz
-xdpyinfo                                     Yaakov Selkowitz
-xedit                                        Yaakov Selkowitz
-xemacs                                       Dr. Volker Zell
-xemacs-mule-sumo                             Dr. Volker Zell
-xemacs-sumo                                  Dr. Volker Zell
-xerces-c                                     Yaakov Selkowitz
-xev                                          Yaakov Selkowitz
-xextproto                                    Yaakov Selkowitz
-xeyes                                        Yaakov Selkowitz
-xf86-video-dummy                             Yaakov Selkowitz
-xf86-video-nested                            Yaakov Selkowitz
-xf86bigfontproto                             Yaakov Selkowitz
-xfce-themes                                  Yaakov Selkowitz
-xfce4-appfinder                              Yaakov Selkowitz
-xfce4-clipman-plugin                         Yaakov Selkowitz
-xfce4-cpugraph-plugin                        Yaakov Selkowitz
-xfce4-dev-tools                              Yaakov Selkowitz
-xfce4-dict                                   Yaakov Selkowitz
-xfce4-embed-plugin                           Yaakov Selkowitz
-xfce4-equake-plugin                          Yaakov Selkowitz
-xfce4-eyes-plugin                            Yaakov Selkowitz
-xfce4-fsguard-plugin                         Yaakov Selkowitz
-xfce4-genmon-plugin                          Yaakov Selkowitz
-xfce4-mailwatch-plugin                       Yaakov Selkowitz
-xfce4-mixer                                  Yaakov Selkowitz
-xfce4-notes-plugin                           Yaakov Selkowitz
-xfce4-notifyd                                Yaakov Selkowitz
-xfce4-panel                                  Yaakov Selkowitz
-xfce4-places-plugin                          Yaakov Selkowitz
-xfce4-screenshooter                          Yaakov Selkowitz
-xfce4-session                                Yaakov Selkowitz
-xfce4-settings                               Yaakov Selkowitz
-xfce4-smartbookmark-plugin                   Yaakov Selkowitz
-xfce4-taskmanager                            Yaakov Selkowitz
-xfce4-terminal                               Yaakov Selkowitz
-xfce4-time-out-plugin                        Yaakov Selkowitz
-xfce4-timer-plugin                           Yaakov Selkowitz
-xfce4-verve-plugin                           Yaakov Selkowitz
-xfce4-weather-plugin                         Yaakov Selkowitz
-xfce4-whiskermenu-plugin                     Yaakov Selkowitz
-xfce4-wmdock-plugin                          Yaakov Selkowitz
-xfce4-xkb-plugin                             Yaakov Selkowitz
-xfconf                                       Yaakov Selkowitz
-xfd                                          Yaakov Selkowitz
-xfdesktop                                    Yaakov Selkowitz
-xfig                                         Dr. Volker Zell
-xfontsel                                     Yaakov Selkowitz
-xfs                                          Yaakov Selkowitz
-xfsinfo                                      Yaakov Selkowitz
-xfwm4                                        Yaakov Selkowitz
-xfwm4-themes                                 Yaakov Selkowitz
-xgc                                          Yaakov Selkowitz
-xgraph                                       Jari Aalto
-xhost                                        Yaakov Selkowitz
-xineramaproto                                Yaakov Selkowitz
-xinetd                                       Corinna Vinschen
-xinit                                        Yaakov Selkowitz
-xinput                                       Yaakov Selkowitz
-xkbcomp                                      Yaakov Selkowitz
-xkbevd                                       Yaakov Selkowitz
-xkbprint                                     Yaakov Selkowitz
-xkbutils                                     Yaakov Selkowitz
-xkeyboard-config                             Yaakov Selkowitz
-xkill                                        Yaakov Selkowitz
-xlaunch                                      Jon Turney
-xlhtml                                       Jari Aalto
-xload                                        Yaakov Selkowitz
-xloadimage                                   David Stacey
-xlogo                                        Yaakov Selkowitz
-xlsatoms                                     Yaakov Selkowitz
-xlsclients                                   Yaakov Selkowitz
-xlsfonts                                     Yaakov Selkowitz
-xlsx2csv                                     Jari Aalto
-xmag                                         Yaakov Selkowitz
-xman                                         Yaakov Selkowitz
-xmessage                                     Yaakov Selkowitz
-xmh                                          Yaakov Selkowitz
-XmHTML                                       Dr. Volker Zell
-xmlstarlet                                   David Stacey
-xmlto                                        Yaakov Selkowitz
-xmltoman                                     Yaakov Selkowitz
-xmodmap                                      Yaakov Selkowitz
-xmon                                         Jon Turney
-xmore                                        Yaakov Selkowitz
-xorg-cf-files                                Yaakov Selkowitz
-xorg-docs                                    Yaakov Selkowitz
-xorg-scripts                                 Yaakov Selkowitz
-xorg-server                                  Jon Turney
-xorg-sgml-doctools                           Yaakov Selkowitz
-xorg-util-macros                             Yaakov Selkowitz
-xorg-x11-fonts                               Yaakov Selkowitz
-xpdf                                         Dr. Volker Zell
-xpr                                          Yaakov Selkowitz
-xprop                                        Yaakov Selkowitz
-xproto                                       Yaakov Selkowitz
-xrandr                                       Yaakov Selkowitz
-xrdb                                         Yaakov Selkowitz
-xrefresh                                     Yaakov Selkowitz
-xscope                                       Yaakov Selkowitz
-xset                                         Yaakov Selkowitz
-xsetroot                                     Yaakov Selkowitz
-xsm                                          Yaakov Selkowitz
-xsri                                         ORPHANED (Charles Wilson)
-xstdcmap                                     Yaakov Selkowitz
-xtail                                        Jari Aalto
-xterm                                        Yaakov Selkowitz
-XtoW                                         Jon Turney
-xtrans                                       Yaakov Selkowitz
-xview                                        Jon Turney
-xwd                                          Yaakov Selkowitz
-xwin-xdg-menu                                Jon Turney
-xwininfo                                     Yaakov Selkowitz
-xwinwm                                       Yaakov Selkowitz
-xwud                                         Yaakov Selkowitz
-xz                                           Yaakov Selkowitz
-yakuake                                      Yaakov Selkowitz
-yaml                                         Yaakov Selkowitz
-yasm                                         David Stacey
-yelp                                         Yaakov Selkowitz
-yelp-tools                                   Yaakov Selkowitz
-yelp-xsl                                     Yaakov Selkowitz
-ytree                                        Jari Aalto
-zathura                                      Yaakov Selkowitz
-zathura-cb                                   Yaakov Selkowitz
-zathura-djvu                                 Yaakov Selkowitz
-zathura-pdf-poppler                          Yaakov Selkowitz
-zathura-ps                                   Yaakov Selkowitz
-zeitgeist                                    Yaakov Selkowitz
-zeitgeist-datasources                        Yaakov Selkowitz
-zenity                                       Yaakov Selkowitz
-zinnia                                       Yaakov Selkowitz
-zinnia-tomoe                                 Yaakov Selkowitz
-zip                                          Yaakov Selkowitz
-zlib                                         Yaakov Selkowitz
-znc                                          Alexey Sokolov
-zoo                                          Jari Aalto
-zsh                                          Peter A. Castro
-zsync                                        Jari Aalto
-zziplib                                      Yaakov Selkowitz
-_autorebase                                  Achim Gratz
-_update-info-dir                             ORPHANED
diff --git a/testdata/pkglist/expected b/testdata/pkglist/expected
deleted file mode 100644
index c9cd92c..0000000
--- a/testdata/pkglist/expected
+++ /dev/null
@@ -1,55 +0,0 @@
-{'Aaron Schneider': maintainers.Maintainer('Aaron Schneider', [], ['pv']),
- 'Achim Gratz': maintainers.Maintainer('Achim Gratz', [], ['base-files', 'cloog-isl', 'gmp', 'gnucap', 'groff', 'isl', 'maxima', 'md5deep', 'mosh', 'mpclib', 'mpfr', 'perl', 'perl-Algorithm-Diff', 'perl-Archive-Zip', 'perl-autovivification', 'perl-B-Generate', 'perl-Business-ISBN', 'perl-Business-ISBN-Data', 'perl-Business-ISMN', 'perl-Business-ISSN', 'perl-Capture-Tiny', 'perl-Carp', 'perl-Class-XSAccessor', 'perl-Clone', 'perl-common-sense', 'perl-Compress-Bzip2', 'perl-Config-AutoConf', 'perl-Config-Perl-V', 'perl-Config-Tiny', 'perl-CPAN-Changes', 'perl-CPAN-DistnameInfo', 'perl-CPAN-Meta', 'perl-CPAN-Meta-Check', 'perl-CPAN-Meta-Requirements', 'perl-CPAN-Meta-YAML', 'perl-CPAN-Reporter', 'perl-CPAN-Testers-Report', 'perl-Crypt-OpenSSL-Bignum', 'perl-Crypt-OpenSSL-DSA', 'perl-Crypt-OpenSSL-EC', 'perl-Crypt-OpenSSL-ECDSA', 'perl-Crypt-OpenSSL-Random', 'perl-Crypt-OpenSSL-RSA', 'perl-Data-Alias', 'perl-Data-Compare', 'perl-Data-Diver', 'perl-Data-Dump', 'perl-Data-GUID', 'perl-Data-OptList', 'perl-Data-UUID', 'perl-Date-Simple', 'perl-DBD-mysql', 'perl-DBD-SQLite', 'perl-DBI', 'perl-Devel-Autoflush', 'perl-Devel-Symdump', 'perl-Digest-BubbleBabble', 'perl-Digest-GOST', 'perl-Digest-HMAC', 'perl-Digest-SHA1', 'perl-Encode-EUCJPASCII', 'perl-Encode-HanExtra', 'perl-Encode-ISO2022', 'perl-Encode-JIS0213', 'perl-Encode-JIS2K', 'perl-Encode-Locale', 'perl-Error', 'perl-Exporter-Tiny', 'perl-ExtUtils-CBuilder', 'perl-ExtUtils-Depends', 'perl-ExtUtils-F77', 'perl-ExtUtils-LibBuilder', 'perl-ExtUtils-MakeMaker', 'perl-ExtUtils-PkgConfig', 'perl-File-Copy-Recursive', 'perl-File-Find-HomeDir', 'perl-File-Find-Object', 'perl-File-Find-Object-Rule', 'perl-File-Find-Rule', 'perl-File-Listing', 'perl-File-pushd', 'perl-File-Slurp', 'perl-File-Slurp-Tiny', 'perl-File-Slurp-Unicode', 'perl-File-Which', 'perl-Getopt-ArgvFile', 'perl-gettext', 'perl-HTML-Parser', 'perl-HTML-Tagset', 'perl-HTTP-Cookies', 'perl-HTTP-Daemon', 'perl-HTTP-Date', 'perl-HTTP-Message', 'perl-HTTP-Negotiate', 'perl-inc-latest', 'perl-Inline', 'perl-Inline-Files', 'perl-IO-CaptureOutput', 'perl-IO-HTML', 'perl-IO-Prompt-Tiny', 'perl-IO-Socket-INET6', 'perl-IO-Socket-IP', 'perl-IO-Socket-SSL', 'perl-IO-String', 'perl-IO-Tty', 'perl-IPC-Cmd', 'perl-IPC-Run', 'perl-IPC-Run3', 'perl-JSON', 'perl-JSON-PP', 'perl-JSON-XS', 'perl-libwww-perl', 'perl-List-AllUtils', 'perl-List-MoreUtils', 'perl-Locale-gettext', 'perl-Log-Log4perl', 'perl-LWP-MediaTypes', 'perl-LWP-Protocol-https', 'perl-Metabase-Client-Simple', 'perl-Metabase-Fact', 'perl-MIME-Base32', 'perl-MIME-Charset', 'perl-Module-Build', 'perl-Module-Metadata', 'perl-Module-ScanDeps', 'perl-Module-Signature', 'perl-Mozilla-CA', 'perl-Net-DNS', 'perl-Net-DNS-SEC', 'perl-Net-HTTP', 'perl-Net-IP', 'perl-Net-SSLeay', 'perl-Number-Compare', 'perl-PadWalker', 'perl-PAR', 'perl-PAR-Dist', 'perl-Params-Util', 'perl-Parse-CPAN-Meta', 'perl-Parse-RecDescent', 'perl-Path-Class', 'perl-Pod-Coverage', 'perl-Pod-Escapes', 'perl-Pod-Simple', 'perl-POD2-Base', 'perl-Probe-Perl', 'perl-Proc-ProcessTable', 'perl-Readonly', 'perl-Readonly-XS', 'perl-Regexp-Common', 'perl-Scalar-List-Utils', 'perl-Socket', 'perl-Socket6', 'perl-Spiffy', 'perl-Sub-Exporter', 'perl-Sub-Install', 'perl-Sub-Uplevel', 'perl-Tee', 'perl-Term-ReadKey', 'perl-Term-ReadLine-Gnu', 'perl-Term-ReadLine-Perl', 'perl-TermReadKey', 'perl-Test-Base', 'perl-Test-CPAN-Meta', 'perl-Test-Deep', 'perl-Test-Differences', 'perl-Test-Exception', 'perl-Test-Fatal', 'perl-Test-LeakTrace', 'perl-Test-NoWarnings', 'perl-Test-Pod', 'perl-Test-Pod-Coverage', 'perl-Test-Reporter', 'perl-Test-Reporter-Transport-Metabase', 'perl-Test-Requires', 'perl-Test-Script', 'perl-Test-Simple', 'perl-Test-TrailingSpace', 'perl-Test-Warn', 'perl-Test-Warnings', 'perl-Test-Without-Module', 'perl-Test-YAML', 'perl-Text-BibTeX', 'perl-Text-CharWidth', 'perl-Text-CSV', 'perl-Text-CSV_XS', 'perl-Text-Diff', 'perl-Text-Glob', 'perl-Text-Roman', 'perl-Text-WrapI18N', 'perl-Tie-Cycle', 'perl-TimeDate', 'perl-Try-Tiny', 'perl-Types-Serialiser', 'perl-Unicode-Collate', 'perl-Unicode-GCString', 'perl-Unicode-LineBreak', 'perl-Unicode-Normalize', 'perl-URI', 'perl-Win32', 'perl-WWW-Curl', 'perl-WWW-RobotRules', 'perl-XML-LibXML', 'perl-XML-LibXML-Simple', 'perl-XML-LibXSLT', 'perl-XML-NamespaceSupport', 'perl-XML-Parser', 'perl-XML-SAX', 'perl-XML-SAX-Base', 'perl-XML-SAX-Expat', 'perl-XML-Simple', 'perl-XML-Writer', 'perl-YAML', 'perl-YAML-LibYAML', 'rcs', 'run', 'ucl', 'upx', '_autorebase']),
- 'Adam Dinwoodie': maintainers.Maintainer('Adam Dinwoodie', [], ['git']),
- 'Alexey Sokolov': maintainers.Maintainer('Alexey Sokolov', [], ['znc']),
- 'Andrew Schulman': maintainers.Maintainer('Andrew Schulman', [], ['atool', 'autossh', 'bc', 'discus', 'fish', 'lftp', 'libargp', 'nosleep', 'orpie', 'pinfo', 'ploticus', 'ploticus-doc', 'screen', 'sitecopy', 'sng', 'socat', 'stow', 'stunnel', 'time', 'unison2.27', 'unison2.32', 'unison2.40', 'unison2.45', 'unison2.48']),
- 'Blooey McFooey': maintainers.Maintainer('Blooey McFooey', [], ['perl-Net-SMTP-SSL', 'testpackage']),
- 'Bob Heckel': maintainers.Maintainer('Bob Heckel', [], ['libgc', 'w3m']),
- 'Chris J. Breisch': maintainers.Maintainer('Chris J. Breisch', [], ['man-db']),
- 'Chris LeBlanc': maintainers.Maintainer('Chris LeBlanc', [], ['python-h5py', 'python3-h5py']),
- 'Christian Franke': maintainers.Maintainer('Christian Franke', [], ['busybox', 'cdrkit', 'ddrescue', 'hostname', 'isomaster', 'ncdu', 'postfix', 'smartmontools']),
- 'Christian Kellermann': maintainers.Maintainer('Christian Kellermann', [], ['chicken']),
- 'Corinna Vinschen': maintainers.Maintainer('Corinna Vinschen', [], ['attr', 'base-cygwin', 'catgets', 'cpio', 'crypt', 'csih', 'cygrunsrv', 'cygwin', 'cygwin-devel', 'editrights', 'email', 'eventlog', 'fetchmail', 'file', 'gawk', 'gdb', 'getent', 'ipc-utils', 'libedit', 'login', 'lynx', 'mt', 'nc', 'nc6', 'openssh', 'openssl', 'patch', 'pl', 'psmisc', 'rebase', 'recode', 'rlwrap', 'rng-tools', 'robots', 'sed', 'ssmtp', 'syslog-ng', 'tcsh', 'tin', 'tzcode', 'windows-default-manifest', 'xinetd']),
- 'Damien Doligez': maintainers.Maintainer('Damien Doligez', [], ['ocaml']),
- 'Daniel Boland': maintainers.Maintainer('Daniel Boland', [], ['libfakesu', 'procmail', 'sendmail']),
- 'Dave Kilroy': maintainers.Maintainer('Dave Kilroy', [], ['chere']),
- 'David Levine': maintainers.Maintainer('David Levine', [], ['nmh', 'par']),
- 'David Rothenberger': maintainers.Maintainer('David Rothenberger', [], ['cyrus-sasl', 'flac', 'git-review', 'libao', 'libapr1', 'libaprutil1', 'libkate', 'libogg', 'librsync', 'libtheora', 'libvorbis', 'net-snmp', 'pdftk', 'rdiff-backup', 'scons', 'serf', 'speex', 'subversion', 'svn_load_dirs', 'vorbis-tools', 'which', 'whois']),
- 'David Stacey': maintainers.Maintainer('David Stacey', [], ['AtomicParsley', 'cppcheck', 'doxygen', 'foobillard', 'icoutils', 'keepassx', 'libebml', 'libmatroska', 'mkvtoolnix', 'mscgen', 'ninvaders', 'perl-Text-CSV', 'perl-Text-CSV_XS', 'poco', 'pugixml', 'tinyxml2', 'xloadimage', 'xmlstarlet', 'yasm']),
- 'Dean Scarff': maintainers.Maintainer('Dean Scarff', [], ['nasm']),
- 'Dr. Volker Zell': maintainers.Maintainer('Dr. Volker Zell', [], ['aalib', 'aspell', 'aspell-de', 'aspell-en', 'aspell-pl', 'aspell-sv', 'balance', 'bsflite', 'cadaver', 'compface', 'db', 'db4.5', 'db4.8', 'enscript', 'freeglut', 'gd', 'ghostscript', 'ghostscript-fonts-other', 'ghostscript-fonts-std', 'gnubg', 'gnuplot', 'gnutls', 'gq', 'gv', 'hp2xx', 'httperf', 'initscripts', 'jasper', 'jgraph', 'lcms', 'lcms2', 'libdiscid', 'libEMF', 'libfpx', 'libidn', 'liblzo2', 'libmcrypt', 'libmng', 'libsmi', 'libtasn1', 'libwmf', 'lzo2', 'mcrypt', 'ming', 'multitail', 'neon', 'nettle', 'opencdk', 'openldap', 'pakchois', 'picard', 'pstoedit', 'python-discid', 'python-mutagen', 'squid', 'sysvinit', 't1lib', 'tcm', 'ted', 'texi2html', 'transfig', 'uw-imap', 'WordNet', 'xclip', 'xemacs', 'xemacs-mule-sumo', 'xemacs-sumo', 'xfig', 'XmHTML', 'xpdf']),
- 'Eric Blake': maintainers.Maintainer('Eric Blake', [], ['bash', 'bash-completion', 'bashdb', 'bison', 'coreutils', 'cppi', 'cvsutils', 'dash', 'diffstat', 'diffutils', 'findutils', 'gperf', 'grep', 'gzip', 'libsigsegv', 'm4', 'patchutils', 'readline', 'sharutils', 'tar', 'wget']),
- 'Erwin Waterlander': maintainers.Maintainer('Erwin Waterlander', [], ['dos2unix', 'libpipeline', 'libunistring']),
- 'Federico Hernandez': maintainers.Maintainer('Federico Hernandez', [], ['task']),
- 'Frank Fesevur': maintainers.Maintainer('Frank Fesevur', [], ['shutdown']),
- 'Gernot Hillier': maintainers.Maintainer('Gernot Hillier', [], ['tftp']),
- 'Jan Nijtmans': maintainers.Maintainer('Jan Nijtmans', [], ['sqlite3']),
- 'Jari Aalto': maintainers.Maintainer('Jari Aalto', [], ['abook', 'aewm++', 'aewm++-goodies', 'afio', 'annoyance-filter', 'antiword', 'apng2gif', 'apngasm', 'apngdis', 'apngopt', 'apngtools', 'arc', 'archivemail', 'arj', 'aview', 'bcrypt', 'bmp2png', 'bool', 'boxes', 'bsfilter', 'bvi', 'bzr', 'cccc', 'cdargs', 'cfget', 'cfourcc', 'cfv', 'cgdb', 'checkbashisms', 'chewmail', 'chkconfig', 'code2html', 'codeville', 'colorgcc', 'convmv', 'copyright-update', 'corkscrew', 'cscope', 'ctorrent', 'ddir', 'delta', 'deroff', 'dhttpd', 'dog', 'duff', 'epstool', 'fcrackzip', 'fdupes', 'figlet', 'flawfinder', 'flip', 'flog', 'fossil', 'getmail', 'gif2apng', 'git-oodiff', 'greed', 'grepmail', 'gt5', 'guilt', 'httping', 'httptunnel', 'ifile', 'ii', 'indent', 'integrit', 'ipcalc', 'iprint', 'iselect', 'jlint', 'joe', 'keychain', 'kgb', 'lcab', 'licensecheck', 'linklint', 'links', 'lv', 'lzop', 'mairix', 'makepasswd', 'makeself', 'mboxcheck', 'mercurial', 'micro-httpd', 'mmv', 'most', 'msmtp', 'ncftp', 'newmail', 'nrss', 'nttcp', 'odt2txt', 'offlineimap', 'ogmtools', 'oodiff', 'optipng', 'outguess', 'patcher', 'pax', 'pngcheck', 'pngcrush', 'pngquant', 'posh', 'potrace', 'pristine-tar', 'pscan', 'pstotext', 'pwgen', 'pwget', 'pylint', 'python-crypto', 'python-feedparser', 'python-logilab-astng', 'python-logilab-common', 'python-paramiko', 'qiv', 'qsf', 'quilt', 'rats', 'rc', 'rdtool', 'renameutils', 'renattach', 'rsnapshot', 'rsync', 'rtf2html-htdig', 'rxp', 'rzip', 'sendxmpp', 'sgrep', 'shed', 'sic', 'signify', 'since', 'spambayes', 'spamoracle', 'splint', 'splitpatch', 'steghide', 'stgit', 'suck', 'sudoku', 'svn-load', 'symlinks', 'tailor', 'tig', 'tinyirc', 'tirc', 'tnef', 'tnftp', 'tree', 'ttcp', 'txt2regex', 'unace', 'unalz', 'unifdef', 'unrtf', 'untex', 'urlgrabber', 'vfu', 'wcd', 'wdiff', 'webcheck', 'wiggle', 'wput', 'xgraph', 'xlhtml', 'xlsx2csv', 'xtail', 'ytree', 'zoo', 'zsync']),
- 'Joel Johnson': maintainers.Maintainer('Joel Johnson', [], ['iperf']),
- 'Jon Turney': maintainers.Maintainer('Jon Turney', ['jon@invalid.local'], ['buildbot-slave', 'cygwin-doc', 'cygwin-x-doc', 'ddd', 'dmalloc', 'font-bitstream-vera-ttf', 'gdb', 'google-breakpad', 'khronos-opengl-registry', 'libxcwm', 'mingw64-i686-google-breakpad', 'mingw64-x86_64-google-breakpad', 'xlaunch', 'xmon', 'xorg-server', 'XtoW', 'xview', 'xwin-xdg-menu']),
- 'Jonathan Yong': maintainers.Maintainer('Jonathan Yong', [], ['binutils', 'gcc', 'gendef', 'libmangle', 'lzip', 'lziprecover', 'mingw64-i686-binutils', 'mingw64-i686-gcc', 'mingw64-i686-headers', 'mingw64-i686-pthreads', 'mingw64-i686-runtime', 'mingw64-i686-windows-default-manifest', 'mingw64-i686-winpthreads', 'mingw64-x86_64-binutils', 'mingw64-x86_64-gcc', 'mingw64-x86_64-headers', 'mingw64-x86_64-pthreads', 'mingw64-x86_64-runtime', 'mingw64-x86_64-windows-default-manifest', 'mingw64-x86_64-winpthreads', 'w32api-headers', 'w32api-runtime']),
- 'Jorge Díaz': maintainers.Maintainer('Jorge Díaz', [], ['varnish']),
- 'Ken Brown': maintainers.Maintainer('Ken Brown', [], ['asymptote', 'biber', 'bzr-fastimport', 'clisp', 'emacs', 'emacs-auctex', 'fcgi', 'ffcall', 'icu', 'perl-autovivification', 'perl-Business-ISBN', 'perl-Business-ISBN-Data', 'perl-Business-ISMN', 'perl-Business-ISSN', 'perl-Capture-Tiny', 'perl-Config-AutoConf', 'perl-Data-Compare', 'perl-Data-Diver', 'perl-Data-Dump', 'perl-Date-Simple', 'perl-Encode-EUCJPASCII', 'perl-Encode-HanExtra', 'perl-Encode-JIS2K', 'perl-ExtUtils-LibBuilder', 'perl-File-Find-Rule', 'perl-File-Slurp', 'perl-File-Slurp-Unicode', 'perl-IO-HTML', 'perl-IPC-Run3', 'perl-List-AllUtils', 'perl-List-MoreUtils', 'perl-Log-Log4perl', 'perl-LWP-Protocol-https', 'perl-MIME-Charset', 'perl-Mozilla-CA', 'perl-Number-Compare', 'perl-Readonly', 'perl-Readonly-XS', 'perl-Regexp-Common', 'perl-Text-BibTeX', 'perl-Text-Glob', 'perl-Text-Roman', 'perl-Tie-Cycle', 'perl-Unicode-Collate', 'perl-Unicode-GCString', 'perl-Unicode-LineBreak', 'perl-Unicode-Normalize', 'perl-XML-LibXML-Simple', 'perl-XML-LibXSLT', 'perl-XML-Writer', 'python-fastimport', 'svm', 'texinfo', 'texlive', 'texlive-collection-basic', 'texlive-collection-basic-doc', 'texlive-collection-bibtexextra', 'texlive-collection-bibtexextra-doc', 'texlive-collection-binextra', 'texlive-collection-binextra-doc', 'texlive-collection-context', 'texlive-collection-context-doc', 'texlive-collection-fontsextra', 'texlive-collection-fontsextra-doc', 'texlive-collection-fontsrecommended', 'texlive-collection-fontsrecommended-doc', 'texlive-collection-fontutils', 'texlive-collection-fontutils-doc', 'texlive-collection-formatsextra', 'texlive-collection-games', 'texlive-collection-genericextra', 'texlive-collection-genericextra-doc', 'texlive-collection-genericrecommended', 'texlive-collection-genericrecommended-doc', 'texlive-collection-htmlxml', 'texlive-collection-humanities', 'texlive-collection-humanities-doc', 'texlive-collection-langafrican', 'texlive-collection-langarabic', 'texlive-collection-langchinese', 'texlive-collection-langcjk', 'texlive-collection-langcyrillic', 'texlive-collection-langczechslovak', 'texlive-collection-langenglish', 'texlive-collection-langeuropean', 'texlive-collection-langfrench', 'texlive-collection-langgerman', 'texlive-collection-langgreek', 'texlive-collection-langindic', 'texlive-collection-langitalian', 'texlive-collection-langjapanese', 'texlive-collection-langkorean', 'texlive-collection-langother', 'texlive-collection-langpolish', 'texlive-collection-langportuguese', 'texlive-collection-langspanish', 'texlive-collection-latex', 'texlive-collection-latex-doc', 'texlive-collection-latexextra', 'texlive-collection-latexextra-doc', 'texlive-collection-latexrecommended', 'texlive-collection-latexrecommended-doc', 'texlive-collection-luatex', 'texlive-collection-luatex-doc', 'texlive-collection-mathextra', 'texlive-collection-mathextra-doc', 'texlive-collection-metapost', 'texlive-collection-metapost-doc', 'texlive-collection-music', 'texlive-collection-music-doc', 'texlive-collection-omega', 'texlive-collection-pictures', 'texlive-collection-pictures-doc', 'texlive-collection-plainextra', 'texlive-collection-pstricks', 'texlive-collection-pstricks-doc', 'texlive-collection-publishers', 'texlive-collection-publishers-doc', 'texlive-collection-science', 'texlive-collection-science-doc', 'texlive-collection-xetex', 'texlive-collection-xetex-doc']),
- 'Klaus Grue': maintainers.Maintainer('Klaus Grue', [], ['logiweb']),
- 'Marco Atzeri': maintainers.Maintainer('Marco Atzeri', [], ['4ti2', 'amd', 'arpack', 'autotrace', 'bsdiff', 'btf', 'camd', 'catdoc', 'ccolamd', 'ccrypt', 'cddlib', 'cholmod', 'colamd', 'connect-proxy', 'CUnit', 'cvs', 'cxsparse', 'ed', 'fftw3', 'flint', 'gl2ps', 'glpk', 'gnupg', 'GraphicsMagick', 'guile', 'hdf5', 'hwloc', 'ImageMagick', 'irssi', 'klu', 'lapack', 'ldl', 'leptonica', 'less', 'libgeotiff', 'libtorrent', 'lilypond', 'lyx', 'make', 'mc', 'metis', 'mutt', 'netcdf', 'netcdf-cxx4', 'netcdf-fortran', 'ngspice', 'ntl', 'octave', 'octave-bim', 'octave-cgi', 'octave-communications', 'octave-control', 'octave-data-smoothing', 'octave-database', 'octave-dataframe', 'octave-divand', 'octave-doctest', 'octave-econometrics', 'octave-financial', 'octave-fl-core', 'octave-fpl', 'octave-fuzzy-logic-toolkit', 'octave-ga', 'octave-general', 'octave-generate_html', 'octave-geometry', 'octave-image', 'octave-instrument-control', 'octave-integration', 'octave-interval', 'octave-io', 'octave-level-set', 'octave-linear-algebra', 'octave-lssa', 'octave-ltfat', 'octave-mapping', 'octave-mechanics', 'octave-miscellaneous', 'octave-mpi', 'octave-msh', 'octave-mvn', 'octave-nan', 'octave-ncarray', 'octave-netcdf', 'octave-nurbs', 'octave-ocs', 'octave-octcdf', 'octave-octclip', 'octave-octproj', 'octave-odepkg', 'octave-optics', 'octave-optim', 'octave-optiminterp', 'octave-parallel', 'octave-quaternion', 'octave-queueing', 'octave-secs1d', 'octave-secs2d', 'octave-secs3d', 'octave-signal', 'octave-sockets', 'octave-specfun', 'octave-splines', 'octave-statistics', 'octave-stk', 'octave-strings', 'octave-struct', 'octave-tisean', 'octave-tsa', 'octave-vrml', 'onig', 'openblas', 'openmpi', 'pbzip2', 'ping', 'plotutils', 'postgresql', 'proj', 'pure-ftpd', 'qhull', 'qrupdate', 'R', 'rbio', 'rtorrent', 'singular', 'slang', 'slrn', 'spqr', 'suitesparseconfig', 'surf', 'tesseract-ocr', 'TeXmacs', 'udunits', 'umfpack', 'xdelta', 'xdelta3']),
- 'Marcos Vives Del Sol': maintainers.Maintainer('Marcos Vives Del Sol', [], ['libnfc']),
- 'Mark Hessling': maintainers.Maintainer('Mark Hessling', [], ['regina-rexx']),
- 'Michael Wild': maintainers.Maintainer('Michael Wild', [], ['ssh-pageant', 'tmux']),
- 'Mike DePaulo': maintainers.Maintainer('Mike DePaulo', [], ['gtkperf']),
- 'Mikhail Usenko': maintainers.Maintainer('Mikhail Usenko', [], ['cygcheck-dep']),
- 'ORPHANED': maintainers.Maintainer('ORPHANED', [], ['alternatives', 'aria2', 'asciidoc', 'astyle', 'autobuild', 'byacc', 'ccache', 'ccdoc', 'cgoban', 'colordiff', 'cramfs', 'ctris', 'cvsps', 'cygutils', 'distcc', 'flex', 'gaffitter', 'gcc-tools-epoch1-autoconf', 'gcc-tools-epoch1-automake', 'gcc-tools-epoch2-autoconf', 'gcc-tools-epoch2-automake', 'gnugo', 'googlecl', 'gsl', 'hdparm', 'hexedit', 'inetutils', 'ioperm', 'libassuan', 'libksba', 'libtextcat', 'libustr', 'libXpm-noX', 'maradns', 'mathomatic', 'mhash', 'mingw-binutils', 'mingw-bzip2', 'mingw-gcc', 'mingw-libgcrypt', 'mingw-libgpg-error', 'mingw-pthreads', 'mingw-runtime', 'mingw-w32api', 'mingw-xz', 'mingw-zlib', 'mksh', 'mtd', 'naim', 'nfrotz', 'nfs-server', 'pal', 'pinentry', 'popt', 'protobuf', 'pth', 'python-backports.ssl_match_hostname', 'python-gdata', 'rsh', 'run2', 'rxvt', 'scsh', 'sunrpc', 'tack', 'tcp_wrappers', 'typespeed', 'ucspi-tcp', 'units', 'wtf', 'xsri', '_update-info-dir']),
- 'Pavel Fedin': maintainers.Maintainer('Pavel Fedin', [], ['onc-rpc-devel', 'rpcbind', 'rpm']),
- 'Peter A. Castro': maintainers.Maintainer('Peter A. Castro', [], ['suite3270', 'zsh']),
- 'Peter Rosin': maintainers.Maintainer('Peter Rosin', [], ['libggi2', 'libggimisc2', 'libggiwmh0', 'libgii1']),
- 'Pierre A. Humblet': maintainers.Maintainer('Pierre A. Humblet', [], ['cron', 'exim']),
- 'Sebastien Helleu': maintainers.Maintainer('Sebastien Helleu', [], ['weechat']),
- 'Serge Lamikhov-Center': maintainers.Maintainer('Serge Lamikhov-Center', [], ['ELFIO']),
- 'Stuart Caie': maintainers.Maintainer('Stuart Caie', [], ['cabextract']),
- 'Thomas Wolff': maintainers.Maintainer('Thomas Wolff', [], ['algol68g', 'mined', 'mintty']),
- 'Tony Kelman': maintainers.Maintainer('Tony Kelman', [], ['cmake', 'p7zip', 'python-docutils', 'python-jinja2', 'python-sphinx']),
- 'Warren Young': maintainers.Maintainer('Warren Young', [], ['ctags', 'expat']),
- 'Wei-Ren Chen': maintainers.Maintainer('Wei-Ren Chen', [], ['hidapi', 'mingw64-i686-hidapi', 'mingw64-x86_64-hidapi']),
- 'William A. Hoffman': maintainers.Maintainer('William A. Hoffman', [], ['cmake']),
- 'Yaakov Selkowitz': maintainers.Maintainer('Yaakov Selkowitz', [], ['a2ps', 'accerciser', 'activity-log-manager', 'adobe-source-code-pro-fonts', 'adobe-source-sans-pro-fonts', 'adobe-source-serif-pro-fonts', 'adwaita-icon-theme', 'akonadi', 'alacarte', 'alef-fonts', 'amor', 'analitza', 'anjuta', 'anthy', 'appdata-tools', 'appres', 'appstream-glib', 'ark', 'artwiz-aleczapka-fonts', 'ascii', 'at-spi2-atk', 'at-spi2-core', 'atk1.0', 'atkmm1.6', 'atril', 'attica', 'audiofile', 'autoconf', 'autoconf-archive', 'autoconf2.1', 'autoconf2.5', 'autogen', 'automake', 'automake1.10', 'automake1.11', 'automake1.12', 'automake1.13', 'automake1.14', 'automake1.15', 'automake1.4', 'automake1.5', 'automake1.6', 'automake1.7', 'automake1.8', 'automake1.9', 'automoc4', 'avahi', 'baloo', 'baloo-widgets', 'baobab', 'bdftopcf', 'beforelight', 'bigreqsproto', 'bind', 'bitmap', 'blinken', 'bogofilter', 'bomber', 'boost', 'botan1.10', 'bovo', 'build-docbook-catalog', 'bzip2', 'ca-certificates', 'cairo', 'cairomm1.0', 'caja', 'caja-actions', 'caja-extensions', 'caja-follow-symlink', 'caja-python', 'cantarell-fonts', 'cantor', 'caribou', 'celt051', 'check', 'choqok', 'clamav', 'cln', 'clutter-gtk0.10', 'clutter-gtk1.0', 'clutter1.0', 'cocom', 'cogl', 'compositeproto', 'connectagram', 'corebird', 'cpio', 'cppunit', 'culmus-fonts', 'curl', 'cutemaze', 'cvs2svn', 'cygport', 'cygwin', 'cygwin32', 'cygwin32-binutils', 'cygwin32-bzip2', 'cygwin32-catgets', 'cygwin32-clang', 'cygwin32-cloog-isl', 'cygwin32-crypt', 'cygwin32-default-manifest', 'cygwin32-expat', 'cygwin32-freetype2', 'cygwin32-gcc', 'cygwin32-gettext', 'cygwin32-gmp', 'cygwin32-gnutls', 'cygwin32-isl', 'cygwin32-jbigkit', 'cygwin32-libbfd', 'cygwin32-libedit', 'cygwin32-libffi', 'cygwin32-libiconv', 'cygwin32-libmpc', 'cygwin32-libpng', 'cygwin32-libtasn1', 'cygwin32-libtool', 'cygwin32-libX11', 'cygwin32-libXau', 'cygwin32-libxcb', 'cygwin32-libXdmcp', 'cygwin32-lzo2', 'cygwin32-mpfr', 'cygwin32-ncurses', 'cygwin32-nettle', 'cygwin32-openssl', 'cygwin32-p11-kit', 'cygwin32-pcre', 'cygwin32-pkg-config', 'cygwin32-readline', 'cygwin32-w32api-headers', 'cygwin32-w32api-runtime', 'cygwin32-xproto', 'cygwin32-zlib', 'cygwin64', 'cygwin64-binutils', 'cygwin64-bzip2', 'cygwin64-catgets', 'cygwin64-clang', 'cygwin64-cloog-isl', 'cygwin64-crypt', 'cygwin64-db', 'cygwin64-default-manifest', 'cygwin64-e2fsprogs', 'cygwin64-expat', 'cygwin64-fontconfig', 'cygwin64-freetype2', 'cygwin64-gcc', 'cygwin64-gdbm', 'cygwin64-gettext', 'cygwin64-gmp', 'cygwin64-gnutls', 'cygwin64-isl', 'cygwin64-jbigkit', 'cygwin64-libarchive', 'cygwin64-libbfd', 'cygwin64-libdmx', 'cygwin64-libedit', 'cygwin64-libffi', 'cygwin64-libfontenc', 'cygwin64-libgcrypt', 'cygwin64-libgpg-error', 'cygwin64-libICE', 'cygwin64-libiconv', 'cygwin64-libjpeg-turbo', 'cygwin64-libmagic', 'cygwin64-libmpc', 'cygwin64-libpng', 'cygwin64-libSM', 'cygwin64-libssh2', 'cygwin64-libtasn1', 'cygwin64-libtool', 'cygwin64-libX11', 'cygwin64-libXau', 'cygwin64-libXaw', 'cygwin64-libxcb', 'cygwin64-libXcomposite', 'cygwin64-libXdamage', 'cygwin64-libXdmcp', 'cygwin64-libXext', 'cygwin64-libXfixes', 'cygwin64-libXft', 'cygwin64-libXi', 'cygwin64-libxml2', 'cygwin64-libXmu', 'cygwin64-libXpm', 'cygwin64-libXrandr', 'cygwin64-libXrender', 'cygwin64-libxslt', 'cygwin64-libXss', 'cygwin64-libXt', 'cygwin64-lzo2', 'cygwin64-mpfr', 'cygwin64-ncurses', 'cygwin64-nettle', 'cygwin64-openssl', 'cygwin64-p11-kit', 'cygwin64-pcre', 'cygwin64-pixman', 'cygwin64-pkg-config', 'cygwin64-popt', 'cygwin64-python', 'cygwin64-readline', 'cygwin64-sqlite3', 'cygwin64-tcl', 'cygwin64-tiff', 'cygwin64-tk', 'cygwin64-util-linux', 'cygwin64-w32api-headers', 'cygwin64-w32api-runtime', 'cygwin64-xcb-util', 'cygwin64-xcb-util-image', 'cygwin64-xcb-util-wm', 'cygwin64-xproto', 'cygwin64-zlib', 'damageproto', 'dblatex', 'dbus', 'dbus-glib', 'dconf', 'dejagnu', 'dejavu-fonts', 'desktop-file-utils', 'devhelp', 'dialog', 'djvulibre', 'dmtx-utils', 'dmxproto', 'docbook-dsssl', 'docbook-sgml30', 'docbook-sgml31', 'docbook-sgml40', 'docbook-sgml41', 'docbook-sgml42', 'docbook-sgml43', 'docbook-sgml44', 'docbook-sgml45', 'docbook-utils', 'docbook-xml-simple10', 'docbook-xml-simple11', 'docbook-xml412', 'docbook-xml42', 'docbook-xml43', 'docbook-xml44', 'docbook-xml45', 'docbook-xsl', 'docbook-xsl-ns', 'docbook2X', 'e2fsimage', 'e2fsprogs', 'ebook-tools', 'editres', 'eekboard', 'eigen3', 'empathy', 'enchant', 'engrampa', 'eog', 'eog-plugins', 'eom', 'epiphany', 'esound', 'evince', 'evolution', 'evolution-data-server', 'evolution-ews', 'exempi', 'exif', 'exiv2', 'exo', 'expect', 'extra-cmake-modules', 'faience-icon-theme', 'farstream0.2', 'fbpanel', 'fbxkb', 'file', 'file-roller', 'five-or-more', 'fixesproto', 'flexdll', 'fltk', 'fluidsynth', 'focuswriter', 'folks', 'font-util', 'fontconfig', 'fontforge', 'fontsproto', 'fonttosfnt', 'four-in-a-row', 'freerdp', 'freetds', 'freetype2', 'fribidi', 'fslsfonts', 'fstobdf', 'fvwm', 'gamin', 'garcon', 'gccmakedep', 'GConf2', 'gconfmm2.6', 'gcr', 'gdb', 'gdbm', 'gdk-pixbuf2.0', 'gdl3', 'gedit', 'gedit-code-assistance', 'gedit-plugins', 'geoclue', 'geocode-glib', 'GeoIP', 'GeoIP-database', 'gettext', 'giflib', 'gigolo', 'girara', 'glade', 'glade2', 'glade3', 'gle', 'glew', 'glib1.2', 'glib2.0', 'glib2.0-networking', 'glibmm2.4', 'glproto', 'glu', 'glw', 'gmime2.6', 'gnome-activity-journal', 'gnome-applets', 'gnome-backgrounds', 'gnome-calculator', 'gnome-chess', 'gnome-clocks', 'gnome-code-assistance', 'gnome-common', 'gnome-contacts', 'gnome-control-center', 'gnome-desktop', 'gnome-devel-docs', 'gnome-dictionary', 'gnome-doc-utils', 'gnome-flashback', 'gnome-font-viewer', 'gnome-getting-started-docs', 'gnome-icon-theme', 'gnome-keyring', 'gnome-klotski', 'gnome-mahjongg', 'gnome-menus', 'gnome-mime-data', 'gnome-mines', 'gnome-nibbles', 'gnome-online-accounts', 'gnome-panel', 'gnome-python', 'gnome-python-desktop', 'gnome-python-extras', 'gnome-robots', 'gnome-screenshot', 'gnome-session', 'gnome-settings-daemon', 'gnome-sudoku', 'gnome-system-log', 'gnome-system-monitor', 'gnome-terminal', 'gnome-tetravex', 'gnome-themes-standard', 'gnome-tweak-tool', 'gnome-user-docs', 'gnome-vfs2', 'gnome-vfsmm2.6', 'gnu-free-fonts', 'gnuchess', 'gob2', 'gobject-introspection', 'goffice0.10', 'goffice0.8', 'gom', 'goocanvas', 'goocanvas2.0', 'goocanvasmm2.0', 'gottet', 'gpgme', 'gpicview', 'grace', 'granatier', 'graphite2', 'graphviz', 'grilo0.2', 'grilo0.2-plugins', 'gsettings-desktop-schemas', 'gsm', 'gstreamer0.10', 'gstreamer0.10-plugins-base', 'gstreamer0.10-plugins-good', 'gstreamer1.0', 'gstreamer1.0-plugins-base', 'gstreamer1.0-plugins-good', 'gt', 'gtk-doc', 'gtk-vnc', 'gtk1.2', 'gtk1.2-engines', 'gtk2.0', 'gtk2.0-engines', 'gtk2.0-engines-murrine', 'gtk2.0-engines-smooth', 'gtk3', 'gtk3-engines-unico', 'gtkglarea2.0', 'gtkglext1.0', 'gtkhtml4.0', 'gtkmm2.4', 'gtkmm3.0', 'gtksourceview2.0', 'gtksourceview3.0', 'gtksourceviewmm2.0', 'gtksourceviewmm3.0', 'gtkspell', 'gtkspell3', 'gts', 'gtypist', 'gucharmap', 'gvfs', 'harfbuzz', 'help2man', 'hexalate', 'hexchat', 'hicolor-icon-theme', 'highlight', 'hitori', 'html2ps', 'httpd', 'hunspell', 'iagno', 'ibus', 'ibus-anthy', 'ibus-chewing', 'ibus-gucharmap', 'ibus-handwrite', 'ibus-hangul', 'ibus-input-pad', 'ibus-kkc', 'ibus-m17n', 'ibus-pinyin', 'ibus-qt', 'ibus-skk', 'ibus-unikey', 'ibus-xkb', 'iceauth', 'ico', 'icon-naming-utils', 'ilmbase', 'im-chooser', 'imake', 'imlib', 'imlib2', 'imsettings', 'inconsolata-fonts', 'input-pad', 'inputproto', 'intltool', 'iso-codes', 'itstool', 'jbigkit', 'js185', 'json-c', 'json-glib1.0', 'kactivities', 'kajongg', 'kalgebra', 'kalzium', 'kanagram', 'kanjistrokeorders-fonts', 'kapman', 'kapow', 'kasumi', 'kate', 'kate4', 'katomic', 'kblackbox', 'kblocks', 'kbounce', 'kbproto', 'kbrickbuster', 'kbruch', 'kcalc', 'kcharselect', 'kde-base-artwork', 'kde-baseapps', 'kde-l10n-ar', 'kde-l10n-bg', 'kde-l10n-bs', 'kde-l10n-ca', 'kde-l10n-ca-valencia', 'kde-l10n-cs', 'kde-l10n-da', 'kde-l10n-de', 'kde-l10n-el', 'kde-l10n-en_GB', 'kde-l10n-es', 'kde-l10n-et', 'kde-l10n-eu', 'kde-l10n-fa', 'kde-l10n-fi', 'kde-l10n-fr', 'kde-l10n-ga', 'kde-l10n-gl', 'kde-l10n-he', 'kde-l10n-hi', 'kde-l10n-hr', 'kde-l10n-hu', 'kde-l10n-ia', 'kde-l10n-id', 'kde-l10n-is', 'kde-l10n-it', 'kde-l10n-ja', 'kde-l10n-kk', 'kde-l10n-km', 'kde-l10n-kn', 'kde-l10n-ko', 'kde-l10n-lt', 'kde-l10n-lv', 'kde-l10n-mr', 'kde-l10n-nb', 'kde-l10n-nds', 'kde-l10n-nl', 'kde-l10n-nn', 'kde-l10n-pa', 'kde-l10n-pl', 'kde-l10n-pt', 'kde-l10n-pt_BR', 'kde-l10n-ro', 'kde-l10n-ru', 'kde-l10n-si', 'kde-l10n-sk', 'kde-l10n-sl', 'kde-l10n-sr', 'kde-l10n-sv', 'kde-l10n-tg', 'kde-l10n-th', 'kde-l10n-tr', 'kde-l10n-ug', 'kde-l10n-uk', 'kde-l10n-vi', 'kde-l10n-wa', 'kde-l10n-zh_CN', 'kde-l10n-zh_TW', 'kde-runtime', 'kde-wallpapers', 'kde-workspace', 'kdeedu-data', 'kdegraphics-mobipocket', 'kdelibs', 'kdepimlibs', 'kdewebdev', 'kdf', 'kdiamond', 'kf5-attica', 'kf5-frameworkintegration', 'kf5-kactivities', 'kf5-kapidox', 'kf5-karchive', 'kf5-kauth', 'kf5-kbookmarks', 'kf5-kcmutils', 'kf5-kcodecs', 'kf5-kcompletion', 'kf5-kconfig', 'kf5-kconfigwidgets', 'kf5-kcoreaddons', 'kf5-kcrash', 'kf5-kdbusaddons', 'kf5-kdeclarative', 'kf5-kded', 'kf5-kdelibs4support', 'kf5-kdesignerplugin', 'kf5-kdewebkit', 'kf5-kdnssd', 'kf5-kdoctools', 'kf5-kemoticons', 'kf5-kglobalaccel', 'kf5-kguiaddons', 'kf5-khtml', 'kf5-ki18n', 'kf5-kiconthemes', 'kf5-kidletime', 'kf5-kimageformats', 'kf5-kinit', 'kf5-kio', 'kf5-kitemmodels', 'kf5-kitemviews', 'kf5-kjobwidgets', 'kf5-kjs', 'kf5-kjsembed', 'kf5-kmediaplayer', 'kf5-knewstuff', 'kf5-knotifications', 'kf5-knotifyconfig', 'kf5-kpackage', 'kf5-kparts', 'kf5-kpeople', 'kf5-kplotting', 'kf5-kpty', 'kf5-kross', 'kf5-kross-interpreters', 'kf5-krunner', 'kf5-kservice', 'kf5-ktexteditor', 'kf5-ktextwidgets', 'kf5-kunitconversion', 'kf5-kwallet', 'kf5-kwidgetsaddons', 'kf5-kwindowsystem', 'kf5-kxmlgui', 'kf5-kxmlrpcclient', 'kf5-libkdegames', 'kf5-libkmahjongg', 'kf5-plasma', 'kf5-solid', 'kf5-sonnet', 'kf5-threadweaver', 'kfilemetadata', 'kfourinline', 'kgeography', 'kget', 'kgoldrunner', 'kgpg', 'khangman', 'kig', 'kigo', 'killbots', 'kiriki', 'kiten', 'kjumpingcube', 'klavaro', 'klettres', 'klickety', 'klines', 'kmahjongg', 'kmines', 'kmplot', 'knavalbattle', 'knetwalk', 'kolf', 'kollision', 'konquest', 'konsole', 'konsole4', 'konversation', 'kpat', 'krb5', 'krb5-auth-dialog', 'krdc', 'kreversi', 'krfb', 'kshisen', 'ksirk', 'ksnakeduel', 'kspaceduel', 'ksquares', 'kstars', 'ksudoku', 'ksystemlog', 'kteatime', 'ktimer', 'ktorrent', 'ktouch', 'ktuberling', 'kturtle', 'kubrick', 'kwalletmanager', 'kwebkitpart', 'kwordquiz', 'lasem0.4', 'leafpad', 'libarchive', 'libart_lgpl_2', 'libasyncns', 'libbonobo2', 'libbonoboui2', 'libcaca', 'libcanberra', 'libchamplain0.12', 'libchewing', 'libcroco0.6', 'libdaemon', 'libdatrie', 'libdbusmenu-qt', 'libdbusmenu-qt5', 'libdmapsharing3.0', 'libdmtx', 'libdmx', 'libdv', 'libelf', 'libepoxy', 'liberation-fonts', 'libesmtp', 'libevent', 'libexif', 'libffi', 'libfm', 'libfontenc', 'libFS', 'libgcrypt', 'libgda5.0', 'libgdamm5.0', 'libgdata', 'libgee', 'libgee0.8', 'libgit2', 'libgit2-glib1.0', 'libglade2.0', 'libglademm2.4', 'libgnome-keyring', 'libgnome2', 'libgnomecanvas2', 'libgnomecanvasmm2.6', 'libgnomekbd', 'libgnomemm2.6', 'libgnomeui2', 'libgnomeuimm2.6', 'libgpg-error', 'libgsf', 'libgtop2.0', 'libgucharmap', 'libgweather', 'libgxps', 'libhangul', 'libical', 'libICE', 'libiconv', 'libid3tag', 'libIDL2', 'libiodbc', 'libjpeg-turbo', 'libkdeedu', 'libkdegames', 'libkeduvocdocument', 'libkkc', 'libkkc-data', 'libkmahjongg', 'libktorrent', 'libLASi', 'liblqr1', 'libmatekbd', 'libmateweather', 'libmediaart1.0', 'libmetalink', 'libmikmod', 'libmodplug', 'libmspack', 'libnice', 'libnotify', 'liboauth', 'libotf', 'libpaper', 'libpeas', 'libpng', 'libpng10', 'libpng12', 'libpng14', 'libpng15', 'libproxy', 'libpst', 'libqalculate', 'libquvi0.9', 'libquvi0.9-scripts', 'libqzeitgeist', 'librest0.7', 'librsvg2', 'libsamplerate', 'libsecret1', 'libshout', 'libsigc2.0', 'libskk', 'libSM', 'libsndfile', 'libsoup2.4', 'libspectre', 'libspiro', 'libssh', 'libssh2', 'libthai', 'libtimidity', 'libtirpc', 'libtool', 'libungif', 'libuninameslist', 'libunique1.0', 'libunique3.0', 'libusb-win32', 'libusb1.0', 'libverto', 'libvncserver', 'libvoikko', 'libvpx', 'libwebp', 'libWindowsWM', 'libwnck', 'libwnck3', 'libX11', 'libXau', 'libXaw', 'libXaw3d', 'libxcb', 'libXcomposite', 'libXcursor', 'libXdamage', 'libXdmcp', 'libXext', 'libxfce4ui', 'libxfce4util', 'libxfcegui4', 'libXfixes', 'libXfont', 'libXft', 'libXi', 'libXinerama', 'libxkbcommon', 'libxkbfile', 'libxklavier', 'libxml++2.6', 'libxml2', 'libXmu', 'libXpm', 'libXrandr', 'libXrender', 'libXres', 'libXScrnSaver', 'libxslt', 'libXt', 'libXtst', 'libytnef', 'libzeitgiest1.0', 'libzip', 'lightsoff', 'lighttpd', 'linux-libertine-fonts', 'listres', 'llvm', 'lndir', 'login', 'lrzip', 'lskat', 'lua', 'lua-bit', 'lua-crypto', 'lua-json', 'lua-lfs', 'lua-logging', 'lua-lpeg', 'lua-luadoc', 'lua-lxp', 'lua-socket', 'lua5.1', 'luit', 'lxappearance', 'lxappearance-obconf', 'lxde-common', 'lxde-icon-theme', 'lxinput', 'lxmenu-data', 'lxpanel', 'lxsession', 'lxtask', 'lxterminal', 'm17n-contrib', 'm17n-db', 'm17n-lib', 'makedepend', 'malaga', 'man-db', 'marble', 'marco', 'marisa', 'mate-applets', 'mate-backgrounds', 'mate-calc', 'mate-common', 'mate-control-center', 'mate-desktop', 'mate-dialogs', 'mate-icon-theme', 'mate-media', 'mate-menus', 'mate-notification-daemon', 'mate-panel', 'mate-session-manager', 'mate-settings-daemon', 'mate-system-monitor', 'mate-terminal', 'mate-themes', 'mate-themes-extras', 'mate-utils', 'mcpp', 'mdbtools', 'mDNSResponder', 'menu-cache', 'mesa', 'mesa-demos', 'metacity', 'midori', 'mingw64-i686-bzip2', 'mingw64-i686-libgcrypt', 'mingw64-i686-libgpg-error', 'mingw64-i686-pkg-config', 'mingw64-i686-xz', 'mingw64-i686-zlib', 'mingw64-x86_64-bzip2', 'mingw64-x86_64-libgcrypt', 'mingw64-x86_64-libgpg-error', 'mingw64-x86_64-pkg-config', 'mingw64-x86_64-xz', 'mingw64-x86_64-zlib', 'mkcomposecache', 'mkfontdir', 'mkfontscale', 'mm-common', 'monotone', 'motif', 'mousepad', 'mousetweaks', 'mozo', 'mutter', 'mysql', 'nano', 'nas', 'nautilus', 'ncompress', 'ncurses', 'nedit', 'netpbm', 'notification-daemon', 'novprog', 'nspr', 'nss', 'obconf', 'ocaml-facile', 'oclock', 'odbc-mysql', 'odbc-psql', 'odbc-sqlite3', 'okteta', 'okteta4', 'openal', 'openbox', 'openexr', 'openjade', 'openjpeg', 'OpenSP', 'openssl', 'opus', 'opusfile', 'orage', 'ORBit2', 'orc', 'overpass-fonts', 'oxygen-fonts', 'oxygen-icons', 'p11-kit', 'pairs', 'palapeli', 'pango1.0', 'pangomm1.4', 'pangox-compat', 'paprefs', 'parley', 'pavucontrol', 'pcmanfm', 'pcre', 'pdf2djvu', 'peg-e', 'perl-Alien-wxWidgets', 'perl-Archive-Zip', 'perl-Authen-SASL', 'perl-Cairo', 'perl-Cairo-GObject', 'perl-CGI', 'perl-Clone', 'perl-DBD-mysql', 'perl-DBD-SQLite', 'perl-DBI', 'perl-Digest-HMAC', 'perl-Digest-SHA1', 'perl-Encode-Locale', 'perl-ExtUtils-Depends', 'perl-ExtUtils-PkgConfig', 'perl-File-Listing', 'perl-GD', 'perl-Getopt-ArgvFile', 'perl-gettext', 'perl-Glib', 'perl-Glib-Object-Introspection', 'perl-Gnome2', 'perl-Gnome2-Canvas', 'perl-Gnome2-GConf', 'perl-Gnome2-Rsvg', 'perl-Gnome2-VFS', 'perl-Gnome2-Vte', 'perl-Gnome2-Wnck', 'perl-GStreamer', 'perl-GStreamer-Interfaces', 'perl-Gtk2', 'perl-Gtk2-GladeXML', 'perl-Gtk2-Notify', 'perl-Gtk2-SourceView2', 'perl-Gtk2-Spell', 'perl-Gtk2-Unique', 'perl-Gtk2-WebKit', 'perl-Gtk3', 'perl-HTML-Parser', 'perl-HTML-Tagset', 'perl-HTTP-Cookies', 'perl-HTTP-Daemon', 'perl-HTTP-Date', 'perl-HTTP-Message', 'perl-HTTP-Negotiate', 'perl-IO-Socket-IP', 'perl-IO-Socket-SSL', 'perl-Locale-gettext', 'perl-LWP-MediaTypes', 'perl-MailTools', 'perl-Module-Pluggable', 'perl-Module-ScanDeps', 'perl-Net-HTTP', 'perl-Net-SMTP-SSL', 'perl-Net-SSLeay', 'perl-OpenGL', 'perl-Pango', 'perl-PAR', 'perl-PAR-Dist', 'perl-PAR-Packer', 'perl-Params-Util', 'perl-Proc-ProcessTable', 'perl-SGMLSpm', 'perl-Socket', 'perl-Term-ReadKey', 'perl-Term-ReadLine-Gnu', 'perl-Text-CharWidth', 'perl-Text-WrapI18N', 'perl-TimeDate', 'perl-Tk', 'perl-Tk-Canvas-GradientColor', 'perl-Tk-ColoredButton', 'perl-Tk-EntryCheck', 'perl-Tk-Getopt', 'perl-Tk-Pod', 'perl-URI', 'perl-WWW-RobotRules', 'perl-Wx', 'perl-XML-LibXML', 'perl-XML-NamespaceSupport', 'perl-XML-Parser', 'perl-XML-SAX', 'perl-XML-SAX-Base', 'perl-XML-Simple', 'perl-YAML', 'phodav', 'phonon', 'phonon-backend-gstreamer', 'phonon4qt5', 'phonon4qt5-backend-gstreamer', 'php', 'php-Archive_Tar', 'php-Console_Getopt', 'php-jsonc', 'php-PEAR', 'php-Structures_Graph', 'php-XML_Util', 'picmi', 'pixman', 'pkg-config', 'planet', 'pluma', 'pluma-plugins', 'po4a', 'poppler', 'poppler-data', 'portaudio', 'portmidi', 'presentproto', 'prison', 'pulseaudio', 'putty', 'python', 'python-beautifulsoup', 'python-bsddb3', 'python-cairo', 'python-cffi', 'python-chardet', 'python-cryptography', 'python-cython', 'python-dbus', 'python-doc', 'python-enum34', 'python-gi', 'python-gobject', 'python-goocanvas', 'python-gst0.10', 'python-gtk2.0', 'python-gtksourceview2', 'python-htmltmpl', 'python-imaging', 'python-lxml', 'python-mako', 'python-markupsafe', 'python-mx', 'python-numpy', 'python-opengl', 'python-opengl-accelerate', 'python-openssl', 'python-orbit', 'python-ply', 'python-pyasn1', 'python-pycparser', 'python-pygame', 'python-pygments', 'python-pykde4', 'python-pypdf', 'python-pyqt4', 'python-pyqt5', 'python-pyrex', 'python-reportlab', 'python-requests', 'python-setuptools', 'python-simplejson', 'python-sip', 'python-six', 'python-twisted', 'python-unidecode', 'python-urllib3', 'python-webkit', 'python-xdg', 'python-yaml', 'python-zope.interface', 'python3', 'python3-bsddb3', 'python3-cairo', 'python3-cffi', 'python3-chardet', 'python3-cryptography', 'python3-cython', 'python3-dbus', 'python3-doc', 'python3-imaging', 'python3-lxml', 'python3-mako', 'python3-markupsafe', 'python3-numpy', 'python3-openssl', 'python3-ply', 'python3-pyasn1', 'python3-pycparser', 'python3-pygments', 'python3-pykde4', 'python3-pyqt4', 'python3-pyqt5', 'python3-requests', 'python3-setuptools', 'python3-simplejson', 'python3-sip', 'python3-six', 'python3-unidecode', 'python3-urllib3', 'python3-xdg', 'python3-yaml', 'python3-zope.interface', 'pyzy', 'qca', 'qimageblitz', 'qjson', 'qoauth', 'qqwing', 'qrencode', 'qscintilla2', 'qt3', 'qt4', 'qt4-webkit', 'qt5-base', 'qt5-declarative', 'qt5-doc', 'qt5-enginio', 'qt5-graphicaleffects', 'qt5-imageformats', 'qt5-location', 'qt5-multimedia', 'qt5-quick1', 'qt5-quickcontrols', 'qt5-script', 'qt5-serialport', 'qt5-svg', 'qt5-tools', 'qt5-translations', 'qt5-webchannel', 'qt5-webkit', 'qt5-webkit-examples', 'qt5-websockets', 'qt5-x11extras', 'qt5-xmlpatterns', 'quadrapassel', 'quvi', 'randrproto', 'rarian', 'recordproto', 'rendercheck', 'renderproto', 'resourceproto', 'rgb', 'ristretto', 'robodoc', 'rocs', 'rodent-icon-theme', 'rstart', 'ruby', 'ruby-actionmailer', 'ruby-actionpack', 'ruby-actionview', 'ruby-activejob', 'ruby-activemodel', 'ruby-activerecord', 'ruby-activerecord-deprecated_finders', 'ruby-activesupport', 'ruby-arel', 'ruby-atk', 'ruby-bcrypt', 'ruby-bigdecimal', 'ruby-binding_of_caller', 'ruby-builder', 'ruby-bundler', 'ruby-byebug', 'ruby-cairo', 'ruby-cairo-gobject', 'ruby-celluloid', 'ruby-clutter', 'ruby-clutter-gtk', 'ruby-coffee-rails', 'ruby-coffee-script', 'ruby-coffee-script-source', 'ruby-columnize', 'ruby-curses', 'ruby-dbus', 'ruby-debug_inspector', 'ruby-erubis', 'ruby-execjs', 'ruby-gdk3', 'ruby-gdk_pixbuf2', 'ruby-gettext', 'ruby-gio2', 'ruby-glib2', 'ruby-globalid', 'ruby-gobject-introspection', 'ruby-goocanvas1', 'ruby-goocanvas2', 'ruby-gstreamer0.10', 'ruby-gstreamer1.0', 'ruby-gtk2', 'ruby-gtk3', 'ruby-gtksourceview2', 'ruby-gtksourceview3', 'ruby-hike', 'ruby-hitimes', 'ruby-hoe', 'ruby-i18n', 'ruby-io-console', 'ruby-jbuilder', 'ruby-journey', 'ruby-jquery-rails', 'ruby-json', 'ruby-kgio', 'ruby-listen', 'ruby-locale', 'ruby-loofah', 'ruby-mail', 'ruby-mime-types', 'ruby-minitest', 'ruby-minitest4', 'ruby-minitest5', 'ruby-molinillo', 'ruby-multi_json', 'ruby-mysql2', 'ruby-net-http-persistent', 'ruby-nokogiri', 'ruby-oj', 'ruby-pango', 'ruby-pg', 'ruby-pkg-config', 'ruby-polyglot', 'ruby-poppler', 'ruby-psych', 'ruby-racc', 'ruby-rack', 'ruby-rack-cache', 'ruby-rack-ssl', 'ruby-rack-test', 'ruby-rails', 'ruby-rails-deprecated_sanitizer', 'ruby-rails-dom-testing', 'ruby-rails-html-sanitizer', 'ruby-railties', 'ruby-raindrops', 'ruby-rake', 'ruby-rake-compiler', 'ruby-rdoc', 'ruby-rsvg2', 'ruby-sass', 'ruby-sass-rails', 'ruby-sdoc', 'ruby-sprockets', 'ruby-sprockets-rails', 'ruby-sqlite3', 'ruby-test-unit', 'ruby-text', 'ruby-thor', 'ruby-thread_safe', 'ruby-tilt', 'ruby-timers', 'ruby-treetop', 'ruby-turbolinks', 'ruby-tzinfo', 'ruby-uglifier', 'ruby-unicorn', 'ruby-vte', 'ruby-vte3', 'ruby-web-console', 'ruby-webkit-gtk2', 'ruby-yajl', 'rubygems', 'rxvt-unicode', 'scowl', 'scrnsaverproto', 'SDL', 'SDL2', 'SDL2_image', 'SDL2_mixer', 'SDL2_net', 'SDL2_ttf', 'SDL_gfx', 'SDL_image', 'SDL_mixer', 'SDL_net', 'SDL_Pango', 'SDL_sound', 'SDL_ttf', 'seahorse', 'sessreg', 'setxkbmap', 'sgml-common', 'shared-mime-info', 'showfont', 'simsu', 'sj-fonts', 'skkdic', 'sl', 'smproxy', 'snownews', 'sound-theme-freedesktop', 'source-highlight', 'sox', 'spice-gtk', 'spice-protocol', 'startup-notification', 'step', 'strigi', 'suomi-malaga', 'sweeper', 'swell-foop', 'swig', 'taglib', 'tali', 'tanglet', 'tcl', 'tcl-itcl', 'tcl-itk', 'tcl-iwidgets', 'tcl-tix', 'tcl-tk', 'tcl-togl', 'tdb', 'telepathy-farstream', 'telepathy-gabble', 'telepathy-glib', 'telepathy-idle', 'telepathy-logger', 'telepathy-mission-control', 'telepathy-qt', 'terminus-fonts', 'tetzle', 'Thunar', 'tidy', 'tiff', 'tigervnc', 'timidity++', 'totem', 'totem-pl-parser', 'transmission', 'transset', 'trayer', 'tumbler', 'twm', 'tzcode', 'unifont', 'unzip', 'upower', 'usbredir', 'usbutils', 'util-linux', 'vala', 'viewres', 'vim', 'vinagre', 'vino', 'vte', 'vte2.90', 'vte2.91', 'wavpack', 'webkitgtk', 'webrtc-audio-processing', 'wildmidi', 'WindowMaker', 'windowswmproto', 'wxWidgets2.8', 'wxWidgets3.0', 'x11perf', 'xapian-bindings', 'xapian-core', 'xarchiver', 'xauth', 'xbiff', 'xbitmaps', 'xcalc', 'xcb-proto', 'xcb-util', 'xcb-util-cursor', 'xcb-util-image', 'xcb-util-keysyms', 'xcb-util-renderutil', 'xcb-util-wm', 'xclipboard', 'xclock', 'xcmiscproto', 'xcmsdb', 'xcompmgr', 'xconsole', 'xcursor-themes', 'xcursorgen', 'xdbedizzy', 'xdg-user-dirs', 'xdg-user-dirs-gtk', 'xditview', 'xdpyinfo', 'xedit', 'xerces-c', 'xev', 'xextproto', 'xeyes', 'xf86-video-dummy', 'xf86-video-nested', 'xf86bigfontproto', 'xfce-themes', 'xfce4-appfinder', 'xfce4-clipman-plugin', 'xfce4-cpugraph-plugin', 'xfce4-dev-tools', 'xfce4-dict', 'xfce4-embed-plugin', 'xfce4-equake-plugin', 'xfce4-eyes-plugin', 'xfce4-fsguard-plugin', 'xfce4-genmon-plugin', 'xfce4-mailwatch-plugin', 'xfce4-mixer', 'xfce4-notes-plugin', 'xfce4-notifyd', 'xfce4-panel', 'xfce4-places-plugin', 'xfce4-screenshooter', 'xfce4-session', 'xfce4-settings', 'xfce4-smartbookmark-plugin', 'xfce4-taskmanager', 'xfce4-terminal', 'xfce4-time-out-plugin', 'xfce4-timer-plugin', 'xfce4-verve-plugin', 'xfce4-weather-plugin', 'xfce4-whiskermenu-plugin', 'xfce4-wmdock-plugin', 'xfce4-xkb-plugin', 'xfconf', 'xfd', 'xfdesktop', 'xfontsel', 'xfs', 'xfsinfo', 'xfwm4', 'xfwm4-themes', 'xgc', 'xhost', 'xineramaproto', 'xinit', 'xinput', 'xkbcomp', 'xkbevd', 'xkbprint', 'xkbutils', 'xkeyboard-config', 'xkill', 'xload', 'xlogo', 'xlsatoms', 'xlsclients', 'xlsfonts', 'xmag', 'xman', 'xmessage', 'xmh', 'xmlto', 'xmltoman', 'xmodmap', 'xmore', 'xorg-cf-files', 'xorg-docs', 'xorg-scripts', 'xorg-sgml-doctools', 'xorg-util-macros', 'xorg-x11-fonts', 'xpr', 'xprop', 'xproto', 'xrandr', 'xrdb', 'xrefresh', 'xscope', 'xset', 'xsetroot', 'xsm', 'xstdcmap', 'xterm', 'xtrans', 'xwd', 'xwininfo', 'xwinwm', 'xwud', 'xz', 'yakuake', 'yaml', 'yelp', 'yelp-tools', 'yelp-xsl', 'zathura', 'zathura-cb', 'zathura-djvu', 'zathura-pdf-poppler', 'zathura-ps', 'zeitgeist', 'zeitgeist-datasources', 'zenity', 'zinnia', 'zinnia-tomoe', 'zip', 'zlib', 'zziplib']),
- 'Yitzchak Scott-Thoennes': maintainers.Maintainer('Yitzchak Scott-Thoennes', [], ['fortune-mod']),
- 'Yue Ren': maintainers.Maintainer('Yue Ren', [], ['4ti2', 'cddlib', 'flint', 'ntl', 'singular', 'surf'])}
diff --git a/testdata/process_arch/homedir.expected b/testdata/process_arch/homedir.expected
deleted file mode 100644
index 1c52158..0000000
--- a/testdata/process_arch/homedir.expected
+++ /dev/null
@@ -1,18 +0,0 @@
-{'.': ['an_unexpected_file'],
- 'Blooey McFooey': [],
- 'Blooey McFooey/noarch': [],
- 'Blooey McFooey/noarch/release': [],
- 'Blooey McFooey/noarch/release/perl-Net-SMTP-SSL': [],
- 'Blooey McFooey/x86': [],
- 'Blooey McFooey/x86/release': [],
- 'Blooey McFooey/x86/release/after-ready': ['after-ready-1.0-1.tar.bz2', 'setup.hint'],
- 'Blooey McFooey/x86/release/not-on-maintainer-list': ['not-on-maintainer-list-1.0-1.tar.bz2', 'setup.hint'],
- 'Blooey McFooey/x86/release/not-on-package-list': ['not-on-package-list-1.0-1.tar.bz2', 'setup.hint'],
- 'Blooey McFooey/x86/release/not-ready': ['-not-ready-0.9-1.tar.bz2', 'not-ready-1.0-1.tar.bz2', 'setup.hint'],
- 'Blooey McFooey/x86/release/testpackage': [],
- 'Blooey McFooey/x86/release/testpackage/testpackage-subpackage': [],
- 'Blooey McFooey/x86/release/testpackage2': ['setup.hint', 'testpackage2-1.0-1.tar.bz2'],
- 'Blooey McFooey/x86/release/testpackage2/testpackage2-subpackage': ['inprogress.SftpXFR.1234',
-                                                                     'setup.hint',
-                                                                     'testpackage2-subpackage-1.0-1.tar.bz2'],
- 'Jon Turney': ['!email']}
diff --git a/testdata/process_arch/htdocs.expected b/testdata/process_arch/htdocs.expected
deleted file mode 100644
index 4670972..0000000
--- a/testdata/process_arch/htdocs.expected
+++ /dev/null
@@ -1,29 +0,0 @@
-{'.': [],
- 'x86': ['.htaccess', 'packages.inc'],
- 'x86/arc': ['.htaccess', 'arc-4.32.7-10', 'arc-4.32.7-10-src'],
- 'x86/base-cygwin': ['.htaccess', 'base-cygwin-3.6-1', 'base-cygwin-3.8-1'],
- 'x86/cygwin': ['.htaccess',
-                'cygwin-2.2.0-1',
-                'cygwin-2.2.0-1-src',
-                'cygwin-2.2.1-1',
-                'cygwin-2.2.1-1-src',
-                'cygwin-2.3.0-0.3',
-                'cygwin-2.3.0-0.3-src'],
- 'x86/cygwin-debuginfo': ['.htaccess',
-                          'cygwin-debuginfo-2.2.0-1',
-                          'cygwin-debuginfo-2.2.1-1',
-                          'cygwin-debuginfo-2.3.0-0.3'],
- 'x86/cygwin-devel': ['.htaccess', 'cygwin-devel-2.2.0-1', 'cygwin-devel-2.2.1-1', 'cygwin-devel-2.3.0-0.3'],
- 'x86/keychain': ['.htaccess', 'keychain-2.6.8-1', 'keychain-2.6.8-1-src', 'keychain-2.7.1-1', 'keychain-2.7.1-1-src'],
- 'x86/libdns_sd-devel': ['.htaccess', 'libdns_sd-devel-379.32.1-1'],
- 'x86/libdns_sd1': ['.htaccess', 'libdns_sd1-379.32.1-1'],
- 'x86/mDNSResponder': ['.htaccess', 'mDNSResponder-379.32.1-1', 'mDNSResponder-379.32.1-1-src'],
- 'x86/openssh': ['.htaccess', 'openssh-7.2p2-1', 'openssh-7.2p2-1-src'],
- 'x86/perl-Net-SMTP-SSL': ['.htaccess',
-                           'perl-Net-SMTP-SSL-1.03-1',
-                           'perl-Net-SMTP-SSL-1.03-1-src',
-                           'perl-Net-SMTP-SSL-1.03-2',
-                           'perl-Net-SMTP-SSL-1.03-2-src'],
- 'x86/rpm-doc': ['.htaccess', 'rpm-doc-4.1-2', 'rpm-doc-4.1-2-src', 'rpm-doc-999-1'],
- 'x86/testpackage': ['.htaccess', 'testpackage-1.0-1', 'testpackage-1.0-1-src'],
- 'x86/testpackage-subpackage': ['.htaccess', 'testpackage-subpackage-1.0-1']}
diff --git a/testdata/process_arch/rel_area.expected b/testdata/process_arch/rel_area.expected
deleted file mode 100644
index 44161bf..0000000
--- a/testdata/process_arch/rel_area.expected
+++ /dev/null
@@ -1,66 +0,0 @@
-{'.': ['setup.ini'],
- 'noarch': ['sha512.sum'],
- 'noarch/release': ['sha512.sum'],
- 'noarch/release/perl-Net-SMTP-SSL': ['perl-Net-SMTP-SSL-1.03-1-src.tar.xz',
-                                      'perl-Net-SMTP-SSL-1.03-1.tar.xz',
-                                      'perl-Net-SMTP-SSL-1.03-2-src.tar.xz',
-                                      'perl-Net-SMTP-SSL-1.03-2.tar.xz',
-                                      'setup.hint',
-                                      'sha512.sum'],
- 'x86': ['sha512.sum'],
- 'x86/release': ['sha512.sum'],
- 'x86/release/arc': ['arc-4.32.7-10-src.tar.bz2', 'arc-4.32.7-10.tar.bz2', 'setup.hint', 'sha512.sum'],
- 'x86/release/base-cygwin': ['base-cygwin-3.6-1.tar.xz', 'base-cygwin-3.8-1.tar.xz', 'setup.hint', 'sha512.sum'],
- 'x86/release/cygwin': ['.this-should-be-ignored',
-                        'cygwin-2.2.0-1-src.tar.xz',
-                        'cygwin-2.2.0-1.tar.xz',
-                        'cygwin-2.2.1-1-src.tar.xz',
-                        'cygwin-2.2.1-1.tar.xz',
-                        'cygwin-2.3.0-0.3-src.tar.xz',
-                        'cygwin-2.3.0-0.3.tar.xz',
-                        'setup.hint',
-                        'sha512.sum'],
- 'x86/release/cygwin/cygwin-debuginfo': ['cygwin-debuginfo-2.2.0-1.tar.xz',
-                                         'cygwin-debuginfo-2.2.1-1.tar.xz',
-                                         'cygwin-debuginfo-2.3.0-0.3.tar.xz',
-                                         'setup.hint',
-                                         'sha512.sum'],
- 'x86/release/cygwin/cygwin-devel': ['cygwin-devel-2.2.0-1.tar.xz',
-                                     'cygwin-devel-2.2.1-1.tar.xz',
-                                     'cygwin-devel-2.3.0-0.3.tar.xz',
-                                     'setup.hint',
-                                     'sha512.sum'],
- 'x86/release/invalid': ['setup.hint', 'sha512.sum'],
- 'x86/release/keychain': ['keychain-2.6.8-1-src.tar.bz2',
-                          'keychain-2.6.8-1.tar.bz2',
-                          'keychain-2.7.1-1-src.tar.bz2',
-                          'keychain-2.7.1-1.tar.bz2',
-                          'setup.hint',
-                          'sha512.sum'],
- 'x86/release/libspiro': ['setup.hint', 'sha512.sum'],
- 'x86/release/libspiro/libspiro-devel': ['setup.hint', 'sha512.sum'],
- 'x86/release/libspiro/libspiro0': ['setup.hint', 'sha512.sum'],
- 'x86/release/libtextcat': ['libtextcat-2.2-2-src.tar.bz2', 'libtextcat-2.2-2.tar.bz2', 'setup.hint', 'sha512.sum'],
- 'x86/release/libtextcat/libtextcat-devel': ['libtextcat-devel-2.2-2.tar.bz2', 'setup.hint', 'sha512.sum'],
- 'x86/release/libtextcat/libtextcat0': ['libtextcat0-2.2-2.tar.bz2', 'setup.hint', 'sha512.sum'],
- 'x86/release/mDNSResponder': ['mDNSResponder-379.32.1-1-src.tar.bz2',
-                               'mDNSResponder-379.32.1-1.tar.bz2',
-                               'setup.hint',
-                               'sha512.sum'],
- 'x86/release/mDNSResponder/libdns_sd-devel': ['libdns_sd-devel-379.32.1-1.tar.bz2', 'setup.hint', 'sha512.sum'],
- 'x86/release/mDNSResponder/libdns_sd1': ['libdns_sd1-379.32.1-1.tar.bz2', 'setup.hint', 'sha512.sum'],
- 'x86/release/mingw64-i686-binutils': ['setup.hint', 'sha512.sum'],
- 'x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo': ['setup.hint', 'sha512.sum'],
- 'x86/release/naim': ['setup.hint'],
- 'x86/release/openssh': ['openssh-7.2p2-1-src.tar.xz', 'openssh-7.2p2-1.tar.xz', 'setup.hint', 'sha512.sum'],
- 'x86/release/proj': ['setup.hint', 'sha512.sum'],
- 'x86/release/proj/libproj-devel': ['setup.hint', 'sha512.sum'],
- 'x86/release/proj/libproj1': ['setup.hint', 'sha512.sum'],
- 'x86/release/rpm-doc': ['rpm-doc-4.1-2-src.tar.bz2',
-                         'rpm-doc-4.1-2.tar.bz2',
-                         'rpm-doc-999-1.tar.bz2',
-                         'setup.hint',
-                         'sha512.sum'],
- 'x86/release/splint': ['setup.hint', 'sha512.sum'],
- 'x86/release/testpackage': ['setup.hint', 'sha512.sum', 'testpackage-1.0-1-src.tar.bz2', 'testpackage-1.0-1.tar.bz2'],
- 'x86/release/testpackage/testpackage-subpackage': ['setup.hint', 'testpackage-subpackage-1.0-1.tar.bz2']}
diff --git a/testdata/process_arch/vault.expected b/testdata/process_arch/vault.expected
deleted file mode 100644
index a87938b..0000000
--- a/testdata/process_arch/vault.expected
+++ /dev/null
@@ -1 +0,0 @@
-{'.': [], 'x86': [], 'x86/release': [], 'x86/release/testpackage': ['testpackage-0.1-1.tar.bz2']}
diff --git a/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz b/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz
deleted file mode 100644
index 9e7f93d..0000000
Binary files a/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1-src.tar.xz and /dev/null differ
diff --git a/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz b/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz
deleted file mode 100644
index d986060..0000000
Binary files a/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/perl-Net-SMTP-SSL-1.03-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/setup.hint b/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/setup.hint
deleted file mode 100644
index f91a0e1..0000000
--- a/testdata/relarea/noarch/release/perl-Net-SMTP-SSL/setup.hint
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Perl
-requires:
-sdesc: "Perl distribution Net-SMTP-SSL"
-ldesc: "Implements the same API as Net::SMTP, but uses IO::Socket::SSL for
-its network operations in order to support encrypted connections."
diff --git a/testdata/relarea/x86/release/arc/arc-4.32.7-10-src.tar.bz2 b/testdata/relarea/x86/release/arc/arc-4.32.7-10-src.tar.bz2
deleted file mode 100644
index b56f3b9..0000000
Binary files a/testdata/relarea/x86/release/arc/arc-4.32.7-10-src.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/arc/arc-4.32.7-10.tar.bz2 b/testdata/relarea/x86/release/arc/arc-4.32.7-10.tar.bz2
deleted file mode 100644
index b56f3b9..0000000
Binary files a/testdata/relarea/x86/release/arc/arc-4.32.7-10.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/arc/setup.hint b/testdata/relarea/x86/release/arc/setup.hint
deleted file mode 100644
index 718cb55..0000000
--- a/testdata/relarea/x86/release/arc/setup.hint
+++ /dev/null
@@ -1,8 +0,0 @@
-sdesc: "The ARC archive utility"
-ldesc: "This program is based on the MSDOS ARC program, version 5.21, plus a
-few enhancements. ARC performs Huffman Squeezing on data. The Huffman
-Squeeze algorithm was removed from MSDOS ARC after version 5.12. It
-turns out to be more efficient than Lempel-Ziv style compression when
-compressing graphic images. Squeeze analysis is always done now, and
-the best of packing, squeezing, or crunching is used."
-category: Archive
diff --git a/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz b/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.6-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz b/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/base-cygwin/base-cygwin-3.8-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/base-cygwin/setup.hint b/testdata/relarea/x86/release/base-cygwin/setup.hint
deleted file mode 100644
index f6f64b2..0000000
--- a/testdata/relarea/x86/release/base-cygwin/setup.hint
+++ /dev/null
@@ -1,4 +0,0 @@
-sdesc: "Initial base installation helper script."
-ldesc: "Initial base installation helper script."
-category: Base
-requires: 
diff --git a/testdata/relarea/x86/release/cygwin/.this-should-be-ignored b/testdata/relarea/x86/release/cygwin/.this-should-be-ignored
deleted file mode 100644
index e69de29..0000000
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1-src.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-2.2.0-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1-src.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-2.2.1-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3-src.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-2.3.0-0.3.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.0-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.2.1-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/cygwin-debuginfo-2.3.0-0.3.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/setup.hint b/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/setup.hint
deleted file mode 100644
index 5ed452c..0000000
--- a/testdata/relarea/x86/release/cygwin/cygwin-debuginfo/setup.hint
+++ /dev/null
@@ -1,9 +0,0 @@
-category: Debug
-requires: cygwin-debuginfo
-external-source: cygwin
-sdesc: "Debug info for cygwin"
-ldesc: "This package contains files necessary for debugging the
-cygwin package with gdb."
-prev: 2.2.0-1
-curr: 2.2.1-1
-test: 2.3.0-0.3
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.0-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.2.1-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz b/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/cygwin/cygwin-devel/cygwin-devel-2.3.0-0.3.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/cygwin/cygwin-devel/setup.hint b/testdata/relarea/x86/release/cygwin/cygwin-devel/setup.hint
deleted file mode 100644
index 97170e3..0000000
--- a/testdata/relarea/x86/release/cygwin/cygwin-devel/setup.hint
+++ /dev/null
@@ -1,8 +0,0 @@
-category: Devel
-requires:
-sdesc: "Core development files"
-ldesc: "Core development files required to build Cygwin packages"
-external-source: cygwin
-prev: 2.2.0-1
-curr: 2.2.1-1
-test: 2.3.0-0.3
diff --git a/testdata/relarea/x86/release/cygwin/setup.hint b/testdata/relarea/x86/release/cygwin/setup.hint
deleted file mode 100644
index d0c4b26..0000000
--- a/testdata/relarea/x86/release/cygwin/setup.hint
+++ /dev/null
@@ -1,7 +0,0 @@
-sdesc: "The UNIX emulation engine"
-ldesc: "The UNIX emulation engine"
-category: Base
-requires: base-cygwin
-prev: 2.2.0-1
-curr: 2.2.1-1
-test: 2.3.0-0.3
diff --git a/testdata/relarea/x86/release/invalid/setup.hint b/testdata/relarea/x86/release/invalid/setup.hint
deleted file mode 100644
index 279c8c4..0000000
--- a/testdata/relarea/x86/release/invalid/setup.hint
+++ /dev/null
@@ -1,2 +0,0 @@
-unknown-key: invalid-value
-invalid-construct
diff --git a/testdata/relarea/x86/release/keychain/keychain-2.6.8-1-src.tar.bz2 b/testdata/relarea/x86/release/keychain/keychain-2.6.8-1-src.tar.bz2
deleted file mode 100644
index ec4c57b..0000000
Binary files a/testdata/relarea/x86/release/keychain/keychain-2.6.8-1-src.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/keychain/keychain-2.6.8-1.tar.bz2 b/testdata/relarea/x86/release/keychain/keychain-2.6.8-1.tar.bz2
deleted file mode 100644
index a8fd52f..0000000
Binary files a/testdata/relarea/x86/release/keychain/keychain-2.6.8-1.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/keychain/keychain-2.7.1-1-src.tar.bz2 b/testdata/relarea/x86/release/keychain/keychain-2.7.1-1-src.tar.bz2
deleted file mode 100644
index 08be499..0000000
Binary files a/testdata/relarea/x86/release/keychain/keychain-2.7.1-1-src.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/keychain/keychain-2.7.1-1.tar.bz2 b/testdata/relarea/x86/release/keychain/keychain-2.7.1-1.tar.bz2
deleted file mode 100644
index 4982bf6..0000000
Binary files a/testdata/relarea/x86/release/keychain/keychain-2.7.1-1.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/keychain/setup.hint b/testdata/relarea/x86/release/keychain/setup.hint
deleted file mode 100644
index 7870969..0000000
--- a/testdata/relarea/x86/release/keychain/setup.hint
+++ /dev/null
@@ -1,12 +0,0 @@
-sdesc: "Key manager for OpenSSH"
-ldesc: "Keychain is an OpenSSH key manager, typically run from
-~/.bash_profile. When keychain is run, it checks for a running
-ssh-agent, otherwise it starts one. It saves the ssh-agent environment
-variables to ~/.keychain/$HOSTNAME-sh, so that subsequent logins
-and non-interactive shells such as cron jobs can source the file and
-make passwordless ssh connections. In addition, when keychain runs, it
-verifies that the key files specified on the command-line are known to
-ssh-agent, otherwise it loads them, prompting you for a password if
-necessary"
-category: Utils
-requires: openssh
diff --git a/testdata/relarea/x86/release/libspiro/libspiro-devel/setup.hint b/testdata/relarea/x86/release/libspiro/libspiro-devel/setup.hint
deleted file mode 100644
index 37dcfd7..0000000
--- a/testdata/relarea/x86/release/libspiro/libspiro-devel/setup.hint
+++ /dev/null
@@ -1,11 +0,0 @@
-category: Graphics
-requires: libspiro0
-external-source: libspiro
-sdesc: "Library for converting clothoid splines to bezier curves (development)"
-ldesc: "Spiro is the creation of Raph Levien. It simplifies the drawing 
-of beautiful curves.
-
-Using bézier splines an artist can easily draw curves with the same 
-slope on either side of an on-curve point. Spiros, on the other hand, 
-are based on clothoid splines which make it easy to maintain constant 
-curvature as well as constant slope. Such curves will simply look nicer."
diff --git a/testdata/relarea/x86/release/libspiro/libspiro0/setup.hint b/testdata/relarea/x86/release/libspiro/libspiro0/setup.hint
deleted file mode 100644
index 4d9ef6a..0000000
--- a/testdata/relarea/x86/release/libspiro/libspiro0/setup.hint
+++ /dev/null
@@ -1,11 +0,0 @@
-category: Graphics
-requires: libgcc1
-external-source: libspiro
-sdesc: "Library for converting clothoid splines to bezier curves (runtime)"
-ldesc: "Spiro is the creation of Raph Levien. It simplifies the drawing 
-of beautiful curves.
-
-Using bézier splines an artist can easily draw curves with the same 
-slope on either side of an on-curve point. Spiros, on the other hand, 
-are based on clothoid splines which make it easy to maintain constant 
-curvature as well as constant slope. Such curves will simply look nicer."
diff --git a/testdata/relarea/x86/release/libspiro/setup.hint b/testdata/relarea/x86/release/libspiro/setup.hint
deleted file mode 100644
index 42f7126..0000000
--- a/testdata/relarea/x86/release/libspiro/setup.hint
+++ /dev/null
@@ -1,9 +0,0 @@
-category: Graphics
-sdesc: "Library for converting clothoid splines to bezier curves (sources)"
-ldesc: "Spiro is the creation of Raph Levien. It simplifies the drawing 
-of beautiful curves.
-
-Using bézier splines an artist can easily draw curves with the same 
-slope on either side of an on-curve point. Spiros, on the other hand, 
-are based on clothoid splines which make it easy to maintain constant 
-curvature as well as constant slope. Such curves will simply look nicer."
diff --git a/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2-src.tar.bz2 b/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2-src.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2-src.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2.tar.bz2 b/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/libtextcat/libtextcat-2.2-2.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/libtextcat/libtextcat-devel/libtextcat-devel-2.2-2.tar.bz2 b/testdata/relarea/x86/release/libtextcat/libtextcat-devel/libtextcat-devel-2.2-2.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/libtextcat/libtextcat-devel/libtextcat-devel-2.2-2.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/libtextcat/libtextcat-devel/setup.hint b/testdata/relarea/x86/release/libtextcat/libtextcat-devel/setup.hint
deleted file mode 100644
index f509126..0000000
--- a/testdata/relarea/x86/release/libtextcat/libtextcat-devel/setup.hint
+++ /dev/null
@@ -1,11 +0,0 @@
-sdesc: "Helper, header and library for libtextcat"
-ldesc: "Libtextcat is a library with functions that implement the
-classification technique described in Cavnar & Trenkle, "N-Gram-Based
-Text Categorization". It was primarily developed for language
-guessing, a task on which it is known to perform with near-perfect
-accuracy.
-BSD License.
-http://software.wise-guys.nl/libtextcat/";
-category: Devel Text
-requires: libtextcat0 libtextcat
-external-source: libtextcat
diff --git a/testdata/relarea/x86/release/libtextcat/libtextcat0/libtextcat0-2.2-2.tar.bz2 b/testdata/relarea/x86/release/libtextcat/libtextcat0/libtextcat0-2.2-2.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/libtextcat/libtextcat0/libtextcat0-2.2-2.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/libtextcat/libtextcat0/setup.hint b/testdata/relarea/x86/release/libtextcat/libtextcat0/setup.hint
deleted file mode 100644
index f3ae673..0000000
--- a/testdata/relarea/x86/release/libtextcat/libtextcat0/setup.hint
+++ /dev/null
@@ -1,11 +0,0 @@
-sdesc: "Text Classification Library dll"
-ldesc: "Libtextcat is a library with functions that implement the
-classification technique described in Cavnar & Trenkle, "N-Gram-Based
-Text Categorization". It was primarily developed for language
-guessing, a task on which it is known to perform with near-perfect
-accuracy.
-BSD License.
-http://software.wise-guys.nl/libtextcat/";
-category: Text
-requires: cygwin
-external-source: libtextcat
diff --git a/testdata/relarea/x86/release/libtextcat/setup.hint b/testdata/relarea/x86/release/libtextcat/setup.hint
deleted file mode 100644
index 5145c2d..0000000
--- a/testdata/relarea/x86/release/libtextcat/setup.hint
+++ /dev/null
@@ -1,10 +0,0 @@
-sdesc: "Text Classification Library (language guessing in C)"
-ldesc: "Libtextcat is a library with functions that implement the
-classification technique described in Cavnar & Trenkle, "N-Gram-Based
-Text Categorization". It was primarily developed for language
-guessing, a task on which it is known to perform with near-perfect
-accuracy. 
-BSD License.
-http://software.wise-guys.nl/libtextcat/";
-category: Text
-requires: libtextcat0
diff --git a/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2 b/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/libdns_sd-devel-379.32.1-1.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/setup.hint b/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/setup.hint
deleted file mode 100644
index c285be7..0000000
--- a/testdata/relarea/x86/release/mDNSResponder/libdns_sd-devel/setup.hint
+++ /dev/null
@@ -1,7 +0,0 @@
-category: Net
-requires: libdns_sd1 
-sdesc: "Bonjour Zeroconf implementation"
-ldesc: "Bonjour, also known as zero-configuration networking, enables
-automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols."
-external-source: mDNSResponder
diff --git a/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2 b/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/libdns_sd1-379.32.1-1.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/setup.hint b/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/setup.hint
deleted file mode 100644
index 74a7a3f..0000000
--- a/testdata/relarea/x86/release/mDNSResponder/libdns_sd1/setup.hint
+++ /dev/null
@@ -1,7 +0,0 @@
-category: Net
-requires:  
-sdesc: "Bonjour Zeroconf implementation"
-ldesc: "Bonjour, also known as zero-configuration networking, enables
-automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols."
-external-source: mDNSResponder
diff --git a/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 b/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1-src.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 b/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2
deleted file mode 100644
index a1145fb..0000000
Binary files a/testdata/relarea/x86/release/mDNSResponder/mDNSResponder-379.32.1-1.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/mDNSResponder/setup.hint b/testdata/relarea/x86/release/mDNSResponder/setup.hint
deleted file mode 100644
index e50938b..0000000
--- a/testdata/relarea/x86/release/mDNSResponder/setup.hint
+++ /dev/null
@@ -1,11 +0,0 @@
-category: Net
-requires: libdns_sd1 
-sdesc: "Bonjour Zeroconf implementation"
-ldesc: "Bonjour, also known as zero-configuration networking, enables
-automatic discovery of computers, devices, and services on IP networks using
-industry standard IP protocols."
-
-message: mDNSResponder "The Cygwin mDNSResponder package contains only clients.
-If you do not already have the 'Bonjour Service' installed (it comes with
-a number of popular Windows programs), then you can download it at
-http://support.apple.com/kb/DL999";
diff --git a/testdata/relarea/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/setup.hint b/testdata/relarea/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/setup.hint
deleted file mode 100644
index 55ba552..0000000
--- a/testdata/relarea/x86/release/mingw64-i686-binutils/mingw64-i686-binutils-debuginfo/setup.hint
+++ /dev/null
@@ -1,6 +0,0 @@
-category: Debug
-requires: cygwin-debuginfo
-external-source: mingw64-i686-binutils
-ldesc: "Debug info for mingw64-i686-binutils"
-sdesc: "This package contains files necessary for debugging the
-mingw64-i686-binutils package with gdb."
diff --git a/testdata/relarea/x86/release/mingw64-i686-binutils/setup.hint b/testdata/relarea/x86/release/mingw64-i686-binutils/setup.hint
deleted file mode 100644
index f911d0d..0000000
--- a/testdata/relarea/x86/release/mingw64-i686-binutils/setup.hint
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Devel
-requires: cygwin libintl8 zlib0 
-sdesc: "The GNU Binutils are a collection of binary tools. This package
- is capable of targeting win32."
-ldesc: "Binutils for MinGW-w64 Win32 toolchain"
diff --git a/testdata/relarea/x86/release/naim/setup.hint b/testdata/relarea/x86/release/naim/setup.hint
deleted file mode 100644
index 7de6e7b..0000000
--- a/testdata/relarea/x86/release/naim/setup.hint
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Net
-requires:
-sdesc: "Console AIM, ICQ, IRC, and Lily client"
-ldesc: " naim is a console client for AOL Instant Messenger (AIM),
-AOL I Seek You (ICQ), Internet Relay Chat (IRC), and The lily CMC."
diff --git a/testdata/relarea/x86/release/openssh/openssh-7.2p2-1-src.tar.xz b/testdata/relarea/x86/release/openssh/openssh-7.2p2-1-src.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/openssh/openssh-7.2p2-1-src.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/openssh/openssh-7.2p2-1.tar.xz b/testdata/relarea/x86/release/openssh/openssh-7.2p2-1.tar.xz
deleted file mode 100644
index 0e6f1e8..0000000
Binary files a/testdata/relarea/x86/release/openssh/openssh-7.2p2-1.tar.xz and /dev/null differ
diff --git a/testdata/relarea/x86/release/openssh/setup.hint b/testdata/relarea/x86/release/openssh/setup.hint
deleted file mode 100644
index 83aa11a..0000000
--- a/testdata/relarea/x86/release/openssh/setup.hint
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Net
-sdesc: "The OpenSSH server and client programs"
-ldesc: "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."
diff --git a/testdata/relarea/x86/release/proj/libproj-devel/setup.hint b/testdata/relarea/x86/release/proj/libproj-devel/setup.hint
deleted file mode 100644
index 76d1555..0000000
--- a/testdata/relarea/x86/release/proj/libproj-devel/setup.hint
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Graphics Libs
-requires: libproj1 
-sdesc: ""The PROJ Cartographic Projections Software (devel)"
-ldesc: "Cartographic projection library and utilities"
-external-source: proj
diff --git a/testdata/relarea/x86/release/proj/libproj1/setup.hint b/testdata/relarea/x86/release/proj/libproj1/setup.hint
deleted file mode 100644
index 22a79bd..0000000
--- a/testdata/relarea/x86/release/proj/libproj1/setup.hint
+++ /dev/null
@@ -1,5 +0,0 @@
-category: Graphics Libs
-requires:  
-sdesc: ""The PROJ Cartographic Projections Software (runtime)"
-ldesc: "Cartographic projection library and utilities"
-external-source: proj
diff --git a/testdata/relarea/x86/release/proj/setup.hint b/testdata/relarea/x86/release/proj/setup.hint
deleted file mode 100644
index c5da485..0000000
--- a/testdata/relarea/x86/release/proj/setup.hint
+++ /dev/null
@@ -1,4 +0,0 @@
-category: Graphics Libs
-requires: libproj1 
-sdesc: ""The PROJ Cartographic Projections Software (utilities)"
-ldesc: "Cartographic projection library and utilities"
diff --git a/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2 b/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2
deleted file mode 100644
index cbf838c..0000000
Binary files a/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2-src.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2 b/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2
deleted file mode 100644
index c7436b3..0000000
Binary files a/testdata/relarea/x86/release/rpm-doc/rpm-doc-4.1-2.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/rpm-doc/rpm-doc-999-1.tar.bz2 b/testdata/relarea/x86/release/rpm-doc/rpm-doc-999-1.tar.bz2
deleted file mode 100644
index cbf838c..0000000
Binary files a/testdata/relarea/x86/release/rpm-doc/rpm-doc-999-1.tar.bz2 and /dev/null differ
diff --git a/testdata/relarea/x86/release/rpm-doc/setup.hint b/testdata/relarea/x86/release/rpm-doc/setup.hint
deleted file mode 100644
index f3bbf78..0000000
--- a/testdata/relarea/x86/release/rpm-doc/setup.hint
+++ /dev/null
@@ -1,2 +0,0 @@
-sdesc: "Obsolete package for RPM package management system manual pages"
-category: _obsolete
diff --git a/testdata/relarea/x86/release/splint/setup.hint b/testdata/relarea/x86/release/splint/setup.hint
deleted file mode 100644
index 52b56b9..0000000
--- a/testdata/relarea/x86/release/splint/setup.hint
+++ /dev/null
@@ -1,14 +0,0 @@
-sdesc: "Check C programs for security vulnerabilities and programming
-mistakes."
-ldesc: "Program does many of the traditional lint checks including
-unused declarations, type inconsistencies, use before definition,
-unreachable code, ignored return values, execution paths with no
-return, likely infinite loops, and fall through cases. More powerful
-checks are made possible by additional information given in source
-code annotations. Annotations are stylized comments that document
-assumptions about functions, variables, parameters and types. In
-addition to the checks specifically enabled by annotations, many of
-the traditional lint checks are improved by exploiting this additional
-setinformation."
-category: Devel
-requires: cygwin
diff --git a/testdata/relarea/x86/release/testpackage/setup.hint b/testdata/relarea/x86/release/testpackage/setup.hint
deleted file mode 100644
index 10ee390..0000000
--- a/testdata/relarea/x86/release/testpackage/setup.hint
+++ /dev/null
@@ -1,3 +0,0 @@
-sdesc: "A test package"
-ldesc: "A test package"
-category: Devel
diff --git a/testdata/relarea/x86/release/testpackage/testpackage-0.1-1.tar.bz2 b/testdata/relarea/x86/release/testpackage/testpackage-0.1-1.tar.bz2
deleted file mode 100644
index e69de29..0000000
diff --git a/testdata/uploads/move.expected b/testdata/uploads/move.expected
deleted file mode 100644
index 47cb0af..0000000
--- a/testdata/uploads/move.expected
+++ /dev/null
@@ -1,3 +0,0 @@
-{'x86/release/testpackage': ['setup.hint', 'testpackage-1.0-1-src.tar.bz2', 'testpackage-1.0-1.tar.bz2'],
- 'x86/release/testpackage/testpackage-subpackage': ['setup.hint', 'testpackage-subpackage-1.0-1.tar.bz2'],
- 'x86/release/testpackage2/testpackage2-subpackage': ['setup.hint', 'testpackage2-subpackage-1.0-1.tar.bz2']}
diff --git a/testdata/uploads/pkglist.expected b/testdata/uploads/pkglist.expected
deleted file mode 100644
index bbe52b0..0000000
--- a/testdata/uploads/pkglist.expected
+++ /dev/null
@@ -1,14 +0,0 @@
-{'testpackage': Package('x86/release/testpackage', {'testpackage-1.0-1-src.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False),
- 'testpackage-1.0-1.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False)}, {'sdesc': '"A test package"',
- 'ldesc': '"A test package\n'
-          "It's description might contains some unicode gibberish\n"
-          'Like itâ??s youâ??re Markup Languageâ?¢ Nokogiriâ??s toolâ??that Bézier."',
- 'category': 'Devel',
- 'requires': 'cygwin'}),
- 'testpackage-subpackage': Package('x86/release/testpackage/testpackage-subpackage', {'testpackage-subpackage-1.0-1.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False)}, {'sdesc': '"A test subpackage"',
- 'ldesc': '"A test subpackage"',
- 'category': 'Devel',
- 'external-source': 'testpackage'}),
- 'testpackage2-subpackage': Package('x86/release/testpackage2/testpackage2-subpackage', {'testpackage2-subpackage-1.0-1.tar.bz2': Tar('aff488008bee3486e25b539fe6ccd1397bd3c5c0ba2ee2cf34af279554baa195af7493ee51d6f8510735c9a2ea54436d776a71e768165716762aec286abbbf83', 195, False)}, {'sdesc': '"A test subpackage 2"',
- 'ldesc': '"A test subpackage 2"',
- 'category': 'Devel'})}
diff --git a/tests.py b/tests.py
deleted file mode 100755
index 0881ab8..0000000
--- a/tests.py
+++ /dev/null
@@ -1,288 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# tests
-#
-
-import filecmp
-import logging
-import os
-import pprint
-import re
-import shutil
-import tempfile
-import types
-import unittest
-
-from version import SetupVersion
-import calm
-import hint
-import maintainers
-import package
-import pkg2html
-import uploads
-
-
-#
-# helper functions
-#
-# write results to the file 'results'
-# read expected from the file 'expected'
-# compare them
-#
-
-def compare_with_expected_file(test, dirpath, results, basename=None):
-    results_str = pprint.pformat(results, width=120)
-
-    if basename:
-        results_fn = basename + '.results'
-        expected_fn = basename + '.expected'
-    else:
-        results_fn = 'results'
-        expected_fn = 'expected'
-
-    # save results in a file
-    with open(os.path.join(dirpath, results_fn), 'w') as f:
-        print(results_str, file=f)
-
-    # read expected from a file
-    with open(os.path.join(dirpath, expected_fn)) as f:
-        expected = f.read().rstrip()
-
-    test.assertMultiLineEqual(expected, results_str)
-
-
-#
-# capture a directory tree as a dict 'tree', where each key is a directory path
-# and the value is a sorted list of filenames
-#
-
-def capture_dirtree(basedir):
-    tree = {}
-    for dirpath, dirnames, filenames in os.walk(basedir):
-        tree[os.path.relpath(dirpath, basedir)] = sorted(filenames)
-
-    return tree
-
-
-#
-#
-#
-
-class TestMain(unittest.TestCase):
-    def test_hint_parser(self):
-        self.maxDiff = None
-
-        basedir = 'testdata/relarea'
-        for (dirpath, subdirs, files) in os.walk(basedir):
-            relpath = os.path.relpath(dirpath, basedir)
-            if 'setup.hint' in files:
-                with self.subTest(package=os.path.basename(dirpath)):
-                    logging.info('Reading %s' % os.path.join(dirpath, 'setup.hint'))
-                    results = hint.setup_hint_parse(os.path.join(dirpath, 'setup.hint'))
-                    compare_with_expected_file(self, os.path.join('testdata/hints', relpath), results)
-
-#
-# something like "find -name results -exec sh -c 'cd `dirname {}` ; cp results
-# expected' \;" can be used to update the expected output (after you have
-# checking it to make sure it is really correct, of course :) )
-#
-
-    def test_html_writer(self):
-        self.maxDiff = None
-
-        htdocs = 'testdata/htdocs'
-        args = types.SimpleNamespace()
-        setattr(args, 'arch', 'x86')
-        setattr(args, 'htdocs', htdocs)
-        setattr(args, 'rel_area', 'testdata/relarea')
-        setattr(args, 'dryrun', False)
-        setattr(args, 'force', True)
-        setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
-
-        packages = package.read_packages(args.rel_area, args.arch)
-        package.validate_packages(args, packages)
-        pkg2html.update_package_listings(args, packages, args.arch)
-
-        # compare the output files with expected
-        for (dirpath, subdirs, files) in os.walk(htdocs):
-            relpath = os.path.relpath(dirpath, htdocs)
-            for f in files:
-                results = os.path.join(htdocs, relpath, f)
-                expected = os.path.join('testdata/htdocs.expected', relpath, f)
-                if not filecmp.cmp(results, expected, shallow=False):
-                    logging.info("%s different", os.path.join(relpath, f))
-                    with open(results) as r, open(expected) as e:
-                        self.assertMultiLineEqual(e.read(), r.read())
-                else:
-                    logging.info("%s identical", os.path.join(relpath, f))
-
-    def test_version_sort(self):
-        test_data = [
-            ["1.0.0", "2.0.0", -1],
-            [".0.0", "2.0.0", -1],
-            ["alpha", "beta", -1],
-            ["1.0", "1.0.0", -1],
-            ["2.456", "2.1000", -1],
-            ["2.1000", "3.111", -1],
-            ["2.001", "2.1", 0],
-            ["2.34", "2.34", 0],
-            ["6.1.2-4", "6.3.8-1", -1],
-            ["1.7.3.0-2", "2.0.0-b8-1", -1],
-            ["1.3.30c-2", "1.3.30c-10", -1],
-            ["2.24.51-1", "2.25-1", -1],
-            ["2.1.5+20120813+gitdcbe778-1", "2.1.5-3", 1],
-            ["3.4.1-1", "3.4b1-1", -1],
-            ["041206-1", "200090325-1", -1],
-            ["0.6.2+git20130413-2", "0.6.2-1", 1],
-            ["2.6.0+bzr6602-1", "2.6.0-2", 1],
-            ["2.6.0-2", "2.6b2-1", -1],
-            ["2.6.0+bzr6602-1", "2.6b2-1", -1],
-            ["0.6.7+20150214+git3a710f9-1", "0.6.7-1", 1],
-        ]
-
-        for d in test_data:
-            a = SetupVersion(d[0])
-            b = SetupVersion(d[1])
-            e = d[2]
-            # logging.info("%s %s %d" % (a, b, e))
-            self.assertEqual(SetupVersion.__cmp__(a, b), e, msg='%s %s %d' % (a, b, e))
-            self.assertEqual(SetupVersion.__cmp__(b, a), -e, msg='%s %s %d' % (a, b, -e))
-
-    def test_maint_pkglist(self):
-        self.maxDiff = None
-
-        mlist = {}
-        mlist = maintainers.Maintainer.add_directories(mlist, 'testdata/homes')
-        mlist = maintainers.Maintainer.add_packages(mlist, 'testdata/pkglist/cygwin-pkg-maint', None)
-
-        compare_with_expected_file(self, 'testdata/pkglist', mlist)
-
-    def test_scan_uploads(self):
-        self.maxDiff = None
-
-        args = types.SimpleNamespace()
-        setattr(args, 'arch', 'x86')
-        setattr(args, 'rel_area', 'testdata/relarea')
-        setattr(args, 'dryrun', False)
-
-        pkglist = ['after-ready', 'not-ready', 'testpackage', 'testpackage2']
-
-        mlist = {}
-        mlist = maintainers.Maintainer.add_directories(mlist, 'testdata/homes')
-        m = mlist['Blooey McFooey']
-        m.pkgs.extend(pkglist + ['not-on-package-list'])
-
-        ready_fns = [(os.path.join(m.homedir(), 'x86', 'release', 'testpackage', '!ready'), ''),
-                     (os.path.join(m.homedir(), 'x86', 'release', 'testpackage2', 'testpackage2-subpackage', '!ready'), ''),
-                     (os.path.join(m.homedir(), 'x86', 'release', 'after-ready', '!ready'), '-t 198709011700')]
-        for (f, t) in ready_fns:
-            os.system('touch %s "%s"' % (t, f))
-
-        scan_result = uploads.scan(m, pkglist + ['not-on-maintainer-list'], args.arch, args)
-
-        self.assertEqual(scan_result.error, False)
-        compare_with_expected_file(self, 'testdata/uploads', scan_result.to_relarea, 'move')
-        self.assertCountEqual(scan_result.to_vault, {'x86/release/testpackage': ['x86/release/testpackage/testpackage-0.1-1.tar.bz2']})
-        self.assertCountEqual(scan_result.remove_always, [f for (f, t) in ready_fns])
-        self.assertEqual(scan_result.remove_success, ['testdata/homes/Blooey McFooey/x86/release/testpackage/-testpackage-0.1-1.tar.bz2'])
-        compare_with_expected_file(self, 'testdata/uploads', scan_result.packages, 'pkglist')
-
-    def test_package_set(self):
-        self.maxDiff = None
-
-        args = types.SimpleNamespace()
-        setattr(args, 'arch', 'x86')
-        setattr(args, 'dryrun', False)
-        setattr(args, 'force', True)
-        setattr(args, 'inifile', 'testdata/inifile/setup.ini')
-        setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
-        setattr(args, 'rel_area', 'testdata/relarea')
-        setattr(args, 'release', 'testing')
-        setattr(args, 'setup_version', '4.321')
-
-        packages = package.read_packages(args.rel_area, args.arch)
-        package.delete(packages, 'x86/release/nonexistent', 'nosuchfile-1.0.0.tar.xz')
-        self.assertEqual(package.validate_packages(args, packages), True)
-        package.write_setup_ini(args, packages, args.arch)
-        with open(args.inifile) as inifile:
-            results = inifile.read()
-            # fix the timestamp to match expected
-            results = re.sub('setup-timestamp: .*', 'setup-timestamp: 1458221800', results, 1)
-            compare_with_expected_file(self, 'testdata/inifile', (results,), 'setup.ini')
-
-        # XXX: delete a needed package, and check validate fails
-
-    def test_process(self):
-        self.maxDiff = None
-
-        args = types.SimpleNamespace()
-
-        for d in ['rel_area', 'homedir', 'htdocs', 'vault']:
-            setattr(args, d, tempfile.mktemp())
-            logging.info('%s = %s', d, getattr(args, d))
-
-        setattr(args, 'dryrun', False)
-        setattr(args, 'email', None)
-        setattr(args, 'force', False)
-        setattr(args, 'inifile', os.path.join(getattr(args, 'rel_area'), 'setup.ini'))
-        setattr(args, 'pkglist', 'testdata/pkglist/cygwin-pkg-maint')
-        setattr(args, 'release', 'trial')
-        setattr(args, 'setup_version', '3.1415')
-
-        shutil.copytree('testdata/relarea', getattr(args, 'rel_area'))
-        shutil.copytree('testdata/homes', getattr(args, 'homedir'))
-
-        # set appropriate !readys
-        m_homedir = os.path.join(getattr(args, 'homedir'), 'Blooey McFooey')
-        ready_fns = [(os.path.join(m_homedir, 'x86', 'release', 'testpackage', '!ready'), ''),
-                     (os.path.join(m_homedir, 'x86', 'release', 'testpackage2', 'testpackage2-subpackage', '!ready'), ''),
-                     (os.path.join(m_homedir, 'x86', 'release', 'after-ready', '!ready'), '-t 198709011700'),
-                     (os.path.join(m_homedir, 'noarch', 'release', 'perl-Net-SMTP-SSL', '!ready'), '')]
-        for (f, t) in ready_fns:
-            os.system('touch %s "%s"' % (t, f))
-
-        packages = calm.process(args)
-        self.assertTrue(packages)
-
-        pkg2html.update_package_listings(args, packages['x86'], 'x86')
-        package.write_setup_ini(args, packages['x86'], 'x86')
-
-        for d in ['rel_area', 'homedir', 'htdocs', 'vault']:
-            with self.subTest(directory=d):
-                dirlist = capture_dirtree(getattr(args, d))
-                compare_with_expected_file(self, 'testdata/process_arch', dirlist, d)
-                shutil.rmtree(getattr(args, d))
-
-if __name__ == '__main__':
-    # ensure sha512.sum files exist
-    os.system("find testdata/relarea/x86 testdata/relarea/noarch -type d -exec sh -c 'cd {} ; sha512sum * >sha512.sum 2>/dev/null' \;")
-    # should remove a sha512.sum file so that we test functioning when it's absent
-    os.unlink('testdata/relarea/x86/release/naim/sha512.sum')
-    # remove !ready files
-    os.system("find testdata/homes -name !ready -exec rm {} \;")
-
-    logging.getLogger().setLevel(logging.INFO)
-    logging.basicConfig(format='%(message)s')
-    unittest.main()
diff --git a/uploads.py b/uploads.py
deleted file mode 100644
index afb183b..0000000
--- a/uploads.py
+++ /dev/null
@@ -1,278 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-#
-# upload directory processing
-#
-
-from collections import defaultdict, namedtuple
-import filecmp
-import os
-import logging
-import re
-import shutil
-import time
-
-import package
-
-# reminders will be issued daily
-REMINDER_INTERVAL = 60*60*24
-
-# a named tuple type to hold the result of scan
-ScanResult = namedtuple('ScanResult', 'error,packages,to_relarea,to_vault,remove_always,remove_success')
-
-
-#
-#
-#
-
-def scan(m, all_packages, arch, args):
-    basedir = os.path.join(m.homedir(), arch)
-    releasedir = os.path.join(args.rel_area, arch)
-
-    packages = defaultdict(package.Package)
-    move = defaultdict(list)
-    vault = defaultdict(list)
-    remove = []
-    remove_success = []
-    error = False
-    mtimes = [('', 0)]
-
-    logging.debug('reading packages from %s' % (basedir))
-
-    # note mtime of any !ready file at top-level
-    for ready in [os.path.join(basedir, '!ready'), os.path.join(basedir, 'release', '!ready')]:
-        if os.path.exists(ready):
-            mtime = os.path.getmtime(ready)
-            mtimes.append(('', mtime))
-            logging.debug('processing files with mtime older than %d' % (mtime))
-            remove.append(ready)
-
-    # the mtime of this file indicates when 'ignoring as there is no !ready'
-    # warnings were last emitted
-    reminder_file = os.path.join(m.homedir(), '!reminder-timestamp')
-    if os.path.exists(reminder_file):
-        reminder_time = os.path.getmtime(reminder_file)
-    else:
-        reminder_time = 0
-    reminders = False
-    logging.debug("reminder-timestamp %d, interval %d, next reminder %d, current time %d" % (reminder_time, REMINDER_INTERVAL, reminder_time + REMINDER_INTERVAL, time.time()))
-
-    # scan package directories
-    for (dirpath, subdirs, files) in os.walk(os.path.join(basedir, 'release')):
-        relpath = os.path.relpath(dirpath, m.homedir())
-
-        # skip uninteresting directories
-        if (not files) or (relpath == os.path.join(arch, 'release')):
-            continue
-
-        logging.debug('reading uploads from %s' % dirpath)
-
-        # note the mtime of the !ready file
-        if '!ready' in files:
-            ready = os.path.join(dirpath, '!ready')
-            mtime = os.path.getmtime(ready)
-            mtimes.append((relpath + '/', mtime))
-            remove.append(ready)
-            files.remove('!ready')
-            logging.debug("processing files below '%s' with mtime older than %d" % (relpath, mtime))
-        else:
-            # otherwise work back up a list of (path,mtimes) (which should be in
-            # shortest-to-longest order, since os.walk() walks the tree
-            # top-down), and use the mtime of the first (longest) matching path.
-            while True:
-                (path, mtime) = mtimes[-1]
-                if relpath.startswith(path):
-                    logging.debug("using mtime %d from subpath '%s' of '%s'" % (mtime, path, relpath))
-                    break
-                else:
-                    mtimes.pop()
-
-        # package doesn't appear in package list at all
-        if not package.is_in_package_list(relpath, all_packages):
-            logging.error("package '%s' is not in the package list" % dirpath)
-            continue
-
-        # only process packages for which we are listed as a maintainer
-        if not package.is_in_package_list(relpath, m.pkgs):
-            logging.warning("package '%s' is not in the package list for maintainer %s" % (dirpath, m.name))
-            continue
-
-        # filter out files we don't need to consider
-        for f in sorted(files):
-            fn = os.path.join(dirpath, f)
-            rel_fn = os.path.join(relpath, f)
-            logging.debug("processing %s" % rel_fn)
-
-            # ignore !packages (which we no longer use)
-            # ignore !mail and !email (which we have already read)
-            if f in ['!packages', '!mail', '!email']:
-                files.remove(f)
-                continue
-
-            # ignore in-progress sftp uploads. Net::SFTP::SftpServer uses
-            # temporary upload filenames ending with '.SftpXFR.<pid>'
-            if re.search(r'\.SftpXFR\.\d*$', f):
-                logging.debug("ignoring temporary upload file %s" % fn)
-                files.remove(f)
-                continue
-
-            # only process files newer than !ready
-            if os.path.getmtime(fn) > mtime:
-                if mtime == 0:
-                    reminders = True
-                    lvl = logging.DEBUG
-
-                    # if more than REMINDER_INTERVAL has elapsed since we warned
-                    # about files being ignored, warn again
-                    if time.time() > (reminder_time + REMINDER_INTERVAL):
-                        lvl = logging.WARNING
-                        if not args.dryrun:
-                            touch(reminder_file)
-
-                    logging.log(lvl, "ignoring %s as there is no !ready" % fn)
-                else:
-                    logging.warning("ignoring %s as it is newer than !ready" % fn)
-                files.remove(f)
-                continue
-
-            if f.startswith('-'):
-                if ('*' in f) or ('?' in f):
-                    logging.error("remove file %s name contains metacharacters, which are no longer supported" % fn)
-                    error = True
-                elif os.path.getsize(fn) != 0:
-                    logging.error("remove file %s is not empty" % fn)
-                    error = True
-                else:
-                    vault[relpath].append(f[1:])
-                    remove_success.append(fn)
-                files.remove(f)
-            else:
-                dest = os.path.join(releasedir, relpath, f)
-                if os.path.isfile(dest):
-                    if f != 'setup.hint':
-                        if filecmp.cmp(dest, fn, shallow=False):
-                            logging.info("ignoring, identical %s is already in release area" % fn)
-                        else:
-                            logging.error("ignoring, different %s is already in release area (perhaps you should rebuild with a different version-release identifier?)" % fn)
-                            error = True
-                        files.remove(f)
-                    else:
-                        if filecmp.cmp(dest, fn, shallow=False):
-                            logging.debug("identical %s is already in release area" % fn)
-                        else:
-                            logging.debug("different %s is already in release area" % fn)
-                        # we always consider setup.hint, as we can't have a valid package without it
-                        move[relpath].append(f)
-                else:
-                    move[relpath].append(f)
-
-        # read and validate package
-        if files:
-            # strict means we consider warnings as fatal for upload
-            if package.read_package(packages, m.homedir(), dirpath, files, strict=True):
-                error = True
-
-    # if we didn't need to check the reminder timestamp, it can be reset
-    if not reminders and not args.dryrun:
-        try:
-            os.remove(reminder_file)
-        except FileNotFoundError:
-            pass
-
-    return ScanResult(error, packages, move, vault, remove, remove_success)
-
-
-#
-#
-#
-
-def touch(fn, times=None):
-    with open(fn, 'a'):
-        os.utime(fn, times)
-
-
-#
-#
-#
-
-def remove(args, remove):
-    for f in remove:
-        logging.debug("rm %s", f)
-        if not args.dryrun:
-            os.unlink(f)
-
-
-#
-#
-#
-
-def move(args, movelist, fromdir, todir):
-    for p in sorted(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
-        logging.info("move from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
-        for f in sorted(movelist[p]):
-            if os.path.exists(os.path.join(fromdir, p, f)):
-                logging.info("%s" % (f))
-                if not args.dryrun:
-                    os.rename(os.path.join(fromdir, p, f), os.path.join(todir, p, f))
-            else:
-                logging.error("%s can't be moved as it doesn't exist" % (f))
-
-
-def move_to_relarea(m, args, movelist):
-    move(args, movelist, m.homedir(), args.rel_area)
-    # XXX: Note that there seems to be a separate process, not run from
-    # cygwin-admin's crontab, which changes the ownership of files in the
-    # release area to cyguser:cygwin
-
-
-def move_to_vault(args, movelist):
-    move(args, movelist, args.rel_area, args.vault)
-
-
-#
-#
-#
-
-def copy(args, movelist, fromdir, todir):
-    for p in sorted(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
-        logging.debug("copy from '%s' to '%s':" % (os.path.join(fromdir, p), os.path.join(todir, p)))
-        for f in sorted(movelist[p]):
-            if os.path.exists(os.path.join(fromdir, p, f)):
-                logging.debug("%s" % (f))
-                if not args.dryrun:
-                    shutil.copy2(os.path.join(fromdir, p, f), os.path.join(todir, p, f))
-            else:
-                logging.error("%s can't be copied as it doesn't exist" % (f))
diff --git a/version.py b/version.py
deleted file mode 100644
index 027372f..0000000
--- a/version.py
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2015 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.
-#
-
-import itertools
-import logging
-import re
-
-
-#
-
-def cmp(a, b):
-    return (a > b) - (a < b)
-
-
-#
-# SetupVersion
-#
-# a helper class which implements the same version ordering as setup
-#
-
-class SetupVersion:
-    def __init__(self, version_string):
-        self._version_string = version_string
-
-        # split version into [V, R], on the last '-', if any
-        split = list(itertools.chain(version_string.rsplit('-', 1), ['']))[:2]
-
-        # then split each part into numeric and non-numeric sequences.
-        # numeric sequences have leading zeroes discarded
-        for j, i in enumerate(['V', 'R']):
-            setattr(self, '_' + i, [re.sub(r'^0+(\d)', r'\1', m.group(1), 1) for m in re.finditer(r'(\d+|\D+)', split[j])])
-
-    def __str__(self):
-        return '%s (V=%s R=%s)' % (self._version_string, str(self._V), str(self._R))
-
-    # XXX: Implementing the __lt__ comparison operator in terms of the obsolete
-    # __cmp__ operator is rather over-complicated.  If we really only need
-    # __lt__ (which is sufficent to make this class sortable), then we should
-    # just implement it directly.  For the moment, keep __cmp__ around in case
-    # we need to do other comparisons. (in which case, see also functools
-    # @total_ordering class decorator)
-    def __lt__(self, other):
-        return self.__cmp__(other) == -1
-
-    def __cmp__(self, other):
-        # warn about ill-specified comparisons
-        # SetupVersion._warn_ambiguous_compare(self, other)
-
-        # compare V
-        c = SetupVersion._compare(self._V, other._V)
-        if c != 0:
-            return c
-
-        # if V are the same, compare R
-        return SetupVersion._compare(self._R, other._R)
-
-    # comparison helper function
-    @staticmethod
-    def _compare(a, b):
-
-        # compare each sequence in order
-        for i in range(0, min(len(a), len(b))):
-            # sort a non-digit sequence before a digit sequence
-            if a[i].isdigit() != b[i].isdigit():
-                return 1 if a[i].isdigit() else -1
-
-            # compare as numbers
-            if a[i].isdigit():
-                # because leading zeros have already been removed, if one number
-                # has more digits, it is greater
-                c = cmp(len(a[i]), len(b[i]))
-                if c != 0:
-                    return c
-                # fallthrough
-
-            # compare lexicographically
-            c = cmp(a[i], b[i])
-            if c != 0:
-                return c
-
-        # if equal length, all components have matched, so equal
-        # otherwise, the version with a suffix remaining is greater
-        return cmp(len(a), len(b))
-
-    # warn if the comparison of these versions is historically under-specified
-    @staticmethod
-    def _warn_ambiguous_compare(a, b):
-        def classify(s):
-            if len(s) == 0:
-                return 'e'
-            elif s[0].isdigit():
-                return 'n'
-            elif s[0] in '.-_':
-                return s[0]
-            elif s[0].isalpha():
-                return 'a'
-            return 'o'
-
-        def is_ambiguous(a, b):
-            ambiguous = False
-
-            for i in range(0, min(len(a), len(b))):
-                if classify(a[i]) != classify(b[i]):
-                    ambiguous = True
-                    break
-
-            return ambiguous
-
-        if is_ambiguous(a._V, b._V) or is_ambiguous(a._R, b._R):
-            logging.warning("ordering of versions '%s' and '%s' may not be what you expect" % (a._version_string, b._version_string))
diff --git a/words.txt b/words.txt
deleted file mode 100644
index 9809cce..0000000
--- a/words.txt
+++ /dev/null
@@ -1,437 +0,0 @@
-AbiWord
-Advection
-Amdahl
-AqBanking
-Arial
-AsciiDoc
-Assuan
-BeOS
-Bezier
-BiDi
-BibLaTeX
-BitTorrent
-Boehm
-Bokmål
-Bonjour
-Bonjour's
-Bopomofo
-Bourne
-BuildBot
-CMake
-Castilian
-ChangeLog
-Clark's
-ClearCase
-CodeView
-Codec
-CoffeeScript
-Compositing
-ConTeXt
-Corel
-CorelTrace
-CppUnit
-Cryptographic
-DejaGnu
-DejaVu
-Delaunay
-DirectMedia
-DjVu
-DocBook
-DocTeX
-FastCGI
-Filename
-Filenames
-FlexDLL
-FooBillard
-FourCC
-FreeBSD
-FreeFont
-FreeHand
-FreeRDP
-FreeTDS
-FreeType
-Fullscreen
-GNUstep
-Galician
-GeoLite
-Gerrit
-GnuCash
-GnuPG
-GnuTLS
-GraphViz
-Haible
-HarfBuzz
-HexChat
-Hiragana
-Icecast
-Indic
-Infinote
-Inria
-Interlingua
-Intrinsics
-Kana
-Kanji
-Karlsruhe
-Kerberos
-Keyring
-Keyrings
-Kilgard
-Kivio
-Korn
-Kriging
-LaTeX
-Lempel
-Lexically
-LibOFX
-LibreSSL
-LilyPond
-Linkable
-Lossless
-Lucent
-Macromedia
-Maildir
-Makefile
-Makefiles
-MathML
-Matroska
-MikMod
-MinGW
-MirBSD
-MobileMP
-Mollweide
-Multihead
-Multilingualization
-MusicBrainz
-MySQL
-NeXT
-NetBSD
-NetCDF
-NetWare
-Nominatim
-NumPy
-OAuth
-ORBit
-Oberhumer
-ObjC
-Oniguruma
-OpenAL
-OpenAerialMap
-OpenBLAS
-OpenBSD
-OpenCDK
-OpenDocument
-OpenEXR
-OpenJPEG
-OpenJade
-OpenMP
-OpenOffice
-OpenPGP
-OpenSSH
-OpenSSL
-OpenStreetMap
-OpenType
-OpenXPS
-OutGuess
-PageMaker
-PortAudio
-PortMidi
-PostScript
-PostgreSQL
-Preprocessor
-Prolog
-Psion
-PuTTY
-PuTTY's
-PulseAudio
-PulseAudio's
-Punycode
-PyGTK
-Pythonic
-QtWebKit
-QuaZIP
-README
-Rakefiles
-RandR
-Rasterizer
-Rijndael
-Rocquencourt
-Signalling
-SoX
-Solaris
-SoundFont
-SourceForge
-SpiderMonkey
-Steganographic
-Stoll
-Stylesheet
-Stylesheets
-SuiteSparse
-Tatham
-TiMidity
-TigerVNC
-TightVNC
-TinyXML
-Trie
-TrueAudio
-TrueType
-TurboVNC
-Twofish
-TypeCode
-UPower
-Univariate
-Uyghur
-Valencian
-Visio
-Vixie's
-Voronoi
-WebDAV
-WebM
-WebP
-WebServer
-WeeChat
-Wiktionary
-WindowsWM
-WordPerfect
-Xiph
-Zaurus
-Ziv
-aRts
-accessors
-aclocal
-addressbook
-affine
-algarisms
-antialiased
-antialiasing
-asciidoc
-autoloadable
-autoloading
-awk
-azimuthal
-backend
-backends
-backport
-backported
-barcode
-barcodes
-bashism
-bashisms
-behaviour # uk spelling
-benchmarking
-bezier
-biWord
-bioinformatics
-bitrate
-bitrates
-bitstreams
-blowfish
-bodiless
-boolean
-breakpoint
-builtin
-builtins
-bytecode
-cardinality
-centric
-checksum
-checksums
-clothoid
-codec
-colormap
-colour # uk spelling
-coloured # uk spelling
-colours # uk spelling
-combinatorial
-componentized
-compositing
-coroutines
-cryptographic
-customizable
-daemonization
-dataset
-datasets
-datatypes
-decompiler
-decompositions
-decompressor
-decrypting
-discoverability
-discoverable
-distributable
-dlopen
-dpi
-eSpeak
-embeddable
-enumerant
-executable
-executables
-extensibility
-failover
-featureful
-filename
-filenames
-filesystem
-filesystems
-formatter
-forwardings
-framebuffer
-frontend
-fullscreen
-geocoding
-geoinformation
-gp
-helicoids
-hyperlinked
-hyphenator
-iCal
-iCalendar
-iODBC
-indenter
-independency
-inetd
-inode
-internetwork
-jQuery
-jaggy
-kerning
-keymap
-keyring
-keyrings
-lex
-libmagic
-libtoolized
-linkers
-lookup
-lookups
-lossless
-losslessly
-lossy
-mDNS
-maildir
-makefile
-makefiles
-mbox
-metadata
-middleware
-minidump
-minidumps
-minimalistic
-minimise # uk spelling
-modeller # uk spelling
-modelling # uk spelling
-monospace
-monospaced
-multibyte
-multilanguage
-multipart
-multiplatform
-multithreaded
-multithreading
-multiuser
-multivolume
-namespace
-narrowband
-netmask
-optimised # uk spellingx
-parameterized
-parsers
-passphrase
-patchset
-pathname
-persistency
-piecewise
-playlist
-polycones
-polycylinders
-polyhedra
-popup
-preconfigured
-preload
-preprocess
-preprocessor
-programmatically
-pronounceability
-quaternions
-rasterization
-rasterizer
-rasterizing
-rebased
-rebasing
-recognises # uk spelling
-recognises # uk spelling
-reflowable
-reformatter
-reimplemented
-reindenter
-renderer
-renderers
-resizing
-reverb
-scalable
-screenshots
-scrollback
-serializers
-significand
-slurper
-src
-stdin
-stdout
-steganographic
-steganography
-stylesheet
-stylesheets
-subcomponents
-subdirectory
-subhierarchy
-subprocesses
-substring
-subtree
-superset
-swiss
-symbology
-synchronizer
-synsets
-syntaxes
-targetted # uk spelling
-teleportation
-templating
-testsuite
-testsuites
-tetrominoes
-theming
-timestamp
-timestamps
-tokenization
-toolchain
-toolkit
-toolkits
-transactional
-transcoding
-triangulation
-triangulations
-trie
-trojans
-typesafe
-undecorated
-undirected
-unordered
-unpatched
-usably
-uuid
-variadic
-variational
-verifier
-versioning
-virtualized
-waveforms
-webserver
-whitespace
-wideband
-wildcard
-wildcards
-windowful
-workflow
-workflows
-wvWare
-xUnit
-yacc


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]