From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 121692 invoked by alias); 12 May 2016 16:28:59 -0000 Mailing-List: contact cygwin-apps-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cygwin-apps-cvs-owner@sourceware.org Received: (qmail 121626 invoked by uid 9795); 12 May 2016 16:28:58 -0000 Date: Thu, 12 May 2016 16:28:00 -0000 Message-ID: <20160512162857.121570.qmail@sourceware.org> From: jturney@sourceware.org To: cygwin-apps-cvs@sourceware.org Subject: [calm - Cygwin server-side packaging maintenance script] branch master, updated. 5903247af568efae6112bcba99ead3e0bf5a4a9a X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a1948028d018bf5b06b2ca609469b3b0787a711f X-Git-Newrev: 5903247af568efae6112bcba99ead3e0bf5a4a9a X-SW-Source: 2016-q2/txt/msg00019.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/calm.git;h=5903247af568efae6112bcba99ead3e0bf5a4a9a commit 5903247af568efae6112bcba99ead3e0bf5a4a9a Author: Jon Turney 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 ' ' + 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 / 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/ +# - 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('''\ + +

%s

+
''' % (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('''\
+                                                 
+ '''), 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('''\ +
+
+ +

Available Packages for %s

+ +
+
+ ''') % (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('', file=index) + + print(textwrap.dedent('''\ +
' + p + '' + header + '
+
'''), 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.' + 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 ' ' - 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 / 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/ -# - 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('''\ - -

%s

-
''' % (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('''\
-                                                 
- '''), 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('''\ -
-
- -

Available Packages for %s

- -
-
- ''') % (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('', file=index) - - print(textwrap.dedent('''\ -
' + p + '' + header + '
-
'''), 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 @@ + +

arc: The ARC archive utility (installed binaries and support files)

+
+
+ 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 @@ + +

arc: The ARC archive utility (source code)

+
+
+ 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 @@ + +

base-cygwin: Initial base installation helper script (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

base-cygwin: Initial base installation helper script (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin-devel: Core development files (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin-devel: Core development files (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin-devel: Core development files (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin: The UNIX emulation engine (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin: The UNIX emulation engine (source code)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin: The UNIX emulation engine (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin: The UNIX emulation engine (source code)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin: The UNIX emulation engine (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

cygwin: The UNIX emulation engine (source code)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

keychain: Key manager for OpenSSH (installed binaries and support files)

+
+    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
+
+ 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 @@ + +

keychain: Key manager for OpenSSH (source code)

+
+    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
+
+ 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 @@ + +

keychain: Key manager for OpenSSH (installed binaries and support files)

+
+    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
+
+ 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 @@ + +

keychain: Key manager for OpenSSH (source code)

+
+    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
+
+ 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 @@ + +

libdns_sd-devel: Bonjour Zeroconf implementation (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

libdns_sd1: Bonjour Zeroconf implementation (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

libtextcat-devel: Helper, header and library for libtextcat (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

libtextcat0: Text Classification Library dll (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

mDNSResponder: Bonjour Zeroconf implementation (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

mDNSResponder: Bonjour Zeroconf implementation (source code)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

openssh: The OpenSSH server and client programs (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

openssh: The OpenSSH server and client programs (source code)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ +
+
+ +

Available Packages for x86

+ +
+
+ + + + + + + + + + + + + + +
arcThe ARC archive utility
base-cygwinInitial base installation helper script
cygwinThe UNIX emulation engine
cygwin-debuginfoDebug info for cygwin
cygwin-develCore development files
keychainKey manager for OpenSSH
libdns_sd-develBonjour Zeroconf implementation
libdns_sd1Bonjour Zeroconf implementation
mDNSResponderBonjour Zeroconf implementation
opensshThe OpenSSH server and client programs
perl-Net-SMTP-SSLPerl distribution Net-SMTP-SSL
rpm-docObsolete package for RPM package management system manual pages
testpackageA test package
+
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 @@ + +

perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (installed binaries and support files)

+
+    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
+
+ 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 @@ + +

perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (source code)

+
+    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
+
+ 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 @@ + +

proj-debuginfo: Debug info for proj (installed binaries and support files)

+
+    2015-10-11 14:45          26 test/test.1
+    2015-10-11 14:45          31 test/test.2
+
+ 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 @@ + +

rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)

+
+    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
+
+ 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 @@ + +

rpm-doc: Obsolete package for RPM package management system manual pages (source code)

+
+
+ 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 @@ + +

rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)

+
+
+ 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 @@ + +

testpackage: A test package (installed binaries and support files)

+
+
+ 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 @@ - -

arc: The ARC archive utility (installed binaries and support files)

-
-
- 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 @@ - -

arc: The ARC archive utility (source code)

-
-
- 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 @@ - -

base-cygwin: Initial base installation helper script (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

base-cygwin: Initial base installation helper script (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin-debuginfo: Debug info for cygwin (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin-devel: Core development files (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin-devel: Core development files (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin-devel: Core development files (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin: The UNIX emulation engine (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin: The UNIX emulation engine (source code)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin: The UNIX emulation engine (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin: The UNIX emulation engine (source code)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin: The UNIX emulation engine (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

cygwin: The UNIX emulation engine (source code)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

keychain: Key manager for OpenSSH (installed binaries and support files)

-
-    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
-
- 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 @@ - -

keychain: Key manager for OpenSSH (source code)

-
-    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
-
- 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 @@ - -

keychain: Key manager for OpenSSH (installed binaries and support files)

-
-    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
-
- 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 @@ - -

keychain: Key manager for OpenSSH (source code)

-
-    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
-
- 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 @@ - -

libdns_sd-devel: Bonjour Zeroconf implementation (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

libdns_sd1: Bonjour Zeroconf implementation (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

libtextcat-devel: Helper, header and library for libtextcat (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

libtextcat0: Text Classification Library dll (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

mDNSResponder: Bonjour Zeroconf implementation (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

mDNSResponder: Bonjour Zeroconf implementation (source code)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

openssh: The OpenSSH server and client programs (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

openssh: The OpenSSH server and client programs (source code)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ -
-
- -

Available Packages for x86

- -
-
- - - - - - - - - - - - - - -
arcThe ARC archive utility
base-cygwinInitial base installation helper script
cygwinThe UNIX emulation engine
cygwin-debuginfoDebug info for cygwin
cygwin-develCore development files
keychainKey manager for OpenSSH
libdns_sd-develBonjour Zeroconf implementation
libdns_sd1Bonjour Zeroconf implementation
mDNSResponderBonjour Zeroconf implementation
opensshThe OpenSSH server and client programs
perl-Net-SMTP-SSLPerl distribution Net-SMTP-SSL
rpm-docObsolete package for RPM package management system manual pages
testpackageA test package
-
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 @@ - -

perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (installed binaries and support files)

-
-    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
-
- 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 @@ - -

perl-Net-SMTP-SSL: Perl distribution Net-SMTP-SSL (source code)

-
-    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
-
- 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 @@ - -

proj-debuginfo: Debug info for proj (installed binaries and support files)

-
-    2015-10-11 14:45          26 test/test.1
-    2015-10-11 14:45          31 test/test.2
-
- 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 @@ - -

rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)

-
-    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
-
- 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 @@ - -

rpm-doc: Obsolete package for RPM package management system manual pages (source code)

-
-
- 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 @@ - -

rpm-doc: Obsolete package for RPM package management system manual pages (installed binaries and support files)

-
-
- 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 @@ - -

testpackage: A test package (installed binaries and support files)

-
-
- 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.' - 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