From ea0faae4503f8a1eb472abc618c71e006b7c3430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20A=C5=9F=C4=B1c=C4=B1?= Date: Tue, 27 Oct 2009 10:13:41 +0000 Subject: [PATCH] Move pisi-1.1_rc10 tag --- tags/pisi-1.1_rc10/AUTHORS | 22 - tags/pisi-1.1_rc10/CODING | 150 - tags/pisi-1.1_rc10/COPYING | 346 -- tags/pisi-1.1_rc10/INSTALL | 16 - tags/pisi-1.1_rc10/MANIFEST.in | 7 - tags/pisi-1.1_rc10/README | 18 - tags/pisi-1.1_rc10/README.upgrade | 5 - tags/pisi-1.1_rc10/RefactorPlan | 64 - tags/pisi-1.1_rc10/doc/algorithm.sty | 79 - tags/pisi-1.1_rc10/doc/algorithmic.sty | 158 - tags/pisi-1.1_rc10/doc/component-notes.txt | 167 - tags/pisi-1.1_rc10/doc/dependency.pdf | Bin 119423 -> 0 bytes tags/pisi-1.1_rc10/doc/dependency.tex | 381 -- .../doc/introduction-to-pisi.odp | Bin 106860 -> 0 bytes tags/pisi-1.1_rc10/doc/package_versions.pdf | Bin 102463 -> 0 bytes tags/pisi-1.1_rc10/doc/package_versions.tex | 187 - tags/pisi-1.1_rc10/doc/pisi-db.xmi | 532 --- tags/pisi-1.1_rc10/doc/prettyref.sty | 37 - tags/pisi-1.1_rc10/pisi-cli | 89 - tags/pisi-1.1_rc10/pisi-cli2.5 | 78 - tags/pisi-1.1_rc10/pisi-spec.dtd | 123 - tags/pisi-1.1_rc10/pisi/__init__.py | 40 - .../pisi-1.1_rc10/pisi/actionsapi/__init__.py | 27 - .../pisi/actionsapi/autotools.py | 163 - .../pisi/actionsapi/coreutils.py | 80 - tags/pisi-1.1_rc10/pisi/actionsapi/get.py | 196 -- tags/pisi-1.1_rc10/pisi/actionsapi/kde.py | 81 - .../pisi-1.1_rc10/pisi/actionsapi/libtools.py | 72 - .../pisi/actionsapi/perlmodules.py | 84 - .../pisi/actionsapi/pisitools.py | 234 -- .../pisi/actionsapi/pisitoolsfunctions.py | 80 - .../pisi/actionsapi/pythonmodules.py | 74 - tags/pisi-1.1_rc10/pisi/actionsapi/scons.py | 43 - .../pisi/actionsapi/shelltools.py | 224 -- .../pisi/actionsapi/variables.py | 101 - tags/pisi-1.1_rc10/pisi/api.py | 556 --- tags/pisi-1.1_rc10/pisi/archive.py | 423 --- tags/pisi-1.1_rc10/pisi/atomicoperations.py | 566 --- tags/pisi-1.1_rc10/pisi/build.py | 992 ------ tags/pisi-1.1_rc10/pisi/catbox.patch | 51 - tags/pisi-1.1_rc10/pisi/cli/README | 23 - tags/pisi-1.1_rc10/pisi/cli/__init__.py | 165 - tags/pisi-1.1_rc10/pisi/cli/colors.py | 64 - tags/pisi-1.1_rc10/pisi/cli/commands.py | 1618 --------- tags/pisi-1.1_rc10/pisi/cli/pisicli.py | 111 - tags/pisi-1.1_rc10/pisi/comariface.py | 135 - tags/pisi-1.1_rc10/pisi/component.py | 243 -- tags/pisi-1.1_rc10/pisi/config.py | 118 - tags/pisi-1.1_rc10/pisi/configfile.py | 159 - tags/pisi-1.1_rc10/pisi/conflict.py | 83 - tags/pisi-1.1_rc10/pisi/constants.py | 108 - tags/pisi-1.1_rc10/pisi/context.py | 95 - tags/pisi-1.1_rc10/pisi/dbshelve.py | 317 -- tags/pisi-1.1_rc10/pisi/dependency.py | 121 - tags/pisi-1.1_rc10/pisi/fetcher.py | 371 -- tags/pisi-1.1_rc10/pisi/file.py | 266 -- tags/pisi-1.1_rc10/pisi/files.py | 103 - tags/pisi-1.1_rc10/pisi/graph.py | 175 - tags/pisi-1.1_rc10/pisi/index.py | 181 - tags/pisi-1.1_rc10/pisi/installdb.py | 217 -- tags/pisi-1.1_rc10/pisi/itembyrepodb.py | 220 -- tags/pisi-1.1_rc10/pisi/lockeddbshelve.py | 175 - tags/pisi-1.1_rc10/pisi/metadata.py | 105 - tags/pisi-1.1_rc10/pisi/mirrors.py | 47 - tags/pisi-1.1_rc10/pisi/oo.py | 39 - tags/pisi-1.1_rc10/pisi/operations.py | 813 ----- tags/pisi-1.1_rc10/pisi/package.py | 146 - tags/pisi-1.1_rc10/pisi/packagedb.py | 187 - tags/pisi-1.1_rc10/pisi/pgraph.py | 84 - tags/pisi-1.1_rc10/pisi/pxml/__init__.py | 23 - tags/pisi-1.1_rc10/pisi/pxml/autoxml.py | 849 ----- tags/pisi-1.1_rc10/pisi/pxml/xmlext.py | 167 - tags/pisi-1.1_rc10/pisi/pxml/xmlfile.py | 95 - tags/pisi-1.1_rc10/pisi/repodb.py | 129 - .../pisi/scenarioapi/__init__.py | 27 - .../pisi-1.1_rc10/pisi/scenarioapi/actions.py | 30 - .../pisi/scenarioapi/constants.py | 71 - .../pisi-1.1_rc10/pisi/scenarioapi/package.py | 95 - .../pisi-1.1_rc10/pisi/scenarioapi/pisiops.py | 41 - tags/pisi-1.1_rc10/pisi/scenarioapi/pspec.py | 153 - .../pisi-1.1_rc10/pisi/scenarioapi/repoops.py | 73 - .../pisi/scenarioapi/scenario.py | 28 - .../pisi-1.1_rc10/pisi/scenarioapi/withops.py | 84 - tags/pisi-1.1_rc10/pisi/search/__init__.py | 62 - .../pisi/search/invertedindex.py | 83 - tags/pisi-1.1_rc10/pisi/search/preprocess.py | 30 - tags/pisi-1.1_rc10/pisi/search/tokenize.py | 32 - tags/pisi-1.1_rc10/pisi/signalhandler.py | 52 - tags/pisi-1.1_rc10/pisi/sourcearchive.py | 106 - tags/pisi-1.1_rc10/pisi/sourcedb.py | 112 - tags/pisi-1.1_rc10/pisi/specfile.py | 245 -- tags/pisi-1.1_rc10/pisi/ui.py | 101 - tags/pisi-1.1_rc10/pisi/uri.py | 110 - tags/pisi-1.1_rc10/pisi/util.py | 634 ---- tags/pisi-1.1_rc10/pisi/version.py | 215 -- tags/pisi-1.1_rc10/po/de.po | 2600 -------------- tags/pisi-1.1_rc10/po/es.po | 3088 ----------------- tags/pisi-1.1_rc10/po/nl.po | 3071 ---------------- tags/pisi-1.1_rc10/po/pisi.pot | 2646 -------------- tags/pisi-1.1_rc10/po/tr.po | 2873 --------------- tags/pisi-1.1_rc10/scenarios/bug3237scen.py | 57 - tags/pisi-1.1_rc10/scenarios/bug3390scen.py | 49 - tags/pisi-1.1_rc10/scenarios/bug3465scen.py | 38 - tags/pisi-1.1_rc10/scenarios/bug3481scen.py | 48 - tags/pisi-1.1_rc10/scenarios/bug3558scen.py | 47 - tags/pisi-1.1_rc10/scenarios/bug3732scen.py | 42 - tags/pisi-1.1_rc10/scenarios/bug3865scen.py | 35 - tags/pisi-1.1_rc10/scenarios/bug4211scen.py | 80 - tags/pisi-1.1_rc10/scenarios/run.py | 57 - tags/pisi-1.1_rc10/scripts/buildno | 9 - .../pisi-1.1_rc10/scripts/check-newconfigs.py | 92 - tags/pisi-1.1_rc10/scripts/cleanArchives.py | 63 - tags/pisi-1.1_rc10/scripts/cleanCache.py | 103 - tags/pisi-1.1_rc10/scripts/convert_history.py | 84 - .../scripts/fix_old_metadata_files.py | 61 - tags/pisi-1.1_rc10/scripts/lspisi | 62 - tags/pisi-1.1_rc10/scripts/newpisipackage | 206 -- tags/pisi-1.1_rc10/scripts/pisisdr | 42 - tags/pisi-1.1_rc10/scripts/repo-diff.py | 92 - tags/pisi-1.1_rc10/scripts/repostats.py | 698 ---- tags/pisi-1.1_rc10/scripts/revdep-rebuild | 200 -- tags/pisi-1.1_rc10/scripts/unpisi | 60 - tags/pisi-1.1_rc10/setup.py | 119 - tags/pisi-1.1_rc10/tests/README | 11 - tags/pisi-1.1_rc10/tests/a.xml | 22 - tags/pisi-1.1_rc10/tests/actionsapitests.py | 155 - .../tests/actionsapitests/brokenlink | 1 - tags/pisi-1.1_rc10/tests/actionsapitests/file | 6 - .../tests/actionsapitests/linkeddir/file | 6 - .../tests/actionsapitests/linktoadirectory | 1 - .../tests/actionsapitests/linktoafile | 1 - tags/pisi-1.1_rc10/tests/archivetests.py | 114 - tags/pisi-1.1_rc10/tests/autoxmltests.py | 102 - tags/pisi-1.1_rc10/tests/build.sh | 41 - tags/pisi-1.1_rc10/tests/buildtests.py | 59 - .../tests/buildtests/a/actions.py-1 | 20 - .../tests/buildtests/a/actions.py-2 | 20 - .../tests/buildtests/a/pspec.xml | 39 - tags/pisi-1.1_rc10/tests/configfiletests.py | 61 - tags/pisi-1.1_rc10/tests/constantstests.py | 67 - tags/pisi-1.1_rc10/tests/dependencytests.py | 47 - tags/pisi-1.1_rc10/tests/distribution.xml | 6 - tags/pisi-1.1_rc10/tests/fetchertests.py | 51 - tags/pisi-1.1_rc10/tests/filestests.py | 31 - tags/pisi-1.1_rc10/tests/filetests.py | 33 - tags/pisi-1.1_rc10/tests/graphtests.py | 33 - .../pisi-1.1_rc10/tests/helloworld/actions.py | 102 - .../tests/helloworld/hello-1.3.tar.gz.part | Bin 11520 -> 0 bytes tags/pisi-1.1_rc10/tests/helloworld/pspec.xml | 35 - tags/pisi-1.1_rc10/tests/installdbtests.py | 40 - tags/pisi-1.1_rc10/tests/light.sh | 23 - tags/pisi-1.1_rc10/tests/metadatatests.py | 40 - tags/pisi-1.1_rc10/tests/ootests.py | 39 - tags/pisi-1.1_rc10/tests/packagedbtests.py | 41 - tags/pisi-1.1_rc10/tests/packagetests.py | 50 - tags/pisi-1.1_rc10/tests/pccts/actions.py | 53 - .../pccts/files/pccts-1.33.33-gentoo.diff | 69 - tags/pisi-1.1_rc10/tests/pccts/pspec.xml | 42 - tags/pisi-1.1_rc10/tests/pisi.conf | 6 - tags/pisi-1.1_rc10/tests/popt/actions.py | 25 - tags/pisi-1.1_rc10/tests/popt/files.xml | 507 --- .../tests/popt/files/popt-1.7-uclibc.patch.gz | Bin 891 -> 0 bytes tags/pisi-1.1_rc10/tests/popt/metadata.xml | 87 - tags/pisi-1.1_rc10/tests/popt/pspec.xml | 80 - tags/pisi-1.1_rc10/tests/remoterepo.sh | 25 - tags/pisi-1.1_rc10/tests/repodbtests.py | 30 - tags/pisi-1.1_rc10/tests/run.py | 52 - tags/pisi-1.1_rc10/tests/searchtests.py | 40 - tags/pisi-1.1_rc10/tests/sourcedbtests.py | 38 - tags/pisi-1.1_rc10/tests/specfiletests.py | 78 - .../tests/stress/comp/ab/actions.py | 24 - .../tests/stress/comp/ab/comar/package.py | 6 - .../comp/ab/files/bc-1.06-info-fix.diff | 101 - .../comp/ab/files/bc-1.06-longopts.patch | 28 - .../comp/ab/files/bc-1.06-readline42.diff | 12 - .../comp/ab/files/bc-1.06-static-save.patch | 16 - .../tests/stress/comp/ab/pspec.xml | 46 - .../tests/stress/comp/bc/actions.py | 22 - .../comp/bc/files/bc-1.06-info-fix.diff | 101 - .../comp/bc/files/bc-1.06-longopts.patch | 28 - .../comp/bc/files/bc-1.06-readline42.diff | 12 - .../comp/bc/files/bc-1.06-static-save.patch | 16 - .../tests/stress/comp/bc/pspec.xml | 49 - .../tests/stress/comp/cd/actions.py | 24 - .../comp/cd/files/bc-1.06-info-fix.diff | 101 - .../comp/cd/files/bc-1.06-longopts.patch | 28 - .../comp/cd/files/bc-1.06-readline42.diff | 12 - .../comp/cd/files/bc-1.06-static-save.patch | 16 - .../tests/stress/comp/cd/pspec.xml | 51 - .../tests/stress/comp/component.xml | 6 - tags/pisi-1.1_rc10/tests/stress/component.xml | 6 - .../tests/stress/lang/component.xml | 6 - .../tests/stress/lang/de/actions.py | 24 - .../lang/de/files/bc-1.06-info-fix.diff | 101 - .../lang/de/files/bc-1.06-longopts.patch | 28 - .../lang/de/files/bc-1.06-readline42.diff | 12 - .../lang/de/files/bc-1.06-static-save.patch | 16 - .../tests/stress/lang/de/pspec.xml | 49 - .../tests/stress/lang/ef/actions.py | 24 - .../lang/ef/files/bc-1.06-info-fix.diff | 101 - .../lang/ef/files/bc-1.06-longopts.patch | 28 - .../lang/ef/files/bc-1.06-readline42.diff | 12 - .../lang/ef/files/bc-1.06-static-save.patch | 16 - .../tests/stress/lang/ef/pspec.xml | 49 - tags/pisi-1.1_rc10/tests/stress/stress.sh | 37 - tags/pisi-1.1_rc10/tests/testcase.py | 30 - tags/pisi-1.1_rc10/tests/unzip/actions.py | 35 - .../tests/unzip/files/unzip-5.50-dotdot.patch | 85 - tags/pisi-1.1_rc10/tests/unzip/pspec.xml | 48 - tags/pisi-1.1_rc10/tests/unzip2/actions.py | 37 - .../unzip2/files/unzip-5.50-dotdot.patch | 85 - tags/pisi-1.1_rc10/tests/unzip2/pspec.xml | 48 - tags/pisi-1.1_rc10/tests/upgrade.sh | 24 - .../tests/utilfiles/arfilewithtimestamps.a | Bin 74536 -> 0 bytes .../tests/utilfiles/directory/file_74536 | Bin 74536 -> 0 bytes .../tests/utilfiles/linktoarfile | 1 - .../tests/utilfiles/linktonowhere | 1 - tags/pisi-1.1_rc10/tests/utiltests.py | 86 - tags/pisi-1.1_rc10/tests/versiontests.py | 78 - tags/pisi-1.1_rc10/tests/xmlexttests.py | 45 - tags/pisi-1.1_rc10/tests/zip/actions.py | 32 - .../tests/zip/files/zcrypt.patch | 752 ---- .../files/zip-2.3-unix_configure-pic.patch | 12 - .../tests/zip/files/zip-CAN-2004-1010.patch | 25 - tags/pisi-1.1_rc10/tests/zip/pspec.xml | 49 - tags/pisi-1.1_rc10/tests/zip2/actions.py | 34 - .../tests/zip2/files/zcrypt.patch | 752 ---- .../files/zip-2.3-unix_configure-pic.patch | 12 - .../tests/zip2/files/zip-CAN-2004-1010.patch | 25 - tags/pisi-1.1_rc10/tests/zip2/pspec.xml | 50 - tags/pisi-1.1_rc10/tools/pygettext.py | 669 ---- tags/pisi-1.1_rc10/tools/svndist.py | 31 - tags/pisi-1.1_rc10/tools/update-po.sh | 8 - 233 files changed, 39995 deletions(-) delete mode 100644 tags/pisi-1.1_rc10/AUTHORS delete mode 100644 tags/pisi-1.1_rc10/CODING delete mode 100644 tags/pisi-1.1_rc10/COPYING delete mode 100644 tags/pisi-1.1_rc10/INSTALL delete mode 100644 tags/pisi-1.1_rc10/MANIFEST.in delete mode 100644 tags/pisi-1.1_rc10/README delete mode 100644 tags/pisi-1.1_rc10/README.upgrade delete mode 100644 tags/pisi-1.1_rc10/RefactorPlan delete mode 100644 tags/pisi-1.1_rc10/doc/algorithm.sty delete mode 100644 tags/pisi-1.1_rc10/doc/algorithmic.sty delete mode 100644 tags/pisi-1.1_rc10/doc/component-notes.txt delete mode 100644 tags/pisi-1.1_rc10/doc/dependency.pdf delete mode 100644 tags/pisi-1.1_rc10/doc/dependency.tex delete mode 100644 tags/pisi-1.1_rc10/doc/introduction-to-pisi.odp delete mode 100644 tags/pisi-1.1_rc10/doc/package_versions.pdf delete mode 100644 tags/pisi-1.1_rc10/doc/package_versions.tex delete mode 100644 tags/pisi-1.1_rc10/doc/pisi-db.xmi delete mode 100644 tags/pisi-1.1_rc10/doc/prettyref.sty delete mode 100755 tags/pisi-1.1_rc10/pisi-cli delete mode 100755 tags/pisi-1.1_rc10/pisi-cli2.5 delete mode 100644 tags/pisi-1.1_rc10/pisi-spec.dtd delete mode 100644 tags/pisi-1.1_rc10/pisi/__init__.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/__init__.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/autotools.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/coreutils.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/get.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/kde.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/libtools.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/perlmodules.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/pisitools.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/pisitoolsfunctions.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/pythonmodules.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/scons.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/shelltools.py delete mode 100644 tags/pisi-1.1_rc10/pisi/actionsapi/variables.py delete mode 100644 tags/pisi-1.1_rc10/pisi/api.py delete mode 100644 tags/pisi-1.1_rc10/pisi/archive.py delete mode 100644 tags/pisi-1.1_rc10/pisi/atomicoperations.py delete mode 100644 tags/pisi-1.1_rc10/pisi/build.py delete mode 100644 tags/pisi-1.1_rc10/pisi/catbox.patch delete mode 100644 tags/pisi-1.1_rc10/pisi/cli/README delete mode 100644 tags/pisi-1.1_rc10/pisi/cli/__init__.py delete mode 100644 tags/pisi-1.1_rc10/pisi/cli/colors.py delete mode 100644 tags/pisi-1.1_rc10/pisi/cli/commands.py delete mode 100644 tags/pisi-1.1_rc10/pisi/cli/pisicli.py delete mode 100644 tags/pisi-1.1_rc10/pisi/comariface.py delete mode 100644 tags/pisi-1.1_rc10/pisi/component.py delete mode 100644 tags/pisi-1.1_rc10/pisi/config.py delete mode 100644 tags/pisi-1.1_rc10/pisi/configfile.py delete mode 100644 tags/pisi-1.1_rc10/pisi/conflict.py delete mode 100644 tags/pisi-1.1_rc10/pisi/constants.py delete mode 100644 tags/pisi-1.1_rc10/pisi/context.py delete mode 100644 tags/pisi-1.1_rc10/pisi/dbshelve.py delete mode 100644 tags/pisi-1.1_rc10/pisi/dependency.py delete mode 100644 tags/pisi-1.1_rc10/pisi/fetcher.py delete mode 100644 tags/pisi-1.1_rc10/pisi/file.py delete mode 100644 tags/pisi-1.1_rc10/pisi/files.py delete mode 100644 tags/pisi-1.1_rc10/pisi/graph.py delete mode 100644 tags/pisi-1.1_rc10/pisi/index.py delete mode 100644 tags/pisi-1.1_rc10/pisi/installdb.py delete mode 100644 tags/pisi-1.1_rc10/pisi/itembyrepodb.py delete mode 100644 tags/pisi-1.1_rc10/pisi/lockeddbshelve.py delete mode 100644 tags/pisi-1.1_rc10/pisi/metadata.py delete mode 100644 tags/pisi-1.1_rc10/pisi/mirrors.py delete mode 100644 tags/pisi-1.1_rc10/pisi/oo.py delete mode 100644 tags/pisi-1.1_rc10/pisi/operations.py delete mode 100644 tags/pisi-1.1_rc10/pisi/package.py delete mode 100644 tags/pisi-1.1_rc10/pisi/packagedb.py delete mode 100644 tags/pisi-1.1_rc10/pisi/pgraph.py delete mode 100644 tags/pisi-1.1_rc10/pisi/pxml/__init__.py delete mode 100644 tags/pisi-1.1_rc10/pisi/pxml/autoxml.py delete mode 100644 tags/pisi-1.1_rc10/pisi/pxml/xmlext.py delete mode 100644 tags/pisi-1.1_rc10/pisi/pxml/xmlfile.py delete mode 100644 tags/pisi-1.1_rc10/pisi/repodb.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/__init__.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/actions.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/constants.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/package.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/pisiops.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/pspec.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/repoops.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/scenario.py delete mode 100644 tags/pisi-1.1_rc10/pisi/scenarioapi/withops.py delete mode 100644 tags/pisi-1.1_rc10/pisi/search/__init__.py delete mode 100644 tags/pisi-1.1_rc10/pisi/search/invertedindex.py delete mode 100644 tags/pisi-1.1_rc10/pisi/search/preprocess.py delete mode 100644 tags/pisi-1.1_rc10/pisi/search/tokenize.py delete mode 100644 tags/pisi-1.1_rc10/pisi/signalhandler.py delete mode 100644 tags/pisi-1.1_rc10/pisi/sourcearchive.py delete mode 100644 tags/pisi-1.1_rc10/pisi/sourcedb.py delete mode 100644 tags/pisi-1.1_rc10/pisi/specfile.py delete mode 100644 tags/pisi-1.1_rc10/pisi/ui.py delete mode 100644 tags/pisi-1.1_rc10/pisi/uri.py delete mode 100644 tags/pisi-1.1_rc10/pisi/util.py delete mode 100644 tags/pisi-1.1_rc10/pisi/version.py delete mode 100644 tags/pisi-1.1_rc10/po/de.po delete mode 100644 tags/pisi-1.1_rc10/po/es.po delete mode 100644 tags/pisi-1.1_rc10/po/nl.po delete mode 100644 tags/pisi-1.1_rc10/po/pisi.pot delete mode 100644 tags/pisi-1.1_rc10/po/tr.po delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3237scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3390scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3465scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3481scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3558scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3732scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug3865scen.py delete mode 100644 tags/pisi-1.1_rc10/scenarios/bug4211scen.py delete mode 100755 tags/pisi-1.1_rc10/scenarios/run.py delete mode 100755 tags/pisi-1.1_rc10/scripts/buildno delete mode 100755 tags/pisi-1.1_rc10/scripts/check-newconfigs.py delete mode 100755 tags/pisi-1.1_rc10/scripts/cleanArchives.py delete mode 100755 tags/pisi-1.1_rc10/scripts/cleanCache.py delete mode 100755 tags/pisi-1.1_rc10/scripts/convert_history.py delete mode 100755 tags/pisi-1.1_rc10/scripts/fix_old_metadata_files.py delete mode 100755 tags/pisi-1.1_rc10/scripts/lspisi delete mode 100755 tags/pisi-1.1_rc10/scripts/newpisipackage delete mode 100755 tags/pisi-1.1_rc10/scripts/pisisdr delete mode 100755 tags/pisi-1.1_rc10/scripts/repo-diff.py delete mode 100755 tags/pisi-1.1_rc10/scripts/repostats.py delete mode 100755 tags/pisi-1.1_rc10/scripts/revdep-rebuild delete mode 100755 tags/pisi-1.1_rc10/scripts/unpisi delete mode 100755 tags/pisi-1.1_rc10/setup.py delete mode 100644 tags/pisi-1.1_rc10/tests/README delete mode 100644 tags/pisi-1.1_rc10/tests/a.xml delete mode 100644 tags/pisi-1.1_rc10/tests/actionsapitests.py delete mode 120000 tags/pisi-1.1_rc10/tests/actionsapitests/brokenlink delete mode 100644 tags/pisi-1.1_rc10/tests/actionsapitests/file delete mode 100644 tags/pisi-1.1_rc10/tests/actionsapitests/linkeddir/file delete mode 120000 tags/pisi-1.1_rc10/tests/actionsapitests/linktoadirectory delete mode 120000 tags/pisi-1.1_rc10/tests/actionsapitests/linktoafile delete mode 100644 tags/pisi-1.1_rc10/tests/archivetests.py delete mode 100644 tags/pisi-1.1_rc10/tests/autoxmltests.py delete mode 100755 tags/pisi-1.1_rc10/tests/build.sh delete mode 100644 tags/pisi-1.1_rc10/tests/buildtests.py delete mode 100644 tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-1 delete mode 100644 tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-2 delete mode 100644 tags/pisi-1.1_rc10/tests/buildtests/a/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/configfiletests.py delete mode 100644 tags/pisi-1.1_rc10/tests/constantstests.py delete mode 100644 tags/pisi-1.1_rc10/tests/dependencytests.py delete mode 100644 tags/pisi-1.1_rc10/tests/distribution.xml delete mode 100644 tags/pisi-1.1_rc10/tests/fetchertests.py delete mode 100644 tags/pisi-1.1_rc10/tests/filestests.py delete mode 100644 tags/pisi-1.1_rc10/tests/filetests.py delete mode 100644 tags/pisi-1.1_rc10/tests/graphtests.py delete mode 100644 tags/pisi-1.1_rc10/tests/helloworld/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/helloworld/hello-1.3.tar.gz.part delete mode 100644 tags/pisi-1.1_rc10/tests/helloworld/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/installdbtests.py delete mode 100755 tags/pisi-1.1_rc10/tests/light.sh delete mode 100644 tags/pisi-1.1_rc10/tests/metadatatests.py delete mode 100644 tags/pisi-1.1_rc10/tests/ootests.py delete mode 100644 tags/pisi-1.1_rc10/tests/packagedbtests.py delete mode 100644 tags/pisi-1.1_rc10/tests/packagetests.py delete mode 100644 tags/pisi-1.1_rc10/tests/pccts/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/pccts/files/pccts-1.33.33-gentoo.diff delete mode 100644 tags/pisi-1.1_rc10/tests/pccts/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/pisi.conf delete mode 100644 tags/pisi-1.1_rc10/tests/popt/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/popt/files.xml delete mode 100644 tags/pisi-1.1_rc10/tests/popt/files/popt-1.7-uclibc.patch.gz delete mode 100644 tags/pisi-1.1_rc10/tests/popt/metadata.xml delete mode 100644 tags/pisi-1.1_rc10/tests/popt/pspec.xml delete mode 100755 tags/pisi-1.1_rc10/tests/remoterepo.sh delete mode 100644 tags/pisi-1.1_rc10/tests/repodbtests.py delete mode 100755 tags/pisi-1.1_rc10/tests/run.py delete mode 100644 tags/pisi-1.1_rc10/tests/searchtests.py delete mode 100644 tags/pisi-1.1_rc10/tests/sourcedbtests.py delete mode 100644 tags/pisi-1.1_rc10/tests/specfiletests.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/comar/package.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-info-fix.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-longopts.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-readline42.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-static-save.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/ab/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/bc/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-info-fix.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-longopts.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-readline42.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-static-save.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/bc/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/cd/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-info-fix.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-longopts.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-readline42.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-static-save.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/cd/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/comp/component.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/component.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/component.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/de/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-info-fix.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-longopts.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-readline42.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-static-save.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/de/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/ef/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-info-fix.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-longopts.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-readline42.diff delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-static-save.patch delete mode 100644 tags/pisi-1.1_rc10/tests/stress/lang/ef/pspec.xml delete mode 100755 tags/pisi-1.1_rc10/tests/stress/stress.sh delete mode 100644 tags/pisi-1.1_rc10/tests/testcase.py delete mode 100644 tags/pisi-1.1_rc10/tests/unzip/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/unzip/files/unzip-5.50-dotdot.patch delete mode 100644 tags/pisi-1.1_rc10/tests/unzip/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/unzip2/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/unzip2/files/unzip-5.50-dotdot.patch delete mode 100644 tags/pisi-1.1_rc10/tests/unzip2/pspec.xml delete mode 100755 tags/pisi-1.1_rc10/tests/upgrade.sh delete mode 100644 tags/pisi-1.1_rc10/tests/utilfiles/arfilewithtimestamps.a delete mode 100644 tags/pisi-1.1_rc10/tests/utilfiles/directory/file_74536 delete mode 120000 tags/pisi-1.1_rc10/tests/utilfiles/linktoarfile delete mode 120000 tags/pisi-1.1_rc10/tests/utilfiles/linktonowhere delete mode 100644 tags/pisi-1.1_rc10/tests/utiltests.py delete mode 100644 tags/pisi-1.1_rc10/tests/versiontests.py delete mode 100644 tags/pisi-1.1_rc10/tests/xmlexttests.py delete mode 100644 tags/pisi-1.1_rc10/tests/zip/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/zip/files/zcrypt.patch delete mode 100644 tags/pisi-1.1_rc10/tests/zip/files/zip-2.3-unix_configure-pic.patch delete mode 100644 tags/pisi-1.1_rc10/tests/zip/files/zip-CAN-2004-1010.patch delete mode 100644 tags/pisi-1.1_rc10/tests/zip/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tests/zip2/actions.py delete mode 100644 tags/pisi-1.1_rc10/tests/zip2/files/zcrypt.patch delete mode 100644 tags/pisi-1.1_rc10/tests/zip2/files/zip-2.3-unix_configure-pic.patch delete mode 100644 tags/pisi-1.1_rc10/tests/zip2/files/zip-CAN-2004-1010.patch delete mode 100644 tags/pisi-1.1_rc10/tests/zip2/pspec.xml delete mode 100644 tags/pisi-1.1_rc10/tools/pygettext.py delete mode 100755 tags/pisi-1.1_rc10/tools/svndist.py delete mode 100755 tags/pisi-1.1_rc10/tools/update-po.sh diff --git a/tags/pisi-1.1_rc10/AUTHORS b/tags/pisi-1.1_rc10/AUTHORS deleted file mode 100644 index e1af7c46..00000000 --- a/tags/pisi-1.1_rc10/AUTHORS +++ /dev/null @@ -1,22 +0,0 @@ -Current maintainer ------------------- -Faik Uygur - -Authors and contributors ------------------------- - -Ahmet Aygun -A. Murat Eren -Bahadır Kandemir -Barış Metin -Faik Uygur -Furkan Duman -Görkem Çetin -Gürer Özen -İsmail Dönmez -Onur Küçük -S. Çağlar Onur - -Inactive contributors ---------------------------------- -Eray Özkural < erayo@cs.bilkent.edu.tr > diff --git a/tags/pisi-1.1_rc10/CODING b/tags/pisi-1.1_rc10/CODING deleted file mode 100644 index d47b9e41..00000000 --- a/tags/pisi-1.1_rc10/CODING +++ /dev/null @@ -1,150 +0,0 @@ -Like every serious project, there are guidelines. -"Coding Standards" for serious. - -Guidelines ----------- - -0. Before reading any further please observe - PEP 8: Style Guide for Python Code - http://www.python.org/peps/pep-0008.html - - In particular this means no lameCaps - -1. When using dirnames, don't expect the dir to end - with a trailing slash, and please use the dirnames - in pisiconfig. Use util.join_path instead of os.path.join -2. Python indentation is usually 4 spaces. -3. Follow python philosophy of 'batteries included' -4. Use exceptions, don't return error codes -5. Don't make the PISI code have runtime dependencies on - a particular distribution (as much as possible). -6. Don't assume narrow use cases. Allow for a mediocre - amount of generalization in your code, for pieces that - will be required later. -7. If you are changing something, check if that change - breaks anything and fix breakage. For instance a - name. Running the tests is not always enough! -8. A good design ensures separation of concerns. Every module - has a specific documented responsibility. Don't make the - horse clean your windows. -9. To ensure readability avoid nesting python constructs - more than 3 levels deep. Python is a good language (unlike C), - so you can define inner functions in a convenient way, use - such decomposition techniques to break down your code into - manageable chunks. The worst code you can write is one huge - procedure that goes on for 1000 (or more) lines. -10. Use a particular abstraction like a class or function only - if it makes sense. Don't just define things because they can - be defined. Define only things that will/may be used. -11. If you are doing an expensive task like searching through - 10000 text chunks, please use an efficient data structure - and algorithm. We are not MS engineers who know no data - structure beyond doubly linked lists and no algorithm beyond - quicksort. -12. Resist the temptation to develop kludges and workarounds in - response to pressure. Take your time to solve the problems by - the book. The payoff comes later. -13. Same thing goes for premature optimizations. Knuth and Dijkstra - are watching over your shoulder. :) - -Branches and SVN ----------------- - -There are two branches of pisi, one is called pisi-devel and -new features that are large enough to cause instability go -into that branch. The trunk version is supposed to be stable at -all times. This means that you *must* run unit tests and other -test scripts after committing any change that cannot be tested -in isolation. Run the unit tests periodically to catch unseen -bugs. A release from the stable branch *must not* break any tests -whatsoever, so extensive use of the test suite must precede any -release. - - -Unit testing ------------- - -Unit tests are located in unittests directory. Running the tests is -trivial. But you must synchronize your code and data with the test -code, which can be a tedious work if you lose discipline. - -Sample data files are located in the same directory with test modules. - -For running the entire test suite, use the following command: - -$ ./tests/run.py - -The following command will run tests in specfiletests and archivetests -in unittests dir: - -$ ./tests/run.py specfile archive - -Do not depend on the output of unittests. Instead of producing an -output message/data in your tests, check the data internally. By -definition, unittest should just report succeeding and failing cases. - -If you didn't, take a look at the links below for having an idea of -unit testing. -http://www.extremeprogramming.org/rules/unittests.html -http://www.extremeprogramming.org/rules/unittests2.html - - -Other tests ------------ - -There are a couple of nice test scripts for testing the basic -capabilities of the command line interface such as building and -upgrading. Unlike unit tests, you have to take a look at the output -to understand that the scripts are doing well :) - -Misc. Suggestions ------------------ - -1. Demeter's Law - -In OO programming, try to invoke Demeter's law. -One of the "rules" there is not directly accessing any -objects that are further than, 2/3 refs, away. So the -following code is OK. - destroy_system(a.system().name()) -but the following isn't as robust - destroy_system(object_store.root().a.system.name()) -As you can tell, this introduces too many implementation -dependencies. The rule of thumb is that, in these cases -this statement must have been elsewhere.... It may be a -good idea to not count the object scope in this case, -so in Python self.a means only one level of reference, -not two. - -One quibble with this: it may be preferable not to insist -on this where it would be inefficient. So if everything -is neatly packed into one object contained in another -object, why replicate everything in the upper level? If -the semantics prevents dependency changes, then chains -of 3 or even 4 could be acceptable. - -OTOH, in Python and C++, it's not always good to implement -accessor/modifier pairs for every property of an object. -It would be much simpler if you are not doing any special -processing on the property (e.g. if what the type system -does is sufficient). - -The main rule of thumb in Demeter's Law is avoiding -putting more than, say, 10 methods in a class. That works -really well in practice, forcing refactoring every now -and then. - -2. We all know, you're using LISP but didn't want to tell -us. Don't be scared, as a success story and for your encouragment -there are tens of people somewhere with LISP releated jobs. - -3. If you are studying Data structures and Algorithms, and if -your first assignment is to implement a basic FIFO queue, -don't implement it. Just show your teacher the syntax of LISP, -tell him how beautiful it is, and show how an autistic person -can count lots of parenthesis with a "one second" look, you'll -probably get A+. - -4. If you are interested in "Playstation 2 Linux Games Programming" -or "How to extend C programs with Guile", please don't exercise -your valuable skills in this project. diff --git a/tags/pisi-1.1_rc10/COPYING b/tags/pisi-1.1_rc10/COPYING deleted file mode 100644 index 059bf0ed..00000000 --- a/tags/pisi-1.1_rc10/COPYING +++ /dev/null @@ -1,346 +0,0 @@ -NOTE! The GPL below is copyrighted by the Free Software Foundation, but -the instance of code that it refers to (the kde programs) are copyrighted -by the authors who actually wrote it. - ---------------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/tags/pisi-1.1_rc10/INSTALL b/tags/pisi-1.1_rc10/INSTALL deleted file mode 100644 index 33a2f00c..00000000 --- a/tags/pisi-1.1_rc10/INSTALL +++ /dev/null @@ -1,16 +0,0 @@ -You can install PiSi on your system with a single command. - -# ./setup.py install - -If you are on a Pardus system, you should delete /usr/lib/pardus/pisi -when you are installing the SVN version - -PiSi requires piksemel XML processing library, the newest version -bsd bindings called "bsddb3" and Pardus configuration manager COMAR -in order to run. - -If you are upgrading from an old PiSi release you may have to -run the following command as root: - -# pisi rebuild-db - diff --git a/tags/pisi-1.1_rc10/MANIFEST.in b/tags/pisi-1.1_rc10/MANIFEST.in deleted file mode 100644 index e423d286..00000000 --- a/tags/pisi-1.1_rc10/MANIFEST.in +++ /dev/null @@ -1,7 +0,0 @@ -recursive-include po * -recursive-include tests *.py -recursive-include tools * -recursive-include doc * -include . *.dtd -include . README NEWS CODING COPYING - diff --git a/tags/pisi-1.1_rc10/README b/tags/pisi-1.1_rc10/README deleted file mode 100644 index d1d026d1..00000000 --- a/tags/pisi-1.1_rc10/README +++ /dev/null @@ -1,18 +0,0 @@ -PISI - Packages Installed Succesfully as Intended - -PISI is a new package manager for the PARDUS -distribution. In Turkish PISI means "kitty", and -like a kitty, it is featureful and small. - -Some of its distinctive features: - - - Implemented in python - - Efficient and small - - Package sources are written in XML and python - - Uses LZMA for a better compression ratio - - Fast database access implemented with berkeley DB - - Integrates low-level and high-level package operations (dependency resolution) - - Framework approach to build applications and tools upon - - Comprehensive CLI and a user-friendly qt GUI (distributed separately) - - Extremely simple package construction - diff --git a/tags/pisi-1.1_rc10/README.upgrade b/tags/pisi-1.1_rc10/README.upgrade deleted file mode 100644 index a0577caa..00000000 --- a/tags/pisi-1.1_rc10/README.upgrade +++ /dev/null @@ -1,5 +0,0 @@ -For upgrading from pisi 1.0 and before - -You have to move the packages in /var/lib/pisi under /var/lib/pisi/package and remove /var/db/pisi/ directory. - -db version has changed, so a rebuild-db will be unfortunately necessary. diff --git a/tags/pisi-1.1_rc10/RefactorPlan b/tags/pisi-1.1_rc10/RefactorPlan deleted file mode 100644 index 1300f81c..00000000 --- a/tags/pisi-1.1_rc10/RefactorPlan +++ /dev/null @@ -1,64 +0,0 @@ - -Here we take notes of the strange stuff, so we can refactor them after -Pardus 2007 release. - - -==> Locale support -* bindtextdomain and textdomain calls are not necessary, because -gettext.translation() dont use them. - -* setlocale call is probably necessary for some stuff, but not for -message translation, it seems gettext.translation() api looks for -environment LC_ALL, LC_MESSAGES anyway. - -* pygettext.py shouldn't be needed at all. Plain xgettext works with -python source. - - -==> Utility functions -* sha1_file is suboptimal for binary files and sha1_data has some -exception confusion. These two functions should be a lot simpler. - -* get_file_hashes is overly complex and contains strange code like: -for r, d, f in os.walk(parent, topdown=False): pass - -* dir_size tries to calculate symlink lengths, this is probably not very -helpful, since in most cases, they fit in the inode, and wont take any -extra space at all. We can keep the number of file in the index though. -That way we can calculate package size + (nr of files * inode size of fs) -to give a more correct required disk size. - -* what the heck is unzip there? it is not even used at all and defined like: -def unzip(seq): - return zip(*seq) - - -==> code readability -* Public functions should contain doc strings. - -* Python builtins like file, list, etc should be avoided in variable names. -There is even a file.py module! - -* a,b,c,d,f,r,_i are equally bad. - -* some import'ed modules are not used inside the importer modules, cleanup needed. - -* Would be very good if we can avoid "from x import y" form, it makes it -harder to reload modules. - - -==> exceptions -* Current model is bad. Exception names should tell what is the error type. Instead -we have one Error exception in every module. If I call pisi.api.install("lala"), -I should get pisi.api.PackageNotFound or pisi.install.PackageNotFound or something -like that. For every kind of error, you get pisi.api.Error now, and only way to find -out exact error is try to parse error string (which is localized). - -* class Exception(Exception) is evil. - -* There shouldn't be a bare Except: clause in pisi modules. - - -==> database -* brr... - diff --git a/tags/pisi-1.1_rc10/doc/algorithm.sty b/tags/pisi-1.1_rc10/doc/algorithm.sty deleted file mode 100644 index 843e3d5b..00000000 --- a/tags/pisi-1.1_rc10/doc/algorithm.sty +++ /dev/null @@ -1,79 +0,0 @@ -% ALGORITHM STYLE -- Released 8 April 1996 -% for LaTeX-2e -% Copyright -- 1994 Peter Williams -% E-mail Peter.Williams@dsto.defence.gov.au -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{algorithm} -\typeout{Document Style `algorithm' - floating environment} - -\RequirePackage{float} -\RequirePackage{ifthen} -\newcommand{\ALG@within}{nothing} -\newboolean{ALG@within} -\setboolean{ALG@within}{false} -\newcommand{\ALG@floatstyle}{ruled} -\newcommand{\ALG@name}{Algorithm} -\newcommand{\listalgorithmname}{List of \ALG@name s} - -% Declare Options -% first appearance -\DeclareOption{plain}{ - \renewcommand{\ALG@floatstyle}{plain} -} -\DeclareOption{ruled}{ - \renewcommand{\ALG@floatstyle}{ruled} -} -\DeclareOption{boxed}{ - \renewcommand{\ALG@floatstyle}{boxed} -} -% then numbering convention -\DeclareOption{part}{ - \renewcommand{\ALG@within}{part} - \setboolean{ALG@within}{true} -} -\DeclareOption{chapter}{ - \renewcommand{\ALG@within}{chapter} - \setboolean{ALG@within}{true} -} -\DeclareOption{section}{ - \renewcommand{\ALG@within}{section} - \setboolean{ALG@within}{true} -} -\DeclareOption{subsection}{ - \renewcommand{\ALG@within}{subsection} - \setboolean{ALG@within}{true} -} -\DeclareOption{subsubsection}{ - \renewcommand{\ALG@within}{subsubsection} - \setboolean{ALG@within}{true} -} -\DeclareOption{nothing}{ - \renewcommand{\ALG@within}{nothing} - \setboolean{ALG@within}{true} -} -\DeclareOption*{\edef\ALG@name{\CurrentOption}} - -% ALGORITHM -% -\ProcessOptions -\floatstyle{\ALG@floatstyle} -\ifthenelse{\boolean{ALG@within}}{ - \ifthenelse{\equal{\ALG@within}{part}} - {\newfloat{algorithm}{htbp}{loa}[part]}{} - \ifthenelse{\equal{\ALG@within}{chapter}} - {\newfloat{algorithm}{htbp}{loa}[chapter]}{} - \ifthenelse{\equal{\ALG@within}{section}} - {\newfloat{algorithm}{htbp}{loa}[section]}{} - \ifthenelse{\equal{\ALG@within}{subsection}} - {\newfloat{algorithm}{htbp}{loa}[subsection]}{} - \ifthenelse{\equal{\ALG@within}{subsubsection}} - {\newfloat{algorithm}{htbp}{loa}[subsubsection]}{} - \ifthenelse{\equal{\ALG@within}{nothing}} - {\newfloat{algorithm}{htbp}{loa}}{} -}{ - \newfloat{algorithm}{htbp}{loa} -} -\floatname{algorithm}{\ALG@name} - -\newcommand{\listofalgorithms}{\listof{algorithm}{\listalgorithmname}} - diff --git a/tags/pisi-1.1_rc10/doc/algorithmic.sty b/tags/pisi-1.1_rc10/doc/algorithmic.sty deleted file mode 100644 index 68f18aa0..00000000 --- a/tags/pisi-1.1_rc10/doc/algorithmic.sty +++ /dev/null @@ -1,158 +0,0 @@ -% ALGORITHMIC STYLE -- Released 8 APRIL 1996 -% for LaTeX version 2e -% Copyright -- 1994 Peter Williams -% E-mail PeterWilliams@dsto.defence.gov.au -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{algorithmic} -\typeout{Document Style `algorithmic' - environment} -% -\RequirePackage{ifthen} -\RequirePackage{calc} -\newboolean{ALC@noend} -\setboolean{ALC@noend}{false} -\newcounter{ALC@line} -\newcounter{ALC@rem} -\newlength{\ALC@tlm} -% -\DeclareOption{noend}{\setboolean{ALC@noend}{true}} -% -\ProcessOptions -% -% ALGORITHMIC -\newcommand{\algorithmicrequire}{\textbf{Require:}} -\newcommand{\algorithmicensure}{\textbf{Ensure:}} -\newcommand{\algorithmiccomment}[1]{\{#1\}} -\newcommand{\algorithmicend}{\textbf{end}} -\newcommand{\algorithmicif}{\textbf{if}} -\newcommand{\algorithmicthen}{\textbf{then}} -\newcommand{\algorithmicelse}{\textbf{else}} -\newcommand{\algorithmicelsif}{\algorithmicelse\ \algorithmicif} -\newcommand{\algorithmicendif}{\algorithmicend\ \algorithmicif} -\newcommand{\algorithmicfor}{\textbf{for}} -\newcommand{\algorithmicforall}{\textbf{for all}} -\newcommand{\algorithmicdo}{\textbf{do}} -\newcommand{\algorithmicendfor}{\algorithmicend\ \algorithmicfor} -\newcommand{\algorithmicwhile}{\textbf{while}} -\newcommand{\algorithmicendwhile}{\algorithmicend\ \algorithmicwhile} -\newcommand{\algorithmicloop}{\textbf{loop}} -\newcommand{\algorithmicendloop}{\algorithmicend\ \algorithmicloop} -\newcommand{\algorithmicrepeat}{\textbf{repeat}} -\newcommand{\algorithmicuntil}{\textbf{until}} -\def\ALC@item[#1]{% -\if@noparitem \@donoparitem - \else \if@inlabel \indent \par \fi - \ifhmode \unskip\unskip \par \fi - \if@newlist \if@nobreak \@nbitem \else - \addpenalty\@beginparpenalty - \addvspace\@topsep \addvspace{-\parskip}\fi - \else \addpenalty\@itempenalty \addvspace\itemsep - \fi - \global\@inlabeltrue -\fi -\everypar{\global\@minipagefalse\global\@newlistfalse - \if@inlabel\global\@inlabelfalse \hskip -\parindent \box\@labels - \penalty\z@ \fi - \everypar{}}\global\@nobreakfalse -\if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}\fi \fi -\sbox\@tempboxa{\makelabel{#1}}% -\global\setbox\@labels - \hbox{\unhbox\@labels \hskip \itemindent - \hskip -\labelwidth \hskip -\ALC@tlm - \ifdim \wd\@tempboxa >\labelwidth - \box\@tempboxa - \else \hbox to\labelwidth {\unhbox\@tempboxa}\fi - \hskip \ALC@tlm}\ignorespaces} -% -\newenvironment{algorithmic}[1][0]{ -\let\@item\ALC@item - \newcommand{\ALC@lno}{% -\ifthenelse{\equal{\arabic{ALC@rem}}{0}} -{{\footnotesize \arabic{ALC@line}:}}{}% -} -\let\@listii\@listi -\let\@listiii\@listi -\let\@listiv\@listi -\let\@listv\@listi -\let\@listvi\@listi -\let\@listvii\@listi - \newenvironment{ALC@g}{ - \begin{list}{\ALC@lno}{ \itemsep\z@ \itemindent\z@ - \listparindent\z@ \rightmargin\z@ - \topsep\z@ \partopsep\z@ \parskip\z@\parsep\z@ - \leftmargin 1em - \addtolength{\ALC@tlm}{\leftmargin} - } - } - {\end{list}} - \newcommand{\ALC@it}{\addtocounter{ALC@line}{1}\addtocounter{ALC@rem}{1}\ifthenelse{\equal{\arabic{ALC@rem}}{#1}}{\setcounter{ALC@rem}{0}}{}\item} - \newcommand{\ALC@com}[1]{\ifthenelse{\equal{##1}{default}}% -{}{\ \algorithmiccomment{##1}}} - \newcommand{\REQUIRE}{\item[\algorithmicrequire]} - \newcommand{\ENSURE}{\item[\algorithmicensure]} - \newcommand{\STATE}{\ALC@it} - \newcommand{\COMMENT}[1]{\algorithmiccomment{##1}} - \newenvironment{ALC@if}{\begin{ALC@g}}{\end{ALC@g}} - \newenvironment{ALC@for}{\begin{ALC@g}}{\end{ALC@g}} - \newenvironment{ALC@whl}{\begin{ALC@g}}{\end{ALC@g}} - \newenvironment{ALC@loop}{\begin{ALC@g}}{\end{ALC@g}} - \newenvironment{ALC@rpt}{\begin{ALC@g}}{\end{ALC@g}} - \renewcommand{\\}{\@centercr} - \newcommand{\IF}[2][default]{\ALC@it\algorithmicif\ ##2\ \algorithmicthen% -\ALC@com{##1}\begin{ALC@if}} - \newcommand{\ELSE}[1][default]{\end{ALC@if}\ALC@it\algorithmicelse% -\ALC@com{##1}\begin{ALC@if}} - \newcommand{\ELSIF}[2][default]% -{\end{ALC@if}\ALC@it\algorithmicelsif\ ##2\ \algorithmicthen% -\ALC@com{##1}\begin{ALC@if}} - \newcommand{\FOR}[2][default]{\ALC@it\algorithmicfor\ ##2\ \algorithmicdo% -\ALC@com{##1}\begin{ALC@for}} - \newcommand{\FORALL}[2][default]{\ALC@it\algorithmicforall\ ##2\ % -\algorithmicdo% -\ALC@com{##1}\begin{ALC@for}} - \newcommand{\WHILE}[2][default]{\ALC@it\algorithmicwhile\ ##2\ % -\algorithmicdo% -\ALC@com{##1}\begin{ALC@whl}} - \newcommand{\LOOP}[1][default]{\ALC@it\algorithmicloop% -\ALC@com{##1}\begin{ALC@loop}} - \newcommand{\REPEAT}[1][default]{\ALC@it\algorithmicrepeat% -\ALC@com{##1}\begin{ALC@rpt}} - \newcommand{\UNTIL}[1]{\end{ALC@rpt}\ALC@it\algorithmicuntil\ ##1} - \ifthenelse{\boolean{ALC@noend}}{ - \newcommand{\ENDIF}{\end{ALC@if}} - \newcommand{\ENDFOR}{\end{ALC@for}} - \newcommand{\ENDWHILE}{\end{ALC@whl}} - \newcommand{\ENDLOOP}{\end{ALC@loop}} - }{ - \newcommand{\ENDIF}{\end{ALC@if}\ALC@it\algorithmicendif} - \newcommand{\ENDFOR}{\end{ALC@for}\ALC@it\algorithmicendfor} - \newcommand{\ENDWHILE}{\end{ALC@whl}\ALC@it\algorithmicendwhile} - \newcommand{\ENDLOOP}{\end{ALC@loop}\ALC@it\algorithmicendloop} - } - \renewcommand{\@toodeep}{} - \begin{list}{\ALC@lno}{\setcounter{ALC@line}{0}\setcounter{ALC@rem}{0}% - \itemsep\z@ \itemindent\z@ \listparindent\z@% - \partopsep\z@ \parskip\z@ \parsep\z@% - \labelsep 0.5em \topsep 0.2em% -\ifthenelse{\equal{#1}{0}} - {\labelwidth 0.5em } - {\labelwidth 1.2em } -\leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep} - \ALC@tlm\labelsep - } -} -{\end{list}} - - - - - - - - - - - - - - - diff --git a/tags/pisi-1.1_rc10/doc/component-notes.txt b/tags/pisi-1.1_rc10/doc/component-notes.txt deleted file mode 100644 index 10d9be84..00000000 --- a/tags/pisi-1.1_rc10/doc/component-notes.txt +++ /dev/null @@ -1,167 +0,0 @@ -component'larla ilgili notlar - -1. Temel feature'lar (Eray) --------------------- - -Iki yerde component tag'i tanimladik simdiye kadar, bir -source'larda bir de binary'lerde. Binary'de tanimlanan component default -olarak source'daki tanimi inherit ediyor ve tanimlanan component'i override -edebiliyor. - -Bir component temel olarak bir meta-package, icerisinde paketler olan -bir paket. Bir component'in icerisinde bir takim source'lar ve bir takim -binary'ler bulunuyor diye bakabiliriz. Sanirim query'leri bu sekilde yapmak -mumkun olmali. - -$ pisi list-components -$ pisi info system.base - Source packages in system.base: - .... - .... - Binary packages in system.base: - .... - .... - -gibi ozellikler eklemeyi umit ediyorum. - -Source'larin component tag'leri de, gene sadece bir senaryo konusuyorum, -direkt olarak directory structure'indan inherit alinacak. Ayni zamanda o pspec -icin de bir tane component tanimlananack default olarak, ve bu component o -scope'da tanimlanmis olan butun binary package'lari icerecek. - -Ornegin diyelim ki a/b/c/pspec.xml var ve c1 c2 c3 seklinde uc tane paket -tanimliyor. Hic bir component tanimi yapilmadigi zaman otomatik olarak bir -a.b.c component'i olusturulacak, ve bu component'in icerisinde c1 c2 c3 -bulunacak. - -$ pisi info a.b.c - Source packages: - c - oldur beni yarim sen olmazsan biterim - Binary packages: - c1 - bu aksam demlenmemek sonum olur benim - c2 - sincaplarla konustum butun gece - c3 - her gul gordugumde icim kan aglar - -Bu varsayilan davranis, ama bunu degistirmek mumkun olacak. Burada yamuk -gozukebilecek bir sey var, o da tek bir paket oldugunda sanki biraz -redundancy olmasi, o takdirde bir optimizasyon olarak, diyelim ki -a/b/c/pspec.xml'in icerisinde tek bir paket tanimli c1 - -$ pisi info a.b - .... - c1 - dil dil dillerdeyim - -olabilir bu durumda, bu genel agac mantiginda bir sorun yaratmayacaktir. - - -2. Temel tanım (Barış) - -fiziksel aitlik: kdebase'den çıkan kcontrol gibi; grup aitliği: pdf -göstericileri gibi... - - -3. Database XML ayrımı (Barış) - -Component database'i ile component.xml ayrı olmalı. Component database, -pisi'nin pisi-index.xml dosyasını okuyarak oluşturacağı bir veritabanı. Hangi -paketler hangi componentlere dahil, vs. sorguları bu veritabanından -yapılacak. - -Pspec dosyasını hatırlayalım. İçerisinde bir diye bir tag var. -Oluşturulacak paketin hangi component'e ait olduğunu belirtiyor. Bu bilgi -pisi-index.xml dosyasına da koyulmalı. - -4. PL modüllerine benzerlik (Eray) - -component tag'leri Java ya da python'daki gibi -directory yapisindan cikiyor. Yani pisi bir programlama dili olsaydi -component'lar module'ler ya da package'larla es anlamli olacakti. - -5. Mereology ve Eray'ın açıklama çabaları (Eray) - -PartOf iliskisi hakkında su kadarini soylemek yeter: eger a b'nin bir parcasiysa, -a'nin fonksiyonu b'nin fonksiyonunun bir parcasidir. Bu da fiziksel sistemler -icin bir principle of compositionality'nin varligindan hareket eder [*] - -Genel olarak da software engineering ve AI camiasinda module'un tanimi gayet -iyi bilinir. Bir modul icerisindeki bagimliliklar yogundur. Moduller arasindaki -bagimliliklar zayiftir. - -Bu tanim sadece software engineering'de degil, nesneler arasindaki -benzerliklerin incelendigi bir cok disiplinde kullanilan informal bir tanim, -ama tabii ki formule dokulmus bir ton hali var.Sırf bu tanımı taban alarak -yazılmış başarılı kümeleme (clustering) algoritmaları var. - -Modulerlik tanimi verilen *fiziksel* modul ve parcasi olma iliskisiyle -birlesince birlikte install edilip remove edilme yahut ortak bağımlılıklara -sahip olma tanımlarına götürür. - -Bu tanımı analiz edebilmek için parcasi olma iliskisininin anlamini -korumamiz yeterli. Temel olarak - -  kol insanin parcasidir - -iliskisi burada yer aliyor.  Eger - -  a partof b - -turu iliskilerde a paket ya da component, ve b component ise, a ve b'nin -iliskisinin kol ve insan iliskisi gibi olmasini bekleriz. Eger bu parca-butun -iliskisini ihlal ediyorsa o zaman muhtemelen yanlis bir iliski bulunmus -demektir. - -Bunun turlu sonuclari da onem sirasina gore soyle dizilebilir: - -1. Fonksiyonlarin bolunebilmesi prensibinden: (basit bir sonuç) -   a's function is part-of b's function - - orneğin kolun fonksiyonu insanın total fonksiyonunun bir parçasıdır. - -paket ornegi: pisi'nin fonksiyonu olan paket yükleme/çıkarma system.base'in fonksiyonunun, yani temel pardus sisteminin fonksiyonunun bir parçasıdır. - -2. Karmasik sistemlerde birbirine dayanan ufak parcalarin kararli yapilar -meydana getirmesi prensibinden: (evrimsel sonuç) - -   if a is a part-of c, and b is a part-of c, then it follows that a and b -may: -     a. have many interdependencies -     b. share in their origins -  (which are about the same thing) - -2b. sonucunun bizim durumumuza uygulanması, source code'un aynı kaynaktan -çıkması, birlikte inşa edilmeleri gibi şartları getirir. Bunun oldukça -olasi, en azindan insa metodlarinin ve kaynaklarının birbirine benzemesini -bekleriz. Yalniz, 2.a'daki bagimliliklar sadece insa ile degil ayni zamanda -calisma ile de alakalidir. Kaynakları farklı parçaların birbirine bağımlı -hale gelebilecegini unutmamak gerekir. - -Fedora'nin yaklasiminin hos tarafi, boyle teknik ayrintilara girmeden "package -group" mantigini kullanmasiydi, ama bizim belli bir anlami olan parca-butun -iliskisini korumamiz daha mantikli bir yazilim ontology'si ortaya -cikaracaktir. Onlarin yaklasimi ise "anything goes", grup ile kategori'nin -temel bir farki yok cunku, herhangi bir bakis acisi olabilir "grup". - - -6. Modulleri test etmek (!!) (Eray) ------------------------------------- - -PISI'deki seçilen implementation detaylari bir tanima cok fazla commitment -yapmiyor, implementation'ın getirdiği tek şey paketleri bir ağaca koymak. -Component'ların seçiminin ne kadar kaliteli olduğunu belirleyemiyor. -Paketlerin ve componentlarin secimi yapiyor, ki kritik olan o. -Yalnız modulerlik tanimindan ve part-of iliskisinin -  if a is part of b, and b is part of c, then a is part of c. -  if a is part of b, and b is not part of c, then a is not part of c. -gibi sonuclari getirmesinden hareketle (ki bunlar klasik computational -ontology) kismen test edebilecegimiz bir sekil aliyor ornegin bagimlilik -graph'ini cluster ederek, ya da her modul icin bir modulerlik sayisi -hesaplayarak. Daha az formal olarak da bu sonuçları kafamızda yürüterek -yaptığımız componentların ne kadar akla yatkın olduğunu bulabiliriz. - - -7. Cagların frugalware önerisi ------------------------------- - -http://ftp.frugalware.org/pub/frugalware/frugalware-current/source/ -adresindeki yerleşimin hem source hem de binary depo için uygulanmasını ve -kategori, componentların da bundan çıkartılmasını öneriyorum. diff --git a/tags/pisi-1.1_rc10/doc/dependency.pdf b/tags/pisi-1.1_rc10/doc/dependency.pdf deleted file mode 100644 index 7f9dd07f9d2a463bf4aec39ea5ac5c5eaab449a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119423 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

3X4Cpxx;gUIDJ0`hr`HD#A$P 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≀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≫MEV_B%@J4BOTZ8Jef;n#NtE-^9sK z$8oWh7DBz^$s@vMJi4GCuw(H*Z_lE{MNhZ9b87Y0Q&UnrwikW;!RM=s5HW7&!I%05 z)vG<%w^y*^hKlx*8eAFz3*eA?ACgHG9)S>!@cw7SPgWftQ$;BktbCvES#|$R5L+14 z#M>GCZ>`^@$ba8}(}QivIyqX|TK`GsapUE>C%t&MnS)%pe&PHcf#E))!+nCelm3>X zVda10fGjLvG`XK#EiMZWS63Ll?VbSm3-n(5-(el@sW5-1by)G=pjHk}Fm~17rrk^b z8|9x}B!>;oIRXj1U`?yy7-@P?!%t`opk;aj;oV3jJWrY!MfM@w?+T#SJZz% zx;N(cA^-oQbo>VtcPA%@{~rp?-(7;0zW)al7&*@x?8YTy>ka`qyZv87#5{eX3s(cv zg=LO^fC<1RhnB5{y9aDcxOljKOMEao+D|}=Cj#u>dZr%mf6-xoY5g+u_XmW3&YI^w@c)%2_HUHmZw2=c z6Mv_eB$&;=JzD%*^Y@F-{jK8fwEG(VKi@dCRFUtAXmEJ2zd{(>w>A?tr{Mk%3c*{| diff --git a/tags/pisi-1.1_rc10/doc/package_versions.pdf b/tags/pisi-1.1_rc10/doc/package_versions.pdf deleted file mode 100644 index 09228904c19bf06a5944ab1ece161d251ea6dd4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102463 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

nzVU3^#+3QhQbz#8#0oK8w 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 OLUYN>uiI$E_5T2T{V?4C diff --git a/tags/pisi-1.1_rc10/doc/package_versions.tex b/tags/pisi-1.1_rc10/doc/package_versions.tex deleted file mode 100644 index 620e10a1..00000000 --- a/tags/pisi-1.1_rc10/doc/package_versions.tex +++ /dev/null @@ -1,187 +0,0 @@ -\documentclass[a4paper,11pt]{article} - -\title{P\.IS\.I Packages: Version Policy v0.2} -\date{\today} -\author{Eray \"Ozkural and T. Bar\i{}\c s Metin} - - -\begin{document} -\maketitle - -\section*{Revision History} -\begin{itemize} -\item v0.1: Bar\i\c s Metin wrote the first version preparing the outline, -detailed Source Version Section, and started the Section on Release Number. -\item v0.2: Eray \"Ozkural wrote a detailed introduction, added - explanations of release and build numbers, reorganized a bit. -\end{itemize} - -\section{Introduction} - -This document explains the \emph{version policy} that applies to -P\.IS\.I packages. Classically, the issue of distinguishing source and -binary distributions unambiguously has not received a rigorous -treatment in the context of LINUX distributions. We have identified -several shortcomings of the usual practices of extending the original -version with suffixes and prefixes, colorfully illustrated in the -following common problems. - -\begin{description} - -\item[The problem of future downgrades] -The distribution chooses to use a previous version of the package in -the next release. There is no way to indicate this, so ad-hoc -solutions such as version prefixes are used. It is -impossible to denote a future dependency that requires at least this -distribution source release in this case, either. - -\item[The problem of redundant distributions] -A trivial patch has been applied to the source. While few binary -packages have been affected by this change, all binary packages -built from the source are redistributed. - -\item[The problem of underdetermined rebuilds] -There have been rapid changes in the system, and although no -changes have been made to the package source, a new binary -distribution must be prepared. - -\end{description} - -We have devised a slightly new approach in order to alleviate these -problems. Our solution consists of encoding the history of source and -binary package developments in separate version strings we call release and -build numbers. - -Since the source version is usually used by the users and developers -to identify software, we retain the notion of a source version in -P\.IS\.I as a convenience. - -In the following sections, we explain the components of our -versioning scheme. - -\subsection{Source Version} - -Source version is the version number provided by the -upstream maintainer of the source archive used in package. It must -always be the same as the upstream version used. - -\textbf{Example}: If the upstream archive name is -\emph{bash-3.0.tar.gz} the version number of the package is \emph{3.0} - -\subsubsection{Version Suffixes} - -There is a pre-defined list of suffixes a package version can -take. - -\begin{itemize} - \item \textbf{alpha} Source/Package is in alpha state - \item \textbf{beta} Source/Package is in beta state - \item \textbf{pre} Source/Pacgage passed the beta state but stable - version is not relased yet. - \item \textbf{rc} Source/Package is a release-candidate. - \item \textbf{m} Source/Package is a milestone before stable version. - \item \textbf{p} Source/Package is released and some patches are - applied after the release. This is the patch level. -\end{itemize} - -The suffix should be written after the special separator -character \textbf{\_}. And there must allways be a number after a -suffix. \textbf{Example}: packagename-1.0\_beta1 - -The basic order of the priorities for suffixes is:\newline -\emph{p $>$ (no suffix) $>$ m $>$ rc $>$ pre $>$ beta $>$ alpha}. - -The scope of a source version string is global in the literal -sense. It shall not vary from repository to repository. - -The support for these special suffixes as well as usual alphanumeric -version string ordering has been implemented in P\.IS\.I. - -\section{Identifying Package Sources} - -A P\.IS\.I source has three identity elements written under -\texttt{SOURCE} tag: name, source version, and source release number. -We usually say just version and release number/release instead of -source version and source release number, respectively. Name is available in -the \texttt{} tag. Version and release are available in the last -\texttt{} element of \texttt{} tag of a \texttt{PSPEC}. - -The name of a source package is constant throughout its revision -history. The version is the original version, given by its -programmers. Release is a positive integer. Name and release -is sufficient to uniquely identify a particular PISI source revision. -That is, version and release are independent. - -\subsection{Release Number} - -Release number is the number of the changes that are made to the -package source since the initial version in the distribution source. A -change can be a patch applied to the source archive, modification in -the actions.py, pspec.xml or any file in the source package -directory. This change is indicated in \texttt{} tags manually -by the package maintainer. - -The initial release of a package is by default \texttt{1}. The release -number always increments by $1$ in each revision in the -\texttt{History}, even the slightest ones, but it never decrements. - -The scope of the release number is a given distribution, regardless of -its version, e.g. Pardus. - -In the future, PISI will have strict checks for release numbers. - -\subsection{Dependency Specifications} - -We allow a package to use both source version and release to identify -a particular version or a range of package versions. - -\section{Identifying Binary packages} - -A PISI binary package is produced from a PISI source package. It has a -name that is constant throughout the history of the source package, -and it inherits the source version and release number from the source -package. However, a binary package has in addition a binary build -number. Shortly, build number or just build. For each of the -architecture targets, e.g. particular binaries, it also has an -architecture tag. - -A binary package is uniquely identified by its name, build number, and -architecture regardless of the source version. - -\section{Build Number} - -Similarly to source release number, binary build number is the number -of changes that are made to a binary package. By change, we mean any -bit change. The existence of a change is tested by comparing the -cryptographic checksums in files.xml with those of the previous build, and the -build number is automatically determined by the P\.IS\.I build system. -The build number starts from $1$ as in release number, and increments -by one with each binary change. - -The user never interferes with the build number himself. However, if -the user fails to provide the previous build, then a package without -a build number is built. A package without a build number is evaluated -on the basis of release number, which is guaranteed to exist. - -The scope of a build number is a given distribution build environment -for a particular architecture, which may vary from repository to -repository. Therefore, it is not used in dependency -specifications. However, the system does assume that a build of a -given package and architecture is unique in a given repository. - -\section{Package File Names} - -A P\.IS\.I binary package file name contains all the components relevant -to its identification, separated by dashes: -\begin{verbatim} - ---.pisi -\end{verbatim} - -\section{Future Work} - -In the future, it may be necessary to extend the notion of release -number and build number to support branches and forks of a -distribution. A proposal was to have CVS-like branching, but it -was dismissed as unnecessary. - -\end{document} diff --git a/tags/pisi-1.1_rc10/doc/pisi-db.xmi b/tags/pisi-1.1_rc10/doc/pisi-db.xmi deleted file mode 100644 index 6966ed90..00000000 --- a/tags/pisi-1.1_rc10/doc/pisi-db.xmi +++ /dev/null @@ -1,532 +0,0 @@ - - - - - umbrello uml modeller http://uml.sf.net - 1.5.4 - UnicodeUTF8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tags/pisi-1.1_rc10/doc/prettyref.sty b/tags/pisi-1.1_rc10/doc/prettyref.sty deleted file mode 100644 index 67940f3b..00000000 --- a/tags/pisi-1.1_rc10/doc/prettyref.sty +++ /dev/null @@ -1,37 +0,0 @@ -%% -%% This is file `prettyref.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% prettyref.dtx (with options: `style') -%% -%% Copyright (c) 1995 Kevin Ruland -%% -%% -%% prettyref v3.0 -%% -%% Copyright 1995,1998. by Kevin Ruland kevin@rodin.wustl.edu -%% -\ProvidesPackage{prettyref}[1998/07/09 v3.0] -\def\newrefformat#1#2{% - \@namedef{pr@#1}##1{#2}} -\newrefformat{eq}{\textup{(\ref{#1})}} -\newrefformat{lem}{Lemma \ref{#1}} -\newrefformat{thm}{Theorem \ref{#1}} -\newrefformat{cha}{Chapter \ref{#1}} -\newrefformat{sec}{Section \ref{#1}} -\newrefformat{tab}{Table \ref{#1} on page \pageref{#1}} -\newrefformat{fig}{Figure \ref{#1} on page \pageref{#1}} -\def\prettyref#1{\@prettyref#1:} -\def\@prettyref#1:#2:{% - \expandafter\ifx\csname pr@#1\endcsname\relax% - \PackageWarning{prettyref}{Reference format #1\space undefined}% - \ref{#1:#2}% - \else% - \csname pr@#1\endcsname{#1:#2}% - \fi% -} -\endinput -%% -%% End of file `prettyref.sty'. diff --git a/tags/pisi-1.1_rc10/pisi-cli b/tags/pisi-1.1_rc10/pisi-cli deleted file mode 100755 index cd316a4a..00000000 --- a/tags/pisi-1.1_rc10/pisi-cli +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import sys -import locale -import traceback -import exceptions -import signal -import bsddb3.db as db - -import pisi.ui -import pisi.context as ctx -import pisi.cli.pisicli as pisicli - -import gettext -gettext.bindtextdomain('pisi', "/usr/share/locale") -gettext.textdomain('pisi') -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -def sig_handler(sig, frame): - if sig == signal.SIGTERM: - exit() - -def exit(): - try: - pisi.api.finalize() - except KeyboardInterrupt: # raised pending interrupt - pass - sys.exit(1) - -def handle_exception(exception, value, tb): - signal.signal(signal.SIGINT, signal.SIG_IGN) # disable further interrupts - ui = pisi.cli.CLI() # make a temporary UI - show_traceback = False - if exception == exceptions.KeyboardInterrupt: - ui.error(_("Keyboard Interrupt: Exiting...")) - exit() - elif isinstance(value, pisi.Error): - ui.error(_("Program Terminated.")) - show_traceback = ctx.get_option('debug') - elif isinstance(value, db.DBRunRecoveryError): - ui.error(_("""A database operation has been aborted. You should run pisi -again for normal DB recovery procedure. Make sure you have free disk space. -You have to run rebuild-db only when there is file corruption and database upgrades.""")) - elif isinstance(value, pisi.Exception): - show_traceback = True - ui.error(_("""Unhandled internal exception. -Please file a bug report. (http://bugs.uludag.org.tr)""")) - else: - # For any other exception (possibly Python exceptions) show - # the traceback! - show_traceback = ctx.get_option('debug') - ui.error(_("System Error. Program Terminated.")) - - if ctx.get_option('debug'): - ui.error(u"%s: %s" % (exception, value)) - else: - ui.error(unicode(value)) - - ui.info(_("Please use 'pisi help' for general help.")) - - if show_traceback: - ui.info(_("Traceback:")) - traceback.print_tb(tb) - else: - if not exception is pisicli.Error: - ui.info(_("Use --debug to see a traceback.")) - - exit() - -if __name__ == "__main__": - - sys.excepthook = handle_exception - - signal.signal(signal.SIGTERM, sig_handler) - - locale.setlocale(locale.LC_ALL, '') - cli = pisicli.PisiCLI() - cli.run_command() diff --git a/tags/pisi-1.1_rc10/pisi-cli2.5 b/tags/pisi-1.1_rc10/pisi-cli2.5 deleted file mode 100755 index caa26255..00000000 --- a/tags/pisi-1.1_rc10/pisi-cli2.5 +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/python2.5 -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import sys -import locale -import traceback -import exceptions -import signal -import bsddb3.db as db - -import pisi.ui -import pisi.context as ctx -import pisi.cli.pisicli as pisicli - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -def exit(): - pisi.api.finalize() - sys.exit(1) - -def handle_exception(exception, value, tb): - signal.signal(signal.SIGINT, signal.SIG_IGN) # disable further interrupts - ui = pisi.cli.CLI() # make a temporary UI - show_traceback = False - if exception == exceptions.KeyboardInterrupt: - ui.error(_("Keyboard Interrupt: Exiting...")) - exit() - elif isinstance(value, pisi.Error): - ui.error(_("Program Terminated.")) - show_traceback = ctx.get_option('debug') - elif isinstance(value, db.DBRunRecoveryError): - ui.error(_("""A database operation has been aborted. You should run pisi -again for normal DB recovery procedure. Make sure you have free disk space. -You have to run rebuild-db only when there is file corruption and database upgrades.""")) - elif isinstance(value, pisi.Exception): - show_traceback = True - ui.error(_("""Unhandled internal exception. -Please file a bug report. (http://bugs.uludag.org.tr)""")) - else: - # For any other exception (possibly Python exceptions) show - # the traceback! - show_traceback = ctx.get_option('debug') - ui.error(_("System Error. Program Terminated.")) - - if ctx.get_option('debug'): - ui.error(u"%s: %s" % (exception, value)) - else: - ui.error(unicode(value)) - - ui.info(_("Please use 'pisi help' for general help.")) - - if show_traceback: - ui.info(_("Traceback:")) - traceback.print_tb(tb) - else: - if not exception is pisicli.Error: - ui.info(_("Use --debug to see a traceback.")) - - exit() - -if __name__ == "__main__": - - sys.excepthook = handle_exception - - locale.setlocale(locale.LC_ALL, '') - cli = pisicli.PisiCLI() - cli.run_command() diff --git a/tags/pisi-1.1_rc10/pisi-spec.dtd b/tags/pisi-1.1_rc10/pisi-spec.dtd deleted file mode 100644 index 95bef334..00000000 --- a/tags/pisi-1.1_rc10/pisi-spec.dtd +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tags/pisi-1.1_rc10/pisi/__init__.py b/tags/pisi-1.1_rc10/pisi/__init__.py deleted file mode 100644 index 95d9ef74..00000000 --- a/tags/pisi-1.1_rc10/pisi/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -# PiSi version - -__version__ = "1.1_rc10" - -__dbversion__ = "1.1_rc7" -__filesdbversion__ = "1.0.5" # yes, this is the real bottleneck - -__all__ = [ 'api', 'config', 'packagedb', 'installdb', 'search' ] - -# FIXME: Exception shadows builtin Exception. This is no good. -class Exception(Exception): - """Class of exceptions that must be caught and handled within PiSi""" - def __str__(self): - s = u'' - for x in self.args: - if s != '': - s += '\n' - s += unicode(x) - return s - -class Error(Exception): - """Class of exceptions that lead to program termination""" - pass - -import pisi.api - -# FIXME: can't do this due to name clashes in config and other singletons booo -#pisi.api import * diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/__init__.py b/tags/pisi-1.1_rc10/pisi/actionsapi/__init__.py deleted file mode 100644 index eeba55a7..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import pisi - -class Error(pisi.Error): - pass - -class Exception(pisi.Exception): - pass - -import pisi.context as ctx - -def error(msg): - if ctx.config.get_option('ignore_action_errors'): - ctx.ui.error(msg) - else: - raise Error(msg) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/autotools.py b/tags/pisi-1.1_rc10/pisi/actionsapi/autotools.py deleted file mode 100644 index 91586237..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/autotools.py +++ /dev/null @@ -1,163 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Standard Python Modules -import os - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get as get -from pisi.actionsapi.shelltools import system -from pisi.actionsapi.shelltools import can_access_file -from pisi.actionsapi.shelltools import unlink -from pisi.actionsapi.libtools import gnuconfig_update - -class ConfigureError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - if can_access_file('config.log'): - ctx.ui.error(_('Please attach the config.log to your bug report:\n%s/config.log') % os.getcwd()) - -class MakeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class InstallError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class RunTimeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def configure(parameters = ''): - '''configure source with given parameters = "--with-nls --with-libusb --with-something-usefull"''' - if can_access_file('configure'): - gnuconfig_update() - - args = './configure \ - --prefix=/%s \ - --host=%s \ - --mandir=/%s \ - --infodir=/%s \ - --datadir=/%s \ - --sysconfdir=/%s \ - --localstatedir=/%s \ - %s' % (get.defaultprefixDIR(), \ - get.HOST(), get.manDIR(), \ - get.infoDIR(), get.dataDIR(), \ - get.confDIR(), get.localstateDIR(), parameters) - - if system(args): - raise ConfigureError(_('Configure failed.')) - else: - raise ConfigureError(_('No configure script found.')) - -def rawConfigure(parameters = ''): - '''configure source with given parameters = "--prefix=/usr --libdir=/usr/lib --with-nls"''' - if can_access_file('configure'): - gnuconfig_update() - - if system('./configure %s' % parameters): - raise ConfigureError(_('Configure failed.')) - else: - raise ConfigureError(_('No configure script found.')) - -def compile(parameters = ''): - #FIXME: Only one package uses this until now, hmmm - system('%s %s %s' % (get.CC(), get.CFLAGS(), parameters)) - -def make(parameters = ''): - '''make source with given parameters = "all" || "doc" etc.''' - if system('make %s %s' % (get.makeJOBS(), parameters)): - raise MakeError(_('Make failed.')) - -def fixInfoDir(): - infoDir = "%s/usr/share/info/dir" % get.installDIR() - if can_access_file(infoDir): - unlink(infoDir) - -def install(parameters = '', argument = 'install'): - '''install source into install directory with given parameters''' - if can_access_file('makefile') or can_access_file('Makefile') or can_access_file('GNUmakefile'): - args = 'make prefix=%(prefix)s/%(defaultprefix)s \ - datadir=%(prefix)s/%(data)s \ - infodir=%(prefix)s/%(info)s \ - localstatedir=%(prefix)s/%(localstate)s \ - mandir=%(prefix)s/%(man)s \ - sysconfdir=%(prefix)s/%(conf)s \ - %(parameters)s \ - %(argument)s' % {'prefix': get.installDIR(), - 'defaultprefix': get.defaultprefixDIR(), - 'man': get.manDIR(), - 'info': get.infoDIR(), - 'localstate': get.localstateDIR(), - 'conf': get.confDIR(), - 'data': get.dataDIR(), - 'parameters': parameters, - 'argument':argument} - - if system(args): - raise InstallError(_('Install failed.')) - else: - raise InstallError(_('No Makefile found.')) - - fixInfoDir() - -def rawInstall(parameters = '', argument = 'install'): - '''install source into install directory with given parameters = PREFIX=%s % get.installDIR()''' - if can_access_file('makefile') or can_access_file('Makefile') or can_access_file('GNUmakefile'): - if system('make %s %s' % (parameters, argument)): - raise InstallError(_('Install failed.')) - else: - raise InstallError(_('No Makefile found.')) - - fixInfoDir() - -def aclocal(parameters = ''): - '''generates an aclocal.m4 based on the contents of configure.in.''' - if system('aclocal %s' % parameters): - raise RunTimeError(_('Running aclocal failed.')) - -def autoconf(parameters = ''): - '''generates a configure script''' - if system('autoconf %s' % parameters): - raise RunTimeError(_('Running autoconf failed.')) - -def autoreconf(parameters = ''): - '''re-generates a configure script''' - if system('autoreconf %s' % parameters): - raise RunTimeError(_('Running autoreconf failed.')) - -def automake(parameters = ''): - '''generates a makefile''' - if system('automake %s' % parameters): - raise RunTimeError(_('Running automake failed.')) - -def autoheader(parameters = ''): - '''generates templates for configure''' - if system('autoheader %s' % parameters): - raise RunTimeError(_('Running autoheader failed.')) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/coreutils.py b/tags/pisi-1.1_rc10/pisi/actionsapi/coreutils.py deleted file mode 100644 index 2df5f46d..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/coreutils.py +++ /dev/null @@ -1,80 +0,0 @@ -#-*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Standard Python Modules -import re -import sys -from itertools import izip -from itertools import imap -from itertools import count -from itertools import ifilter -from itertools import ifilterfalse - -# ActionsAPI -import pisi.actionsapi - -def cat(filename): - return file(filename).xreadlines() - -class grep: - '''keep only lines that match the regexp''' - def __init__(self, pat, flags = 0): - self.fun = re.compile(pat, flags).match - def __ror__(self, input): - return ifilter(self.fun, input) - -class tr: - '''apply arbitrary transform to each sequence element''' - def __init__(self, transform): - self.tr = transform - def __ror__(self, input): - return imap(self.tr, input) - -class printto: - '''print sequence elements one per line''' - def __init__(self, out = sys.stdout): - self.out = out - def __ror__(self,input): - for line in input: - print >> self.out, line - -printlines = printto(sys.stdout) - -class terminator: - def __init__(self,method): - self.process = method - def __ror__(self,input): - return self.process(input) - -aslist = terminator(list) -asdict = terminator(dict) -astuple = terminator(tuple) -join = terminator(''.join) -enum = terminator(enumerate) - -class sort: - def __ror__(self,input): - ll = list(input) - ll.sort() - return ll -sort = sort() - -class uniq: - def __ror__(self,input): - for i in input: - try: - if i == prev: - continue - except NameError: - pass - prev = i - yield i -uniq = uniq() diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/get.py b/tags/pisi-1.1_rc10/pisi/actionsapi/get.py deleted file mode 100644 index 6b998271..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/get.py +++ /dev/null @@ -1,196 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Standart Python Modules -import os -import sys - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# PiSi Modules -import pisi.actionsapi -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi.variables - -class BinutilsError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -# Globals -env = pisi.actionsapi.variables.glb.env -dirs = pisi.actionsapi.variables.glb.dirs - -def curDIR(): - '''returns current work directory's path''' - return os.getcwd() - -def curKERNEL(): - '''returns currently running kernel's version''' - return os.uname()[2] - -def curPYTHON(): - ''' returns currently used python's version''' - (a, b, c, x, y) = sys.version_info - return 'python%s.%s' % (a, b) - -def curPERL(): - ''' returns currently used perl's version''' - return os.path.realpath("/usr/bin/perl").split("perl")[1] - -def ENV(environ): - '''returns any given environ variable''' - try: - return os.environ[environ]; - except KeyError: - return None - -# PİSİ Related Functions - -def pkgDIR(): - '''returns the path of binary packages''' - '''Default: /var/cache/pisi/packages''' - return env.pkg_dir - -def workDIR(): - return env.work_dir - -def installDIR(): - '''returns the path of binary packages''' - return env.install_dir - -# PSPEC Related Functions - -def srcNAME(): - return env.src_name - -def srcVERSION(): - return env.src_version - -def srcRELEASE(): - return env.src_release - -def srcTAG(): - return '%s-%s-%s' % (env.src_name, env.src_version, env.src_release) - -def srcDIR(): - return '%s-%s' % (env.src_name, env.src_version) - -# Build Related Functions - -def HOST(): - return env.host - -def CHOST(): - # FIXME: Currently it behave same as HOST, - # but will be used for cross-compiling when PİSİ ready... - return env.host - -def CFLAGS(): - return env.cflags - -def CXXFLAGS(): - return env.cxxflags - -def LDFLAGS(): - return env.ldflags - -def makeJOBS(): - return env.jobs - -# Directory Related Functions - -def docDIR(): - return dirs.doc - -def sbinDIR(): - return dirs.sbin - -def infoDIR(): - return dirs.info - -def manDIR(): - return dirs.man - -def dataDIR(): - return dirs.data - -def confDIR(): - return dirs.conf - -def localstateDIR(): - return dirs.localstate - -def defaultprefixDIR(): - return dirs.defaultprefix - -def kdeDIR(): - return dirs.kde - -def qtDIR(): - return dirs.qt - -def qtLIBDIR(): - return '%s/lib/' % qtDIR() - -# Binutils Variables - -def existBinary(bin): - # determine if path has binary - path = os.environ['PATH'].split(':') - for directory in path: - if os.path.exists(os.path.join(directory, bin)): - return True - return False - -def getBinutilsInfo(util): - cross_build_name = '%s-%s' % (HOST(), util) - if not existBinary(cross_build_name): - if not existBinary(util): - raise BinutilsError(_('Util %s cannot be found') % util) - else: - ctx.ui.debug(_('Warning: %s does not exist, using plain name %s') \ - % (cross_build_name, util)) - return util - else: - return cross_build_name - -def AR(): - return getBinutilsInfo('ar') - -def AS(): - return getBinutilsInfo('as') - -def CC(): - return getBinutilsInfo('gcc') - -def CXX(): - return getBinutilsInfo('g++') - -def LD(): - return getBinutilsInfo('ld') - -def NM(): - return getBinutilsInfo('nm') - -def RANLIB(): - return getBinutilsInfo('ranlib') - -def F77(): - return getBinutilsInfo('g77') - -def GCJ(): - return getBinutilsInfo('gcj') diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/kde.py b/tags/pisi-1.1_rc10/pisi/actionsapi/kde.py deleted file mode 100644 index 2ef46278..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/kde.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# standard python modules -import os - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get as get -from pisi.actionsapi.shelltools import system -from pisi.actionsapi.shelltools import can_access_file - -class ConfigureError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - if can_access_file('config.log'): - ctx.ui.error(_('\n!!! Please attach the config.log to your bug report:\n%s/config.log') % os.getcwd()) - -class MakeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class InstallError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def configure(parameters = ''): - ''' parameters = '--with-nls --with-libusb --with-something-usefull ''' - if can_access_file('configure'): - args = './configure \ - --prefix=%s \ - --host=%s \ - --with-x \ - --enable-mitshm \ - --with-xinerama \ - --with-qt-dir=%s \ - --enable-mt \ - --with-qt-libraries=%s \ - --disable-dependency-tracking \ - --disable-debug \ - %s' % (get.kdeDIR(), get.HOST(), get.qtDIR(), get.qtLIBDIR(), parameters) - - if system(args): - raise ConfigureError(_('Configure failed.')) - else: - raise ConfigureError(_('No configure script found.')) - -def make(parameters = ''): - '''make source with given parameters = "all" || "doc" etc.''' - if system('make %s %s' % (get.makeJOBS(), parameters)): - raise MakeError(_('Make failed.')) - -def install(parameters = 'install'): - if can_access_file('Makefile'): - args = 'make DESTDIR=%s destdir=%s %s' % (get.installDIR(), get.installDIR(), parameters) - - if system(args): - raise InstallError(_('Install failed.')) - else: - raise InstallError(_('No Makefile found.')) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/libtools.py b/tags/pisi-1.1_rc10/pisi/actionsapi/libtools.py deleted file mode 100644 index ae582686..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/libtools.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Standard Python Modules -import os - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi-Core Modules -import pisi.context as ctx -from pisi.util import join_path - -# ActionsAPI Modules -import pisi.actionsapi -from pisi.actionsapi.shelltools import * -import pisi.actionsapi.get as get - -class RunTimeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def preplib(sourceDirectory = '/usr/lib'): - sourceDirectory = join_path(get.installDIR(), sourceDirectory) - if can_access_directory(sourceDirectory): - if system('/sbin/ldconfig -n -N %s' % sourceDirectory): - raise RunTimeError(_('Running ldconfig failed.')) - -def gnuconfig_update(): - ''' copy newest config.* onto source\'s ''' - for root, dirs, files in os.walk(os.getcwd()): - for fileName in files: - if fileName in ['config.sub', 'config.guess']: - targetFile = os.path.join(root, fileName) - if os.path.islink(targetFile): - unlink(targetFile) - copy('/usr/share/gnuconfig/%s' % fileName, join_path(root, fileName)) - ctx.ui.info(_('GNU Config Update Finished.')) - -def libtoolize(parameters = ''): - if system('/usr/bin/libtoolize %s' % parameters): - raise RunTimeError(_('Running libtoolize failed.')) - -def gen_usr_ldscript(dynamicLib): - - makedirs('%s/usr/lib' % get.installDIR()) - - destinationFile = open('%s/usr/lib/%s' % (get.installDIR(), dynamicLib), 'w') - content = ''' -/* GNU ld script - Since Pardus has critical dynamic libraries - in /lib, and the static versions in /usr/lib, - we need to have a "fake" dynamic lib in /usr/lib, - otherwise we run into linking problems. -*/ -GROUP ( /lib/%s ) -''' % dynamicLib - - destinationFile.write(content) - destinationFile.close() - chmod('%s/usr/lib/%s' % (get.installDIR(), dynamicLib)) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/perlmodules.py b/tags/pisi-1.1_rc10/pisi/actionsapi/perlmodules.py deleted file mode 100644 index 0937b36d..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/perlmodules.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# standard python modules -import os -import glob - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get as get -from pisi.actionsapi.shelltools import system -from pisi.actionsapi.shelltools import can_access_file -from pisi.actionsapi.shelltools import export -from pisi.actionsapi.shelltools import unlink - -class ConfigureError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class MakeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class InstallError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def configure(parameters = ''): - '''configure source with given parameters.''' - export('PERL_MM_USE_DEFAULT', '1') - if can_access_file('Build.PL'): - if system('perl Build.PL installdirs=vendor destdir=%s' % get.installDIR()): - raise ConfigureError, _('Configure failed.') - else: - if system('perl Makefile.PL %s PREFIX=/usr INSTALLDIRS=vendor DESTDIR=%s' % (parameters, get.installDIR())): - raise ConfigureError, _('Configure failed.') - -def make(parameters = ''): - '''make source with given parameters.''' - if can_access_file('Makefile'): - if system('make %s' % parameters): - raise MakeError, _('Make failed.') - else: - if system('perl Build build'): - raise MakeError, _('perl build failed.') - -def install(parameters = 'install'): - '''install source with given parameters.''' - if can_access_file('Makefile'): - if system('make %s' % parameters): - raise InstallError, _('Make failed.') - else: - if system('perl Build install'): - raise MakeError, _('perl install failed.') - - fixLocalPod() - -def fixLocalPod(): - podFiles = glob.glob("%s/usr/lib/*/*/*/perllocal.pod" % get.installDIR()) - - for podFile in podFiles: - if can_access_file(podFile): - unlink(podFile) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/pisitools.py b/tags/pisi-1.1_rc10/pisi/actionsapi/pisitools.py deleted file mode 100644 index 5a71445d..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/pisitools.py +++ /dev/null @@ -1,234 +0,0 @@ -#-*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -'''supports globs in sourceFile arguments''' - - -# Standart Python Modules -import os -import glob -import sys -import fileinput -import re - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx -from pisi.util import join_path - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get as get -from pisi.actionsapi.pisitoolsfunctions import * -from pisi.actionsapi.shelltools import * - -from pisi.actionsapi import error - -def dobin(sourceFile, destinationDirectory = '/usr/bin'): - '''insert a executable file into /bin or /usr/bin''' - ''' example call: pisitools.dobin("bin/xloadimage", "/bin", "xload") ''' - executable_insinto(join_path(get.installDIR(), destinationDirectory), sourceFile) - -def dodir(destinationDirectory): - '''creates a directory tree''' - makedirs(join_path(get.installDIR(), destinationDirectory)) - -def dodoc(*sourceFiles): - '''inserts the files in the list of files into /usr/share/doc/PACKAGE''' - readable_insinto(join_path(get.installDIR(), join_path('/usr/share/doc', get.srcTAG())), *sourceFiles) - -def doexe(sourceFile, destinationDirectory): - '''insert a executable file into destination directory''' - - ''' example call: pisitools.doexe("kde-3.4.sh", "/etc/X11/Sessions")''' - executable_insinto(join_path(get.installDIR(), destinationDirectory), sourceFile) - -def dohtml(*sourceFiles): - '''inserts the files in the list of files into /usr/share/doc/PACKAGE/html''' - - ''' example call: pisitools.dohtml("doc/doxygen/html/*")''' - destionationDirectory = join_path(get.installDIR(), 'usr/share/doc' ,get.srcTAG(), 'html') - - if not can_access_directory(destionationDirectory): - makedirs(destionationDirectory) - - allowed_extensions = ['.png', '.gif', '.html', '.htm', '.jpg', '.css', '.js'] - disallowed_directories = ['CVS'] - - for sourceFile in sourceFiles: - for source in glob.glob(sourceFile): - if os.path.isfile(source) and os.path.splitext(source)[1] in allowed_extensions: - system('install -m0644 "%s" %s' % (source, destionationDirectory)) - if os.path.isdir(source) and os.path.basename(source) not in disallowed_directories: - for root, dirs, files in os.walk(source): - for source in files: - if os.path.splitext(source)[1] in allowed_extensions: - makedirs(destionationDirectory) - system('install -m0644 %s %s' % (join_path(root, source), destionationDirectory)) - -def doinfo(*sourceFiles): - '''inserts the into files in the list of files into /usr/share/info''' - readable_insinto(join_path(get.installDIR(), get.infoDIR()), *sourceFiles) - -def dolib(sourceFile, destinationDirectory = '/usr/lib'): - '''insert the library into /usr/lib''' - - '''example call: pisitools.dolib_a("libz.a")''' - '''example call: pisitools.dolib_a("libz.so")''' - sourceFile = join_path(os.getcwd(), sourceFile) - destinationDirectory = join_path(get.installDIR(), destinationDirectory) - - lib_insinto(sourceFile, destinationDirectory, 755) - -def dolib_a(sourceFile, destinationDirectory = '/usr/lib'): - '''insert the static library into /usr/lib with permission 0644''' - - '''example call: pisitools.dolib_a("staticlib/libvga.a")''' - sourceFile = join_path(os.getcwd(), sourceFile) - destinationDirectory = join_path(get.installDIR(), destinationDirectory) - - lib_insinto(sourceFile, destinationDirectory, 644) - -def dolib_so(sourceFile, destinationDirectory = '/usr/lib'): - '''insert the static library into /usr/lib with permission 0755''' - - '''example call: pisitools.dolib_so("pppd/plugins/minconn.so")''' - sourceFile = join_path(os.getcwd(), sourceFile) - destinationDirectory = join_path(get.installDIR(), destinationDirectory) - - lib_insinto(sourceFile, destinationDirectory, 755) - -def doman(*sourceFiles): - '''inserts the man pages in the list of files into /usr/share/man/''' - - '''example call: pisitools.doman("man.1", "pardus.*")''' - manDIR = join_path(get.installDIR(), get.manDIR()) - if not can_access_directory(manDIR): - makedirs(manDIR) - - for sourceFile in sourceFiles: - for source in glob.glob(sourceFile): - try: - pageName, pageDirectory = source[:source.rindex('.')], \ - source[source.rindex('.')+1:] - except ValueError: - error(_('ActionsAPI [doman]: Wrong man page file: %s') % (source)) - - makedirs(join_path(manDIR, '/man%s' % pageDirectory)) - system('install -m0644 %s %s' % (source, join_path(manDIR, '/man%s' % pageDirectory))) - -def domo(sourceFile, locale, destinationFile ): - '''inserts the mo files in the list of files into /usr/share/locale/LOCALE/LC_MESSAGES''' - - '''example call: pisitools.domo("po/tr.po", "tr", "pam_login.mo")''' - - system('msgfmt %s' % sourceFile) - makedirs('%s/usr/share/locale/%s/LC_MESSAGES/' % (get.installDIR(), locale)) - move('messages.mo', '%s/usr/share/locale/%s/LC_MESSAGES/%s' % (get.installDIR(), locale, destinationFile)) - -def domove(sourceFile, destination, destinationFile = ''): - '''moves sourceFile/Directory into destinationFile/Directory''' - - ''' example call: pisitools.domove("/usr/bin/bash", "/bin/bash")''' - ''' example call: pisitools.domove("/usr/bin/", "/usr/sbin")''' - makedirs(join_path(get.installDIR(), destination)) - - for filePath in glob.glob(join_path(get.installDIR(), sourceFile)): - if not destinationFile: - move(filePath, join_path(get.installDIR(), join_path(destination, os.path.basename(filePath)))) - else: - move(filePath, join_path(get.installDIR(), join_path(destination, destinationFile))) - -def rename(sourceFile, destinationFile): - ''' renames sourceFile as destinationFile''' - - ''' example call: pisitools.rename("/usr/bin/bash", "bash.old") ''' - ''' the result of the previous example would be "/usr/bin/bash.old" ''' - - baseDir = os.path.dirname(sourceFile) - - try: - os.rename(join_path(get.installDIR(), sourceFile), join_path(get.installDIR(), baseDir, destinationFile)) - except OSError: - error(_('ActionsAPI [rename]: No such file or directory: %s') % (sourceFile)) - -def dosed(sourceFiles, findPattern, replacePattern = ''): - '''replaces patterns in sourceFiles''' - - ''' example call: pisitools.dosed("/etc/passwd", "caglar", "cem")''' - ''' example call: pisitools.dosed("/etc/passwd", "caglar")''' - ''' example call: pisitools.dosed("/etc/pass*", "caglar")''' - ''' example call: pisitools.dosed("Makefile", "(?m)^(HAVE_PAM=.*)no", r"\1yes")''' - - for sourceFile in glob.glob(sourceFiles): - if can_access_file(sourceFile): - for line in fileinput.input(sourceFile, inplace = 1): - #FIXME: In-place filtering is disabled when standard input is read - line = re.sub(findPattern, replacePattern, line) - sys.stdout.write(line) - else: - raise FileError(_('File does not exist or permission denied: %s') % sourceFile) - -def dosbin(sourceFile, destinationDirectory = '/usr/sbin'): - '''insert a executable file into /sbin or /usr/sbin''' - - ''' example call: pisitools.dobin("bin/xloadimage", "/sbin") ''' - executable_insinto(join_path(get.installDIR(), destinationDirectory), sourceFile) - -def dosym(sourceFile, destinationFile): - '''creates soft link between sourceFile and destinationFile''' - - ''' example call: pisitools.dosym("/usr/bin/bash", "/bin/bash")''' - makedirs(join_path(get.installDIR(), os.path.dirname(destinationFile))) - - try: - os.symlink(sourceFile, join_path(get.installDIR() ,destinationFile)) - except OSError: - error(_('ActionsAPI [dosym]: File exists: %s') % (sourceFile)) - -def insinto(destinationDirectory, sourceFile, destinationFile = '', sym = True): - '''insert a sourceFile into destinationDirectory as a destinationFile with same uid/guid/permissions''' - makedirs(join_path(get.installDIR(), destinationDirectory)) - - if not destinationFile: - for filePath in glob.glob(sourceFile): - if can_access_file(filePath): - copy(filePath, join_path(get.installDIR(), join_path(destinationDirectory, os.path.basename(filePath))), sym) - else: - copy(sourceFile, join_path(get.installDIR(), join_path(destinationDirectory, destinationFile)), sym) - -def newdoc(sourceFile, destinationFile): - '''inserts a sourceFile into /usr/share/doc/PACKAGE/ directory as a destinationFile''' - destinationDirectory = '' #490 - destinationDirectory = os.path.dirname(destinationFile) - destinationFile = os.path.basename(destinationFile) - # Use copy instead of move or let build-install scream like file not found! - copy(sourceFile, destinationFile) - readable_insinto(join_path(get.installDIR(), 'usr/share/doc', get.srcTAG(), destinationDirectory), destinationFile) - -def newman(sourceFile, destinationFile): - '''inserts a sourceFile into /usr/share/man/manPREFIX/ directory as a destinationFile''' - # Use copy instead of move or let build-install scream like file not found! - copy(sourceFile, destinationFile) - doman(destinationFile) - -def remove(sourceFile): - '''removes sourceFile''' - for filePath in glob.glob(join_path(get.installDIR(), sourceFile)): - unlink(filePath) - -def removeDir(destinationDirectory): - '''removes destinationDirectory and its subtrees''' - for directory in glob.glob(join_path(get.installDIR(), destinationDirectory)): - unlinkDir(directory) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/pisitoolsfunctions.py b/tags/pisi-1.1_rc10/pisi/actionsapi/pisitoolsfunctions.py deleted file mode 100644 index b50fd5a9..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/pisitoolsfunctions.py +++ /dev/null @@ -1,80 +0,0 @@ -#-*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Generic functions for common usage of pisitools # - -# Standart Python Modules -import os -import glob - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi -from pisi.actionsapi.shelltools import * - -class FileError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class ArgumentError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def executable_insinto(destinationDirectory, *sourceFiles): - '''insert a executable file into destinationDirectory''' - - if not sourceFiles or not destinationDirectory: - raise ArgumentError(_('Insufficient arguments.')) - - if not can_access_directory(destinationDirectory): - makedirs(destinationDirectory) - - for sourceFile in sourceFiles: - for source in glob.glob(sourceFile): - # FIXME: use an internal install routine for these - system('install -m0755 -o root -g root %s %s' % (source, destinationDirectory)) - -def readable_insinto(destinationDirectory, *sourceFiles): - '''inserts file list into destinationDirectory''' - - if not sourceFiles or not destinationDirectory: - raise ArgumentError(_('Insufficient arguments.')) - - if not can_access_directory(destinationDirectory): - makedirs(destinationDirectory) - - for sourceFile in sourceFiles: - for source in glob.glob(sourceFile): - system('install -m0644 "%s" %s' % (source, destinationDirectory)) - -def lib_insinto(sourceFile, destinationDirectory, permission = 0644): - '''inserts a library fileinto destinationDirectory with given permission''' - - if not sourceFile or not destinationDirectory: - raise ArgumentError(_('Insufficient arguments.')) - - if not can_access_directory(destinationDirectory): - makedirs(destinationDirectory) - - if os.path.islink(sourceFile): - os.symlink(os.path.realpath(sourceFile), os.path.join(destinationDirectory, sourceFile)) - else: - system('install -m%s %s %s' % (permission, sourceFile, destinationDirectory)) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/pythonmodules.py b/tags/pisi-1.1_rc10/pisi/actionsapi/pythonmodules.py deleted file mode 100644 index e3fa14ce..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/pythonmodules.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# standard python modules -import os - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get as get -from pisi.actionsapi.shelltools import system, can_access_file, unlink -from pisi.actionsapi.pisitools import dodoc - -class CompileError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class InstallError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class RunTimeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def compile(parameters = ''): - '''compile source with given parameters.''' - if system('python setup.py build %s' % (parameters)): - raise CompileError, _('Make failed.') - -def install(parameters = ''): - '''does python setup.py install''' - if system('python setup.py install --root=%s --no-compile -O0 %s' % (get.installDIR(), parameters)): - raise InstallError, _('Install failed.') - - DDOCS = 'CHANGELOG COPYRIGHT KNOWN_BUGS MAINTAINERS PKG-INFO \ - CONTRIBUTORS LICENSE COPYING* Change* MANIFEST* README*' - - for doc in DDOCS: - if can_access_file(doc): - pisitools.dodoc(doc) - -def run(parameters = ''): - '''executes parameters with python''' - if system('python %s' % (parameters)): - raise RunTimeError, _('Running %s failed.') % parameters - -def fixCompiledPy(): - ''' cleans *.py[co] from packages ''' - for root, dirs, files in os.walk("%s/usr/lib/%s/" % (get.installDIR(), get.curPYTHON())): - for compiledFile in files: - if compiledFile.endswith(".pyc") or compiledFile.endswith(".pyo"): - if can_access_file("%s/%s" % (root,compiledFile)): - unlink("%s/%s" % (root,compiledFile)) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/scons.py b/tags/pisi-1.1_rc10/pisi/actionsapi/scons.py deleted file mode 100644 index da44c52e..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/scons.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - - -# Pisi Modules -import pisi.context as ctx - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get as get -from pisi.actionsapi.shelltools import system - -class MakeError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -class InstallError(pisi.actionsapi.Error): - def __init__(self, value=''): - pisi.actionsapi.Error.__init__(self, value) - self.value = value - ctx.ui.error(value) - -def make(parameters = ''): - if system('scons %s' % parameters): - raise MakeError(_('Make failed.')) - -def install(parameters = 'install', prefix = get.installDIR(), argument='prefix'): - if system('scons %s=%s %s' % (argument, prefix, parameters)): - raise InstallError(_('Install failed.')) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/shelltools.py b/tags/pisi-1.1_rc10/pisi/actionsapi/shelltools.py deleted file mode 100644 index 5ad24771..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/shelltools.py +++ /dev/null @@ -1,224 +0,0 @@ -#-*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Standart Python Modules -import os -import glob -import shutil -import string -import pwd -import grp - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# Pisi Modules -import pisi.context as ctx - -# ActionsAPI Modules -import pisi.actionsapi -import pisi.actionsapi.get - -from pisi.actionsapi import error -from pisi.util import run_logged -from pisi.util import join_path - -def can_access_file(filePath): - '''test the existence of file''' - return os.access(filePath, os.F_OK) - -def can_access_directory(destinationDirectory): - '''test readability, writability and executablility of directory''' - return os.access(destinationDirectory, os.R_OK | os.W_OK | os.X_OK) - -def makedirs(destinationDirectory): - '''recursive directory creation function''' - try: - if not os.access(destinationDirectory, os.F_OK): - os.makedirs(destinationDirectory) - except OSError: - error(_('Cannot create directory %s') % destinationDirectory) - -def echo(destionationFile, content): - try: - f = open(destionationFile, 'a') - f.write('%s\n' % content) - f.close() - except IOError: - error(_('ActionsAPI [echo]: Can\'t append to file %s.') % (destionationFile)) - -def chmod(filePath, mode = 0755): - '''change the mode of filePath to the mode''' - for fileName in glob.glob(filePath): - if can_access_file(fileName): - try: - os.chmod(fileName, mode) - except OSError: - ctx.ui.error(_('ActionsAPI [chmod]: Operation not permitted: %s (mode: %s)') \ - % (fileName, mode)) - else: - ctx.ui.error(_('ActionsAPI [chmod]: File %s doesn\'t exists.') % (fileName)) - -def chown(filePath, uid = "root", gid = "root"): - '''change the owner and group id of filePath to uid and gid''' - if can_access_file(filePath): - try: - os.chown(filePath, pwd.getpwnam(uid)[2], grp.getgrnam(gid)[2]) - except OSError: - ctx.ui.error(_('ActionsAPI [chown]: Operation not permitted: %s (uid: %s, gid: %s)') \ - % (filePath, uid, gid)) - else: - ctx.ui.error(_('ActionsAPI [chown]: File %s doesn\'t exists.') % filePath) - -def sym(source, destination): - '''creates symbolic link''' - try: - os.symlink(source, destination) - except OSError: - ctx.ui.error(_('ActionsAPI [sym]: Permission denied: %s to %s') % (source, destination)) - -def unlink(filePath): - '''remove the file path''' - if isFile(filePath) or isLink(filePath): - try: - os.unlink(filePath) - except OSError: - ctx.ui.error(_('ActionsAPI [unlink]: Permission denied: %s.') % (filePath)) - elif isDirectory(filePath): - pass - else: - ctx.ui.error(_('ActionsAPI [unlink]: File %s doesn\'t exists.') % (filePath)) - -def unlinkDir(sourceDirectory): - '''delete an entire directory tree''' - if isDirectory(sourceDirectory) or isLink(sourceDirectory): - try: - shutil.rmtree(sourceDirectory) - except OSError: - error(_('ActionsAPI [unlinkDir]: Operation not permitted: %s') % (sourceDirectory)) - elif isFile(sourceDirectory): - pass - else: - error(_('ActionsAPI [unlinkDir]: Directory %s doesn\'t exists.') % (sourceDirectory)) - -def move(source, destination): - '''recursively move a "source" file or directory to "destination"''' - for filePath in glob.glob(source): - if isFile(filePath) or isLink(filePath) or isDirectory(filePath): - try: - shutil.move(filePath, destination) - except OSError: - error(_('ActionsAPI [move]: Permission denied: %s to %s') % (filePath, destination)) - else: - error(_('ActionsAPI [move]: File %s doesn\'t exists.') % (filePath)) - -# FIXME: instead of passing a sym parameter, split copy and copytree into 4 different function -def copy(source, destination, sym = True): - '''recursively copy a "source" file or directory to "destination"''' - for filePath in glob.glob(source): - if isFile(filePath) and not isLink(filePath): - try: - shutil.copy(filePath, destination) - except IOError: - error(_('ActionsAPI [copy]: Permission denied: %s to %s') % (filePath, destination)) - elif isLink(filePath) and sym: - if isDirectory(destination): - os.symlink(os.readlink(filePath), join_path(destination, os.path.basename(filePath))) - else: - if isFile(destination): - os.remove(destination) - os.symlink(os.readlink(filePath), destination) - elif isLink(filePath) and not sym: - if isDirectory(filePath): - copytree(filePath, destination) - else: - shutil.copy(filePath, destination) - elif isDirectory(filePath): - copytree(filePath, destination, sym) - else: - error(_('ActionsAPI [copy]: File %s does not exist.') % filePath) - -def copytree(source, destination, sym = True): - '''recursively copy an entire directory tree rooted at source''' - if isDirectory(source): - if os.path.exists(destination): - if isDirectory(destination): - copytree(source, join_path(destination, os.path.basename(source.strip('/')))) - return - else: - copytree(source, join_path(destination, os.path.basename(source))) - return - try: - shutil.copytree(source, destination, sym) - except OSError, e: - error(_('ActionsAPI [copytree] %s to %s: %s') % (source, destination, e)) - else: - error(_('ActionsAPI [copytree]: Directory %s doesn\'t exists.') % (source)) - -def touch(filePath): - '''changes the access time of the 'filePath', or creates it if it is not exist''' - if glob.glob(filePath): - for f in glob.glob(filePath): - os.utime(f, None) - else: - try: - f = open(filePath, 'w') - f.close() - except IOError: - error(_('ActionsAPI [touch]: Permission denied: %s') % (filePath)) - -def cd(directoryName = ''): - '''change directory''' - current = os.getcwd() - if directoryName: - os.chdir(directoryName) - else: - os.chdir(os.path.dirname(current)) - -def ls(source): - '''listdir''' - if os.path.isdir(source): - return os.listdir(source) - else: - return glob.glob(source) - -def export(key, value): - '''export environ variable''' - os.environ[key] = value - -def isLink(filePath): - '''return True if filePath refers to a symbolic link''' - return os.path.islink(filePath) - -def isFile(filePath): - '''return True if filePath is an existing regular file''' - return os.path.isfile(filePath) - -def isDirectory(filePath): - '''Return True if filePath is an existing directory''' - return os.path.isdir(filePath) - -def realPath(filePath): - '''return the canonical path of the specified filename, eliminating any symbolic links encountered in the path''' - return os.path.realpath(filePath) - -def baseName(filePath): - '''return the base name of pathname filePath''' - return os.path.basename(filePath) - -def dirName(filePath): - '''return the directory name of pathname path''' - return os.path.dirname(filePath) - -def system(command): - command = string.join(string.split(command)) - return run_logged(command) diff --git a/tags/pisi-1.1_rc10/pisi/actionsapi/variables.py b/tags/pisi-1.1_rc10/pisi/actionsapi/variables.py deleted file mode 100644 index 19ff301d..00000000 --- a/tags/pisi-1.1_rc10/pisi/actionsapi/variables.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# Standard Python Modules -import os -from copy import deepcopy - -# Pisi-Core Modules -import pisi.context as ctx - -# Set individual information, that are generally needed for ActionsAPI - -def exportFlags(): - '''General flags used in actions API.''' - - # first reset environ - os.environ = {} - os.environ = deepcopy(ctx.config.environ) - - # Build systems depend on these environment variables. That is why - # we export them instead of using as (instance) variables. - values = ctx.config.values - os.environ['HOST'] = values.build.host - os.environ['CFLAGS'] = values.build.cflags - os.environ['CXXFLAGS'] = values.build.cxxflags - os.environ['LDFLAGS'] = values.build.ldflags - os.environ['USER_LDFLAGS'] = values.build.ldflags - os.environ['JOBS'] = values.build.jobs - -class Env(object): - '''General environment variables used in actions API''' - def __init__(self): - - exportFlags() - - self.__vars = { - 'pkg_dir': 'PKG_DIR', - 'work_dir': 'WORK_DIR', - 'install_dir': 'INSTALL_DIR', - 'src_name': 'SRC_NAME', - 'src_version': 'SRC_VERSION', - 'src_release': 'SRC_RELEASE', - 'host': 'HOST', - 'cflags': 'CFLAGS', - 'cxxflags': 'CXXFLAGS', - 'ldflags': 'LDFLAGS', - 'jobs': 'JOBS' - } - - def __getattr__(self, attr): - - # Using environment variables is somewhat tricky. Each time - # you need them you need to check for their value. - if self.__vars.has_key(attr): - return os.getenv(self.__vars[attr]) - else: - return None - -class Dirs: - '''General directories used in actions API.''' - # TODO: Eventually we should consider getting these from a/the - # configuration file - doc = 'usr/share/doc' - sbin = 'usr/sbin' - man = 'usr/share/man' - info = 'usr/share/info' - data = 'usr/share' - conf = 'etc' - localstate = 'var/lib' - defaultprefix = 'usr' - - # These should be owned by object not the class. Or else Python - # will bug us with NoneType errors because of uninitialized - # context (ctx) because of the import in build.py. - def __init__(self): - self.values = ctx.config.values - self.kde = self.values.dirs.kde_dir - self.qt = self.values.dirs.qt_dir - - -# As we import this module from build.py, we can't init glb as a -# singleton here. Or else Python will bug us with NoneType errors -# because of uninitialized context (ctx) because of exportFlags(). -# -# We import this modue from build.py becase we need to reset/init glb -# for each build. # See bug #2575 -glb = None - -def initVariables(): - global glb - ctx.env = Env() - ctx.dirs = Dirs() - glb = ctx diff --git a/tags/pisi-1.1_rc10/pisi/api.py b/tags/pisi-1.1_rc10/pisi/api.py deleted file mode 100644 index 1a6b77d7..00000000 --- a/tags/pisi-1.1_rc10/pisi/api.py +++ /dev/null @@ -1,556 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -"""Top level PiSi interfaces. a facade to the entire PiSi system""" - -import os -import sys -import logging -import logging.handlers - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -from pisi.uri import URI -import pisi.util as util -import pisi.dependency as dependency -import pisi.pgraph as pgraph -import pisi.operations as operations -import pisi.packagedb as packagedb -import pisi.repodb -import pisi.installdb -import pisi.sourcedb -import pisi.component as component -from pisi.index import Index -import pisi.cli -from pisi.config import Options -from pisi.operations import install, remove, upgrade, emerge -from pisi.operations import plan_install_pkg_names as plan_install -from pisi.operations import plan_remove, plan_upgrade, upgrade_base, calculate_conflicts, reorder_base_packages -from pisi.build import build_until -from pisi.atomicoperations import resurrect_package, build -from pisi.metadata import MetaData -from pisi.files import Files -from pisi.file import File -import pisi.search -import pisi.lockeddbshelve as shelve -from pisi.version import Version - -class Error(pisi.Error): - pass - -def init(database = True, write = True, - options = Options(), ui = None, comar = True, - stdout = None, stderr = None, - comar_sockname = None, - signal_handling = True): - """Initialize PiSi subsystem. - - You should call finalize() when your work is finished. Otherwise - you can left the database in a bad state. - - """ - - # UI comes first - - if ui is None: - from pisi.cli import CLI - if options: - ctx.ui = CLI(options.debug, options.verbose) - else: - ctx.ui = CLI() - else: - ctx.ui = ui - - if os.access('/var/log', os.W_OK): - handler = logging.handlers.RotatingFileHandler('/var/log/pisi.log') - #handler.setLevel(logging.DEBUG) - formatter = logging.Formatter('%(asctime)-12s: %(levelname)-8s %(message)s') - handler.setFormatter(formatter) - ctx.log = logging.getLogger('pisi') - ctx.log.addHandler(handler) - ctx.loghandler = handler - ctx.log.setLevel(logging.DEBUG) - else: - ctx.log = None - - # If given define stdout and stderr. Needed by buildfarm currently - # but others can benefit from this too. - if stdout: - ctx.stdout = stdout - if stderr: - ctx.stderr = stderr - - import pisi.config - ctx.config = pisi.config.Config(options) - - if signal_handling: - ctx.sig = pisi.signalhandler.SignalHandler() - - # TODO: this is definitely not dynamic beyond this point! - ctx.comar = comar and not ctx.config.get_option('ignore_comar') - # This is for YALI, used in comariface.py - ctx.comar_sockname = comar_sockname - - # initialize repository databases - ctx.database = database - if database: - shelve.init_dbenv(write=write) - ctx.repodb = pisi.repodb.init() - ctx.installdb = pisi.installdb.init() - ctx.filesdb = pisi.files.FilesDB() - ctx.componentdb = pisi.component.ComponentDB() - ctx.packagedb = packagedb.init_db() - ctx.sourcedb = pisi.sourcedb.init() - pisi.search.init(['terms'], ['en', 'tr']) - else: - ctx.repodb = None - ctx.installdb = None - ctx.filesdb = None - ctx.componentdb = None - ctx.packagedb = None - ctx.sourcedb = None - ctx.ui.debug('PiSi API initialized') - ctx.initialized = True - -def finalize(): - """Close the database cleanly and do other cleanup.""" - if ctx.initialized: - ctx.disable_keyboard_interrupts() - if ctx.log: - ctx.loghandler.flush() - ctx.log.removeHandler(ctx.loghandler) - - pisi.repodb.finalize() - pisi.installdb.finalize() - if ctx.filesdb != None: - ctx.filesdb.close() - ctx.filesdb = None - if ctx.componentdb != None: - ctx.componentdb.close() - ctx.componentdb = None - if ctx.packagedb: - packagedb.finalize_db() - ctx.packagedb = None - if ctx.sourcedb: - pisi.sourcedb.finalize() - ctx.sourcedb = None - pisi.search.finalize() - if ctx.dbenv: - ctx.dbenv.close() - ctx.dbenv_lock.close() - if ctx.build_leftover and os.path.exists(ctx.build_leftover): - os.unlink(ctx.build_leftover) - - ctx.ui.debug('PiSi API finalized') - ctx.ui.close() - ctx.initialized = False - ctx.enable_keyboard_interrupts() - -def list_installed(): - """Return a set of installed package names.""" - return set(ctx.installdb.list_installed()) - -def list_available(repo = None): - """Return a set of available package names.""" - return set(ctx.packagedb.list_packages(repo = repo)) - -def list_upgradable(): - ignore_build = ctx.get_option('ignore_build_no') - - return filter(pisi.operations.is_upgradable, ctx.installdb.list_installed()) - -def package_graph(A, repo = pisi.itembyrepodb.installed, ignore_installed = False): - """Construct a package relations graph. - - Graph will contain all dependencies of packages A, if ignore_installed - option is True, then only uninstalled deps will be added. - - """ - - ctx.ui.debug('A = %s' % str(A)) - - # try to construct a pisi graph of packages to - # install / reinstall - - G_f = pgraph.PGraph(ctx.packagedb, repo) # construct G_f - - # find the "install closure" graph of G_f by package - # set A using packagedb - for x in A: - G_f.add_package(x) - B = A - #state = {} - while len(B) > 0: - Bp = set() - for x in B: - pkg = ctx.packagedb.get_package(x, repo) - #print pkg - for dep in pkg.runtimeDependencies(): - if ignore_installed: - if dependency.installed_satisfies_dep(dep): - continue - if not dep.package in G_f.vertices(): - Bp.add(str(dep.package)) - G_f.add_dep(x, dep) - B = Bp - return G_f - -def generate_install_order(A): - # returns the install order of the given install package list with any extra - # dependency that is also going to be installed - G_f, order = plan_install(A, ignore_package_conflicts = True) - return order - -def generate_remove_order(A): - # returns the remove order of the given removal package list with any extra - # reverse dependency that is also going to be removed - G_f, order = plan_remove(A) - return order - -def generate_upgrade_order(A): - # returns the upgrade order of the given upgrade package list with any needed extra - # dependency - G_f, order = plan_upgrade(A) - return order - -def generate_base_upgrade(A): - # all the packages of the system.base must be installed on the system. - # method returns the currently needed system.base component install and - # upgrade needs - base = upgrade_base(A, ignore_package_conflicts = True) - return list(base) - -def generate_conflicts(A): - # returns the conflicting packages list of the to be installed packages. - # @C: conflicting and must be removed packages list to proceed - # @D: list of the conflicting packages _with each other_ in the to be installed list - # @E: dictionary that contains which package in the to be installed list conflicts - # with which packages - - (C, D, E) = calculate_conflicts(A, ctx.packagedb) - return (C, D, E) - -def generate_pending_order(A): - # returns pending package list in reverse topological order of dependency - G_f = pgraph.PGraph(ctx.packagedb, pisi.itembyrepodb.installed) # construct G_f - for x in A.keys(): - G_f.add_package(x) - B = A - while len(B) > 0: - Bp = set() - for x in B.keys(): - pkg = ctx.packagedb.get_package(x, pisi.itembyrepodb.installed) - for dep in pkg.runtimeDependencies(): - if dep.package in G_f.vertices(): - G_f.add_dep(x, dep) - B = Bp - if ctx.get_option('debug'): - G_f.write_graphviz(sys.stdout) - order = G_f.topological_sort() - order.reverse() - - # Bug 4211 - if ctx.componentdb.has_component('system.base'): - order = reorder_base_packages(order) - - return order - -def configure_pending(): - # start with pending packages - # configure them in reverse topological order of dependency - A = ctx.installdb.list_pending() - order = generate_pending_order(A) - try: - import pisi.comariface as comariface - for x in order: - if ctx.installdb.is_installed(x): - pkginfo = A[x] - pkgname = util.package_name(x, pkginfo.version, - pkginfo.release, - False, - False) - pkg_path = util.join_path(ctx.config.lib_dir(), - 'package', pkgname) - m = MetaData() - metadata_path = util.join_path(pkg_path, ctx.const.metadata_xml) - m.read(metadata_path) - # FIXME: we need a full package info here! - pkginfo.name = x - ctx.ui.notify(pisi.ui.configuring, package = pkginfo, files = None) - pisi.comariface.post_install( - pkginfo.name, - m.package.providesComar, - util.join_path(pkg_path, ctx.const.comar_dir), - util.join_path(pkg_path, ctx.const.metadata_xml), - util.join_path(pkg_path, ctx.const.files_xml), - ) - ctx.ui.notify(pisi.ui.configured, package = pkginfo, files = None) - ctx.installdb.clear_pending(x) - except ImportError: - raise Error(_("comar package is not fully installed")) - -def info(package, installed = False): - if package.endswith(ctx.const.package_suffix): - return info_file(package) - else: - return info_name(package, installed) - -def info_file(package_fn): - from package import Package - - if not os.path.exists(package_fn): - raise Error (_('File %s not found') % package_fn) - - package = Package(package_fn) - package.read() - return package.metadata, package.files - -def info_name(package_name, installed=False): - """Fetch package information for the given package.""" - if installed: - package = ctx.packagedb.get_package(package_name, pisi.itembyrepodb.installed) - else: - package, repo = ctx.packagedb.get_package_repo(package_name, pisi.itembyrepodb.repos) - repostr = repo - - from pisi.metadata import MetaData - metadata = MetaData() - metadata.package = package - #FIXME: get it from sourcedb if available - metadata.source = None - #TODO: fetch the files from server if possible (wow, you maniac -- future exa) - if installed and ctx.installdb.is_installed(package.name): - try: - files = ctx.installdb.files(package.name) - except pisi.Error, e: - ctx.ui.warning(e) - files = None - else: - files = None - return metadata, files - -def search_package_names(query): - r = set() - packages = ctx.packagedb.list_packages() - for pkgname in packages: - if query in pkgname: - r.add(pkgname) - return r - -def search_package_terms(terms, lang = None, search_names = True, repo = pisi.itembyrepodb.all): - if not lang: - lang = pisi.pxml.autoxml.LocalText.get_lang() - r = pisi.search.query_terms('terms', lang, terms, repo = repo) - if search_names: - for term in terms: - r |= search_package_names(term) - return r - -def search_package(query, lang = None, search_names = True, repo = pisi.itembyrepodb.all): - if not lang: - lang = pisi.pxml.autoxml.LocalText.get_lang() - r = pisi.search.query('terms', lang, query, repo = repo) - if search_names: - r |= search_package_names(query) - return r - -def check(package): - md, files = info(package, True) - corrupt = [] - for file in files.list: - if file.hash and file.type != "config" \ - and not os.path.islink('/' + file.path): - ctx.ui.info(_("Checking /%s ") % file.path, noln=True, verbose=True) - try: - if file.hash != util.sha1_file('/' + file.path): - corrupt.append(file) - ctx.ui.error(_("\nCorrupt file: %s") % file) - else: - ctx.ui.info(_("OK"), verbose=True) - except pisi.util.FileError,e: - ctx.ui.error("\n%s" % e) - return corrupt - -def index(dirs=None, output='pisi-index.xml', skip_sources=False, skip_signing=False): - """Accumulate PiSi XML files in a directory, and write an index.""" - index = Index() - index.distribution = None - if not dirs: - dirs = ['.'] - for repo_dir in dirs: - repo_dir = str(repo_dir) - ctx.ui.info(_('* Building index of PiSi files under %s') % repo_dir) - index.index(repo_dir, skip_sources) - - if skip_signing: - index.write(output, sha1sum=True, compress=File.bz2, sign=None) - else: - index.write(output, sha1sum=True, compress=File.bz2, sign=File.detached) - ctx.ui.info(_('* Index file written')) - -def add_repo(name, indexuri, at = None): - if ctx.repodb.has_repo(name): - raise Error(_('Repo %s already present.') % name) - else: - repo = pisi.repodb.Repo(URI(indexuri)) - ctx.repodb.add_repo(name, repo, at = at) - ctx.ui.info(_('Repo %s added to system.') % name) - -def remove_repo(name): - if ctx.repodb.has_repo(name): - ctx.repodb.remove_repo(name) - pisi.util.clean_dir(os.path.join(ctx.config.index_dir(), name)) - ctx.ui.info(_('Repo %s removed from system.') % name) - else: - ctx.ui.error(_('Repository %s does not exist. Cannot remove.') - % name) - -def list_repos(): - return ctx.repodb.list() - -def update_repo(repo, force=False): - ctx.ui.info(_('* Updating repository: %s') % repo) - ctx.ui.notify(pisi.ui.updatingrepo, name = repo) - index = Index() - if ctx.repodb.has_repo(repo): - repouri = ctx.repodb.get_repo(repo).indexuri.get_uri() - try: - index.read_uri_of_repo(repouri, repo) - except pisi.file.AlreadyHaveException, e: - ctx.ui.info(_('No updates available for repository %s.') % repo) - if force: - ctx.ui.info(_('Updating database at any rate as requested')) - index.read_uri_of_repo(repouri, repo, force = force) - else: - return - - try: - index.check_signature(repouri, repo) - except pisi.file.NoSignatureFound, e: - ctx.ui.warning(e) - - ctx.txn_proc(lambda txn : index.update_db(repo, txn=txn)) - ctx.ui.info(_('* Package database updated.')) - else: - raise Error(_('No repository named %s found.') % repo) - -def delete_cache(): - util.clean_dir(ctx.config.packages_dir()) - util.clean_dir(ctx.config.archives_dir()) - util.clean_dir(ctx.config.tmp_dir()) - -def rebuild_repo(repo): - ctx.ui.info(_('* Rebuilding \'%s\' named repo... ') % repo) - - if ctx.repodb.has_repo(repo): - repouri = URI(ctx.repodb.get_repo(repo).indexuri.get_uri()) - indexname = repouri.filename() - index = Index() - indexpath = pisi.util.join_path(ctx.config.index_dir(), repo, indexname) - tmpdir = os.path.join(ctx.config.tmp_dir(), 'index') - pisi.util.clean_dir(tmpdir) - pisi.util.check_dir(tmpdir) - try: - index.read_uri(indexpath, tmpdir, force=True) # don't look for sha1sum there - except IOError, e: - ctx.ui.warning(_("Input/Output error while reading %s: %s") % (indexpath, unicode(e))) - return - ctx.txn_proc(lambda txn : index.update_db(repo, txn=txn)) - else: - raise Error(_('No repository named %s found.') % repo) - -def rebuild_db(files=False): - - assert ctx.database == False - - # Bug 2596 - # finds and cleans duplicate package directories under '/var/lib/pisi/package' - # deletes the _older_ versioned package directories. - def clean_duplicates(): - i_version = {} # installed versions - replica = [] - for pkg in os.listdir(pisi.util.join_path(pisi.api.ctx.config.lib_dir(), 'package')): - (name, ver) = util.parse_package_name(pkg) - if i_version.has_key(name): - if Version(ver) > Version(i_version[name]): - # found a greater version, older one is a replica - replica.append(name + '-' + i_version[name]) - i_version[name] = ver - else: - # found an older version which is a replica - replica.append(name + '-' + ver) - else: - i_version[name] = ver - - for pkg in replica: - pisi.util.clean_dir(pisi.util.join_path(pisi.api.ctx.config.lib_dir(), 'package', pkg)) - - def destroy(files): - #TODO: either don't delete version files here, or remove force flag... - import bsddb3.db - for db in os.listdir(ctx.config.db_dir()): - if db.endswith('.bdb'):# or db.startswith('log'): # delete only db files - if db.startswith('files') or db.startswith('filesdbversion'): - clean = files - else: - clean = True - if clean: - fn = pisi.util.join_path(ctx.config.db_dir(), db) - #NB: there is a parameter bug with python-bsddb3, fixed in pardus - ctx.dbenv.dbremove(file=fn, flags=bsddb3.db.DB_AUTO_COMMIT) - - def reload_packages(files, txn): - packages = os.listdir(pisi.util.join_path(ctx.config.lib_dir(), 'package')) - progress = ctx.ui.Progress(len(packages)) - processed = 0 - for package_fn in packages: - if not package_fn == "scripts": - ctx.ui.debug('Resurrecting %s' % package_fn) - pisi.api.resurrect_package(package_fn, files, txn) - processed += 1 - ctx.ui.display_progress(operation = "rebuilding-db", - percent = progress.update(processed), - info = _("Rebuilding package database")) - - def reload_indices(txn): - index_dir = ctx.config.index_dir() - if os.path.exists(index_dir): # it may have been erased, or we may be upgrading from a previous version -- exa - for repo in os.listdir(index_dir): - indexuri = pisi.util.join_path(ctx.config.lib_dir(), 'index', repo, 'uri') - indexuri = open(indexuri, 'r').readline() - pisi.api.add_repo(repo, indexuri) - pisi.api.rebuild_repo(repo) - - # check db schema versions - try: - pisi.lockeddbshelve.check_dbversion('filesdbversion', pisi.__filesdbversion__, write=False) - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - files = True # exception means the files db version was wrong - pisi.lockeddbshelve.init_dbenv(write=True, writeversion=True) - destroy(files) # bye bye - - # save parameters and shutdown pisi - options = ctx.config.options - ui = ctx.ui - comar = ctx.comar - finalize() - - # construct new database - init(database=True, options=options, ui=ui, comar=comar) - clean_duplicates() - reload_packages(files, None) - reload_indices(None) diff --git a/tags/pisi-1.1_rc10/pisi/archive.py b/tags/pisi-1.1_rc10/pisi/archive.py deleted file mode 100644 index 8f9b2287..00000000 --- a/tags/pisi-1.1_rc10/pisi/archive.py +++ /dev/null @@ -1,423 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""Archive module provides access to regular archive file types.""" - -# standard library modules -import os -import stat -import shutil -import tarfile -import zipfile - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# PiSi modules -import pisi -import pisi.util as util -import pisi.context as ctx - -class ArchiveError(pisi.Error): - pass - -class LZMAError(pisi.Error): - def __init__(self, err): - pisi.Error.__init__(self, _("An error has occured while running LZMA:\n%s") % err) - -class ArchiveBase(object): - """Base class for Archive classes.""" - def __init__(self, file_path, atype): - self.file_path = file_path - self.type = atype - - def unpack(self, target_dir, clean_dir = False): - self.target_dir = target_dir - # first we check if we need to clean-up our working env. - if os.path.exists(self.target_dir) and clean_dir: - util.clean_dir(self.target_dir) - - os.makedirs(self.target_dir) - - -class ArchiveBinary(ArchiveBase): - """ArchiveBinary handles binary archive files (usually distrubuted as - .bin files)""" - def __init__(self, file_path, arch_type = "binary"): - super(ArchiveBinary, self).__init__(file_path, arch_type) - - def unpack(self, target_dir, clean_dir = False): - super(ArchiveBinary, self).unpack(target_dir, clean_dir) - - # we can't unpack .bin files. we'll just move them to target - # directory and leave the dirty job to actions.py ;) - import shutil - target_file = os.path.join(target_dir, os.path.basename(self.file_path)) - shutil.copyfile(self.file_path, target_file) - - -class ArchiveTar(ArchiveBase): - """ArchiveTar handles tar archives depending on the compression - type. Provides access to tar, tar.gz and tar.bz2 files. - - This class provides the unpack magic for tar archives.""" - def __init__(self, file_path, arch_type = "tar", no_same_permissions = True, no_same_owner = True): - super(ArchiveTar, self).__init__(file_path, arch_type) - self.tar = None - self.no_same_permissions = no_same_permissions - self.no_same_owner = no_same_owner - - def unpack(self, target_dir, clean_dir = False): - """Unpack tar archive to a given target directory(target_dir).""" - super(ArchiveTar, self).unpack(target_dir, clean_dir) - self.unpack_dir(target_dir) - - def unpack_dir(self, target_dir): - rmode = "" - if self.type == 'tar': - rmode = 'r:' - elif self.type == 'targz': - rmode = 'r:gz' - elif self.type == 'tarbz2': - rmode = 'r:bz2' - elif self.type == 'tarlzma': - rmode = 'r:' - self.file_path = self.file_path.rstrip(ctx.const.lzma_suffix) - ret, out, err = util.run_batch("lzma d %s %s" % (self.file_path + ctx.const.lzma_suffix, - self.file_path)) - if ret != 0: - raise LZMAError(err) - else: - raise ArchiveError(_("Archive type not recognized")) - - self.tar = tarfile.open(self.file_path, rmode) - oldwd = os.getcwd() - os.chdir(target_dir) - - uid = os.getuid() - gid = os.getgid() - - install_tar_path = util.join_path(ctx.config.tmp_dir(), ctx.const.install_tar) - for tarinfo in self.tar: - # Installing packages (especially shared libraries) is a - # bit tricky. You should also change the inode if you - # change the file, cause the file is opened allready and - # accessed. Removing and creating the file will also - # change the inode and will do the trick (in fact, old - # file will be deleted only when its closed). - # - # Also, tar.extract() doesn't write on symlinks... Not any - # more :). - if self.file_path == install_tar_path: - if os.path.isfile(tarinfo.name) or os.path.islink(tarinfo.name): - try: - os.unlink(tarinfo.name) - except OSError, e: - ctx.ui.warning(e) - - self.tar.extract(tarinfo) - - # tarfile.extract does not honor umask. It must be honored explicitly. - # see --no-same-permissions option of tar(1), which is the deafult - # behaviour. - # - # Note: This is no good while installing a pisi package. Thats why - # this is optional. - if self.no_same_permissions and not os.path.islink(tarinfo.name): - os.chmod(tarinfo.name, tarinfo.mode & ~ctx.const.umask) - - if self.no_same_owner: - if not os.path.islink(tarinfo.name): - os.chown(tarinfo.name, uid, gid) - else: - os.lchown(tarinfo.name, uid, gid) - - os.chdir(oldwd) - self.close() - - def add_to_archive(self, file_name, arc_name=None): - """Add file or directory path to the tar archive""" - if not self.tar: - if self.type == 'tar': - wmode = 'w:' - elif self.type == 'targz': - wmode = 'w:gz' - elif self.type == 'tarbz2': - wmode = 'w:bz2' - elif self.type == 'tarlzma': - wmode = 'w:' - self.file_path = self.file_path.rstrip(ctx.const.lzma_suffix) - else: - raise ArchiveError(_("Archive type not recognized")) - self.tar = tarfile.open(self.file_path, wmode) - - self.tar.add(file_name, arc_name) - - def close(self): - self.tar.close() - - if self.tar.mode == 'wb' and self.type == 'tarlzma': - batch = None - if ctx.config.values.build.compressionlevel: - batch = "lzmash -%s %s" % (ctx.config.values.build.compressionlevel, self.file_path) - else: - batch = "lzmash %s" % self.file_path - - ret, out, err = util.run_batch(batch) - if ret != 0: - raise LZMAError(err) - - -class MyZipFile(zipfile.ZipFile): - def decompressToFile(self, name, outname): - import zlib - import binascii - - block_size = 1024 * 1024 * 2 - - if self.mode not in ("r", "a"): - raise RuntimeError, 'read() requires mode "r" or "a"' - if not self.fp: - raise RuntimeError, \ - "Attempt to read ZIP archive that was already closed" - zinfo = self.getinfo(name) - filepos = self.fp.tell() - self.fp.seek(zinfo.file_offset, 0) - - destfile = file(outname, 'wb') - - if zinfo.compress_type == zipfile.ZIP_STORED: - total_read = 0 - crc = None - while total_read < zinfo.compress_size: - if zinfo.compress_size - total_read < block_size: - block_size = zinfo.compress_size - total_read - buff = self.fp.read(block_size) - destfile.write(buff) - total_read += (block_size) - if crc: - crc = binascii.crc32(buff, crc) - else: - crc = binascii.crc32(buff) - destfile.close() - self.fp.seek(filepos, 0) - if crc and crc != zinfo.CRC: - raise zipfile.BadZipfile, "Bad CRC-32 for file %s" % name - return - elif zinfo.compress_type != zipfile.ZIP_DEFLATED: - raise zipfile.BadZipfile, \ - "Unsupported compression method %d for file %s" % \ - (zinfo.compress_type, name) - - if not zlib: - raise RuntimeError, \ - "De-compression requires the (missing) zlib module" - # zlib compress/decompress code by Jeremy Hylton of CNRI - dc = zlib.decompressobj(-15) - - total_read = 0 - crc = None - while total_read < zinfo.compress_size: - if zinfo.compress_size - total_read < block_size: - block_size = zinfo.compress_size - total_read - buff = self.fp.read(block_size) - dcbuff = dc.decompress(dc.unconsumed_tail + buff) - destfile.write(dcbuff) - total_read += block_size - if crc: - crc = binascii.crc32(dcbuff, crc) - else: - crc = binascii.crc32(dcbuff) - - # need to feed in unused pad byte so that zlib won't choke - ex = dc.decompress(dc.unconsumed_tail + 'Z') + dc.flush() - if ex: - if crc: - crc = binascii.crc32(ex, crc) - else: - crc = binascii.crc32(ex) - destfile.write(ex) - - if crc and crc != zinfo.CRC: - raise zipfile.BadZipfile, "Bad CRC-32 for file %s" % name - - destfile.close() - self.fp.seek(filepos, 0) - - -class ArchiveZip(ArchiveBase): - """ArchiveZip handles zip archives. - - Being a zip archive PiSi packages also use this class - extensively. This class provides unpacking and packing magic for - zip archives.""" - - symmagic = 2716663808 #long of hex val '0xA1ED0000L' - - def __init__(self, file_path, arch_type = "zip", mode = 'r'): - super(ArchiveZip, self).__init__(file_path, arch_type) - - self.zip_obj = MyZipFile(self.file_path, mode) - - def close(self): - """Close the zip archive.""" - self.zip_obj.close() - - def add_to_archive(self, file_name, arc_name=None): - """Add file or directory path to the zip file""" - # It's a pity that zipfile can't handle unicode strings. Grrr! - file_name = str(file_name) - if os.path.isdir(file_name) and not os.path.islink(file_name): - self.zip_obj.writestr(file_name + '/', '') - attr_obj = self.zip_obj.getinfo(file_name + '/') - attr_obj.external_attr = stat.S_IMODE(os.stat(file_name)[0]) << 16L - for f in os.listdir(file_name): - self.add_to_archive(os.path.join(file_name, f)) - else: - if os.path.islink(file_name): - dest = os.readlink(file_name) - attr = zipfile.ZipInfo() - attr.filename = file_name - attr.create_system = 3 - attr.external_attr = self.symmagic - self.zip_obj.writestr(attr, dest) - else: - comp_type = zipfile.ZIP_DEFLATED - if file_name.endswith(".lzma"): - comp_type = zipfile.ZIP_STORED - self.zip_obj.write(file_name, arc_name, comp_type) - - if not arc_name: - zinfo = self.zip_obj.getinfo(file_name) - else: - zinfo = self.zip_obj.getinfo(arc_name) - zinfo.create_system = 3 - - def add_basename_to_archive(self, file_name): - """Add only the basepath to the zip file. For example; if the given - file_name parameter is /usr/local/bin/somedir, this function - will create only the base directory/file somedir in the - archive.""" - cwd = os.getcwd() - path_name = os.path.dirname(file_name) - file_name = os.path.basename(file_name) - if path_name: - os.chdir(path_name) - self.add_to_archive(file_name) - os.chdir(cwd) - - def has_file(self, file_path): - """ Returns true if file_path is member of the zip archive""" - return file_path in self.zip_obj.namelist() - - def read_file(self, file_path): - return self.zip_obj.read(file_path) - - def unpack_file_cond(self, pred, target_dir, archive_root = ''): - """Unpack/Extract files according to predicate function - pred: filename -> bool - unpacks stuff into target_dir and only extracts files - from archive_root, treating it as the archive root""" - zip_obj = self.zip_obj - for info in zip_obj.infolist(): - if pred(info.filename): # check if condition holds - - # below code removes that, so we find it here - is_dir = info.filename.endswith('/') - - # calculate output file name - if archive_root == '': - outpath = info.filename - else: - # change archive_root - if util.subpath(archive_root, info.filename): - outpath = util.removepathprefix(archive_root, - info.filename) - else: - continue # don't extract if not under - - ofile = os.path.join(target_dir, outpath) - - if is_dir: # this is a directory - d = os.path.join(target_dir, outpath) - if not os.path.isdir(d): - os.makedirs(d) - perm = info.external_attr - perm &= 0xFFFF0000 - perm >>= 16 - perm |= 0x00000100 - os.chmod(d, perm) - continue - - # check that output dir is present - util.check_dir(os.path.dirname(ofile)) - - # remove output file we might be overwriting. - # (also check for islink? for broken symlinks...) - if os.path.isfile(ofile) or os.path.islink(ofile): - os.remove(ofile) - - if info.external_attr == self.symmagic: - if os.path.isdir(ofile): - shutil.rmtree(ofile) # a rare case, the file used to be a dir, now it is a symlink! - target = zip_obj.read(info.filename) - os.symlink(target, ofile) - else: - perm = info.external_attr - perm &= 0x08FF0000 - perm >>= 16 - perm |= 0x00000100 - zip_obj.decompressToFile(info.filename, ofile) - os.chmod(ofile, perm) - - def unpack_files(self, paths, target_dir): - self.unpack_file_cond(lambda f:f in paths, target_dir) - - def unpack_dir(self, path, target_dir): - self.unpack_file_cond(lambda f:util.subpath(path, f), target_dir) - - def unpack_dir_flat(self, path, target_dir): - self.unpack_file_cond(lambda f:util.subpath(path, f), target_dir, path) - - def unpack(self, target_dir, clean_dir=False): - super(ArchiveZip, self).unpack(target_dir, clean_dir) - - self.unpack_file_cond(lambda f: True, target_dir) - self.close() - return - - -class Archive: - """Archive is the main factory for ArchiveClasses, regarding the - Abstract Factory Pattern :).""" - - def __init__(self, file_path, arch_type): - """accepted archive types: - targz, tarbz2, zip, tar""" - - handlers = { - 'targz': ArchiveTar, - 'tarbz2': ArchiveTar, - 'tarlzma': ArchiveTar, - 'tar': ArchiveTar, - 'zip': ArchiveZip, - 'binary': ArchiveBinary - } - - self.archive = handlers.get(arch_type)(file_path, arch_type) - - def unpack(self, target_dir, clean_dir = False): - self.archive.unpack(target_dir, clean_dir) - - def unpack_files(self, files, target_dir): - self.archive.unpack_files(files, target_dir) diff --git a/tags/pisi-1.1_rc10/pisi/atomicoperations.py b/tags/pisi-1.1_rc10/pisi/atomicoperations.py deleted file mode 100644 index 73c95870..00000000 --- a/tags/pisi-1.1_rc10/pisi/atomicoperations.py +++ /dev/null @@ -1,566 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -"""Atomic package operations such as install/remove/upgrade""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import sys -import os -import bsddb3.db as db - -import pisi -import pisi.context as ctx -import pisi.packagedb as packagedb -import pisi.dependency as dependency -import pisi.conflict -import pisi.util as util -from pisi.specfile import * -from pisi.metadata import MetaData -from pisi.files import Files -from pisi.uri import URI -import pisi.ui -from pisi.version import Version - -class Error(pisi.Error): - pass - -class NotfoundError(pisi.Error): - pass - -# single package operations - -class AtomicOperation(object): - - def __init__(self, ignore_dep = None): - #self.package = package - if ignore_dep==None: - self.ignore_dep = ctx.config.get_option('ignore_dependency') - else: - self.ignore_dep = ignore_dep - - def run(self, package): - "perform an atomic package operation" - pass - - -class Install(AtomicOperation): - "Install class, provides install routines for pisi packages" - - @staticmethod - def from_name(name, ignore_dep = None): - # download package and return an installer object - # find package in repository - repo = ctx.packagedb.which_repo(name) - if repo: - ctx.ui.info(_("Package %s found in repository %s") % (name, repo)) - repo = ctx.repodb.get_repo(repo) - pkg = ctx.packagedb.get_package(name) - - # FIXME: let pkg.packageURI be stored as URI type rather than string - pkg_uri = URI(pkg.packageURI) - if pkg_uri.is_absolute_path(): - pkg_path = str(pkg.packageURI) - else: - pkg_path = os.path.join(os.path.dirname(repo.indexuri.get_uri()), - str(pkg_uri.path())) - - ctx.ui.info(_("Package URI: %s") % pkg_path, verbose=True) - - return Install(pkg_path, ignore_dep) - else: - raise Error(_("Package %s not found in any active repository.") % name) - - def __init__(self, package_fname, ignore_dep = None, ignore_file_conflicts = None): - "initialize from a file name" - super(Install, self).__init__(ignore_dep) - if not ignore_file_conflicts: - ignore_file_conflicts = ctx.get_option('ignore_file_conflicts') - self.ignore_file_conflicts = ignore_file_conflicts - self.package_fname = package_fname - self.package = pisi.package.Package(package_fname) - self.package.read() - self.metadata = self.package.metadata - self.files = self.package.files - self.pkginfo = self.metadata.package - - def install(self, ask_reinstall = True): - if ctx.get_option('fetch_only'): - return - - ctx.ui.status(_('Installing %s, version %s, release %s, build %s') % - (self.pkginfo.name, self.pkginfo.version, - self.pkginfo.release, self.pkginfo.build)) - ctx.ui.notify(pisi.ui.installing, package=self.pkginfo, files=self.files) - - self.ask_reinstall = ask_reinstall - self.check_requirements() - self.check_relations() - self.check_reinstall() - self.extract_install() - - ctx.disable_keyboard_interrupts() - self.store_pisi_files() - self.postinstall() - - txn = ctx.dbenv.txn_begin() - try: - self.update_databases(txn) - txn.commit() - except db.DBError, e: - txn.abort() - raise e - - ctx.enable_keyboard_interrupts() - - ctx.ui.close() - if self.upgrade: - event = pisi.ui.upgraded - else: - event = pisi.ui.installed - ctx.ui.notify(event, package = self.pkginfo, files = self.files) - - def check_requirements(self): - """check system requirements""" - #TODO: IS THERE ENOUGH SPACE? - # what to do if / is split into /usr, /var, etc. - # check comar - if self.metadata.package.providesComar and ctx.comar: - import pisi.comariface as comariface - com = comariface.get_comar() - - def check_relations(self): - # check dependencies - if not ctx.config.get_option('ignore_dependency'): - if not self.pkginfo.installable(): - ctx.ui.error(_('Dependencies for %s not satisfied') % - self.pkginfo.name) - raise Error(_("Package not installable")) - - # check if package is in database - # If it is not, put it into 3rd party packagedb - if not ctx.packagedb.has_package(self.pkginfo.name): - ctx.packagedb.add_package(self.pkginfo, pisi.itembyrepodb.thirdparty) - - # check file conflicts - file_conflicts = [] - for file in self.files.list: - if ctx.filesdb.has_file(file.path): - pkg, existing_file = ctx.filesdb.get_file(file.path) - dst = pisi.util.join_path(ctx.config.dest_dir(), file.path) - if pkg != self.pkginfo.name and not os.path.isdir(dst): - file_conflicts.append( (pkg, existing_file) ) - if file_conflicts: - file_conflicts_str = "" - for (pkg, existing_file) in file_conflicts: - file_conflicts_str += _("/%s from %s package\n") % (existing_file.path, pkg) - msg = _('File conflicts:\n%s') % file_conflicts_str - if self.ignore_file_conflicts: - ctx.ui.warning(msg) - else: - raise Error(msg) - - def check_reinstall(self): - "check reinstall, confirm action, and schedule reinstall" - - pkg = self.pkginfo - - self.reinstall = False - self.upgrade = False - if ctx.installdb.is_installed(pkg.name): # is this a reinstallation? - - #FIXME: consider REPOSITORY instead of DISTRIBUTION -- exa - #ipackage = ctx.packagedb.get_package(pkg.name, pisi.itembyrepodb.installed) - ipkg = ctx.installdb.get_info(pkg.name) - repomismatch = ipkg.distribution != pkg.distribution - - (iversion, irelease, ibuild) = ctx.installdb.get_version(pkg.name) - - # determine if same version - self.same_ver = False - ignore_build = ctx.config.options and ctx.config.options.ignore_build_no - if repomismatch or (not ibuild) or (not pkg.build) or ignore_build: - # we don't look at builds to compare two package versions - if Version(pkg.release) == Version(irelease): - self.same_ver = True - else: - if pkg.build == ibuild: - self.same_ver = True - - if self.same_ver: - if self.ask_reinstall: - if not ctx.ui.confirm(_('Re-install same version package?')): - raise Error(_('Package re-install declined')) - else: - upgrade = False - # is this an upgrade? - # determine and report the kind of upgrade: version, release, build - if Version(pkg.version) > Version(iversion): - ctx.ui.info(_('Upgrading to new upstream version')) - upgrade = True - elif Version(pkg.release) > Version(irelease): - ctx.ui.info(_('Upgrading to new distribution release')) - upgrade = True - elif ((not ignore_build) and ibuild and pkg.build - and pkg.build > ibuild): - ctx.ui.info(_('Upgrading to new distribution build')) - upgrade = True - self.upgrade = upgrade - - # is this a downgrade? confirm this action. - if self.ask_reinstall and (not upgrade): - if Version(pkg.version) < Version(iversion): - #x = _('Downgrade to old upstream version?') - x = None - elif Version(pkg.release) < Version(irelease): - x = _('Downgrade to old distribution release?') - else: - x = _('Downgrade to old distribution build?') - if x and not ctx.ui.confirm(x): - raise Error(_('Package downgrade declined')) - - # schedule for reinstall - self.old_files = ctx.installdb.files(pkg.name) - self.old_path = ctx.installdb.pkg_dir(pkg.name, iversion, irelease) - self.reinstall = True - self.remove_old = Remove(pkg.name) - self.remove_old.run_preremove() - - def postinstall(self): - self.config_later = False - if ctx.comar: - import pisi.comariface - try: - ctx.ui.notify(pisi.ui.configuring, package = self.pkginfo, files = self.files) - pisi.comariface.post_install( - self.pkginfo.name, - self.metadata.package.providesComar, - self.package.comar_dir(), - os.path.join(self.package.pkg_dir(), ctx.const.metadata_xml), - os.path.join(self.package.pkg_dir(), ctx.const.files_xml), - ) - ctx.ui.notify(pisi.ui.configured, package = self.pkginfo, files = self.files) - except pisi.comariface.Error: - ctx.ui.warning(_('%s configuration failed.') % self.pkginfo.name) - self.config_later = True - else: - self.config_later = True - - def extract_install(self): - "unzip package in place" - - ctx.ui.notify(pisi.ui.extracting, package = self.pkginfo, files = self.files) - - config_changed = [] - def check_config_changed(config): - changed = False - fpath = pisi.util.join_path(ctx.config.dest_dir(), config.path) - if os.path.exists(fpath) and not os.path.isdir(fpath): - if os.path.islink(fpath): - file = os.readlink(fpath) - if os.path.exists(file) and pisi.util.sha1_data(file) != config.hash: - changed = True - else: - if pisi.util.sha1_file(fpath) != config.hash: - changed = True - - if changed: - config_changed.append(fpath) - if os.path.exists(fpath + '.old'): - os.unlink(fpath + '.old') - os.rename(fpath, fpath + '.old') - - # old config files are kept as they are. New config files from the installed - # packages are saved with ".newconfig" string appended to their names. - def rename_configs(): - for path in config_changed: - newconfig = path + '.newconfig' - oldconfig = path + '.old' - if os.path.exists(newconfig): - os.unlink(newconfig) - os.rename(path, newconfig) - os.rename(oldconfig, path) - - # remove left over files from the old package. - def clean_leftovers(): - new = set(map(lambda x: str(x.path), self.files.list)) - old = set(map(lambda x: str(x.path), self.old_files.list)) - leftover = old - new - old_fileinfo = {} - for fileinfo in self.old_files.list: - old_fileinfo[str(fileinfo.path)] = fileinfo - for path in leftover: - Remove.remove_file(old_fileinfo[path], self.pkginfo.name) - - if self.reinstall: - # get 'config' typed file objects - new = filter(lambda x: x.type == 'config', self.files.list) - old = filter(lambda x: x.type == 'config', self.old_files.list) - - # get config path lists - newconfig = set(map(lambda x: str(x.path), new)) - oldconfig = set(map(lambda x: str(x.path), old)) - - config_overlaps = newconfig & oldconfig - if config_overlaps: - files = filter(lambda x: x.path in config_overlaps, old) - for file in files: - check_config_changed(file) - else: - for file in self.files.list: - if file.type == 'config': - # there may be left over config files - check_config_changed(file) - - self.package.extract_install(ctx.config.dest_dir()) - - if config_changed: - rename_configs() - - if self.reinstall: - clean_leftovers() - - - def store_pisi_files(self): - """put files.xml, metadata.xml, actions.py and COMAR scripts - somewhere in the file system. We'll need these in future...""" - - if self.reinstall: - util.clean_dir(self.old_path) - - ctx.ui.info(_('Storing %s, ') % ctx.const.files_xml, verbose=True) - self.package.extract_file(ctx.const.files_xml, self.package.pkg_dir()) - - ctx.ui.info(_('Storing %s.') % ctx.const.metadata_xml, verbose=True) - self.package.extract_file(ctx.const.metadata_xml, self.package.pkg_dir()) - - for pcomar in self.metadata.package.providesComar: - fpath = os.path.join(ctx.const.comar_dir, pcomar.script) - # comar prefix is added to the pkg_dir while extracting comar - # script file. so we'll use pkg_dir as destination. - ctx.ui.info(_('Storing %s') % fpath, verbose=True) - self.package.extract_file(fpath, self.package.pkg_dir()) - - def update_databases(self, txn): - "update databases" - if self.reinstall: - self.remove_old.remove_db(txn) - - # installdb - ctx.installdb.install(self.metadata.package.name, - self.metadata.package.version, - self.metadata.package.release, - self.metadata.package.build, - self.metadata.package.distribution, - config_later = self.config_later, - txn = txn) - - # filesdb - ctx.filesdb.add_files(self.metadata.package.name, self.files, txn=txn) - - # installed packages - ctx.packagedb.add_package(self.pkginfo, pisi.itembyrepodb.installed, txn=txn) - - -def install_single(pkg, upgrade = False): - """install a single package from URI or ID""" - url = URI(pkg) - # Check if we are dealing with a remote file or a real path of - # package filename. Otherwise we'll try installing a package from - # the package repository. - if url.is_remote_file() or os.path.exists(url.uri): - install_single_file(pkg, upgrade) - else: - install_single_name(pkg, upgrade) - -# FIXME: Here and elsewhere pkg_location must be a URI -def install_single_file(pkg_location, upgrade = False): - """install a package file""" - Install(pkg_location).install(not upgrade) - -def install_single_name(name, upgrade = False): - """install a single package from ID""" - install = Install.from_name(name) - install.install(not upgrade) - -class Remove(AtomicOperation): - - def __init__(self, package_name, ignore_dep = None): - super(Remove, self).__init__(ignore_dep) - self.package_name = package_name - self.package = ctx.packagedb.get_package(self.package_name, pisi.itembyrepodb.installed) - try: - self.files = ctx.installdb.files(self.package_name) - except pisi.Error, e: - # for some reason file was deleted, we still allow removes! - ctx.ui.error(unicode(e)) - ctx.ui.warning(_('File list could not be read for package %s, continuing removal.') % package_name) - self.files = Files() - - def run(self): - """Remove a single package""" - - ctx.ui.status(_('Removing package %s') % self.package_name) - ctx.ui.notify(pisi.ui.removing, package = self.package, files = self.files) - if not ctx.installdb.is_installed(self.package_name): - raise Exception(_('Trying to remove nonexistent package ') - + self.package_name) - - self.check_dependencies() - - self.run_preremove() - for fileinfo in self.files.list: - self.remove_file(fileinfo, self.package_name) - - txn = ctx.dbenv.txn_begin() - try: - self.remove_db(txn) - txn.commit() - except db.DBError, e: - txn.abort() - raise e - - self.remove_pisi_files() - ctx.ui.close() - ctx.ui.notify(pisi.ui.removed, package = self.package, files = self.files) - - def check_dependencies(self): - #FIXME: why is this not implemented? -- exa - #we only have to check the dependencies to ensure the - #system will be consistent after this removal - pass - # is there any package who depends on this package? - - @staticmethod - def remove_file(fileinfo, package_name): - fpath = pisi.util.join_path(ctx.config.dest_dir(), fileinfo.path) - - # we should check if the file belongs to another - # package (this can legitimately occur while upgrading - # two packages such that a file has moved from one package to - # another as in #2911) - if ctx.filesdb.has_file(fileinfo.path): - pkg, existing_file = ctx.filesdb.get_file(fileinfo.path) - if pkg != package_name: - ctx.ui.warning(_('Not removing conflicted file : %s') % fpath) - return - - if fileinfo.permanent: - # do not remove precious files :) - pass - elif fileinfo.type == ctx.const.conf: - # config files are precious, leave them as they are - # unless they are the same as provided by package. - try: - if pisi.util.sha1_file(fpath) == fileinfo.hash: - os.unlink(fpath) - except pisi.util.FileError, e: - pass - else: - if os.path.isfile(fpath) or os.path.islink(fpath): - os.unlink(fpath) - elif os.path.isdir(fpath) and not os.listdir(fpath): - os.rmdir(fpath) - else: - ctx.ui.warning(_('Installed file %s is not exists on system [Probably you manually deleted]') % fpath) - return - - # remove emptied directories - dpath = os.path.dirname(fpath) - while dpath != '/' and not os.listdir(dpath): - os.rmdir(dpath) - dpath = os.path.dirname(dpath) - - def run_preremove(self): - if ctx.comar: - import pisi.comariface - pisi.comariface.pre_remove( - self.package_name, - os.path.join(self.package.pkg_dir(), ctx.const.metadata_xml), - os.path.join(self.package.pkg_dir(), ctx.const.files_xml), - ) - - def remove_pisi_files(self): - util.clean_dir(self.package.pkg_dir()) - - def remove_db(self, txn): - ctx.installdb.remove(self.package_name, txn) - ctx.filesdb.remove_files(self.files, txn) - pisi.packagedb.remove_tracking_package(self.package_name, txn) - - -def remove_single(package_name): - Remove(package_name).run() - -def build(package): - # wrapper for build op - import pisi.build - return pisi.build.build(package) - -def virtual_install(metadata, files, txn): - """Recreate the package info for rebuilddb command""" - # installdb - ctx.installdb.install(metadata.package.name, - metadata.package.version, - metadata.package.release, - metadata.package.build, - metadata.package.distribution, - rebuild=True, - txn=txn) - - # filesdb - if files: - ctx.filesdb.add_files(metadata.package.name, files, txn=txn) - - # installed packages - ctx.packagedb.add_package(metadata.package, pisi.itembyrepodb.installed, txn=txn) - -def resurrect_package(package_fn, write_files, txn = None): - """Resurrect the package from xml files""" - - from os.path import exists - - metadata_xml = util.join_path(ctx.config.lib_dir(), 'package', - package_fn, ctx.const.metadata_xml) - if not exists(metadata_xml): - raise Error, _("Metadata XML '%s' cannot be found") % metadata_xml - - metadata = MetaData() - metadata.read(metadata_xml) - - errs = metadata.errors() - if errs: - util.print_errors(errs) - raise Error, _("MetaData format wrong (%s)") % package_fn - - ctx.ui.info(_('* Adding \'%s\' to db... ') % (metadata.package.name), noln=True) - - if write_files: - files_xml = util.join_path(ctx.config.lib_dir(), 'package', - package_fn, ctx.const.files_xml) - if not exists(files_xml): - raise Error, _("Files XML '%s' cannot be found") % files_xml - - files = Files() - files.read(files_xml) - if files.errors(): - raise Error, _("Invalid %s") % ctx.const.files_xml - else: - files = None - - #import pisi.atomicoperations - def f(t): - pisi.atomicoperations.virtual_install(metadata, files, t) - ctx.txn_proc(f, txn) - - ctx.ui.info(_('OK.')) diff --git a/tags/pisi-1.1_rc10/pisi/build.py b/tags/pisi-1.1_rc10/pisi/build.py deleted file mode 100644 index 0db8791a..00000000 --- a/tags/pisi-1.1_rc10/pisi/build.py +++ /dev/null @@ -1,992 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -"""package building code""" - -# python standard library -import os -import sys -import glob -from copy import deepcopy -from os.path import basename, dirname -from stat import S_IMODE -from pwd import getpwnam -from grp import getgrnam - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -from pisi.specfile import SpecFile -import pisi.util as util -from pisi.util import join_path as join, parenturi -from pisi.file import File -import pisi.context as ctx -import pisi.dependency as dependency -import pisi.operations as operations -from pisi.sourcearchive import SourceArchive -from pisi.files import Files, FileInfo -from pisi.fetcher import fetch_url -from pisi.uri import URI -from pisi.metadata import MetaData -from pisi.package import Package -import pisi.component as component -import pisi.archive as archive -import pisi.actionsapi.variables - - -class Error(pisi.Error): - pass - - -# Helper Functions -def get_file_type(path, pinfo_list, install_dir): - """Return the file type of a path according to the given PathInfo - list""" - - Match = lambda x: [match for match in glob.glob(install_dir + x) if join(install_dir, path).find(match) > -1] - - def Sort(x): - x.sort(reverse=True) - return x - - best_matched_path = Sort([pinfo.path for pinfo in pinfo_list if Match(pinfo.path)])[0] - info = [pinfo for pinfo in pinfo_list if best_matched_path == pinfo.path][0] - return info.fileType, info.permanent - -def check_path_collision(package, pkgList): - """This function will check for collision of paths in a package with - the paths of packages in pkgList. The return value will be the - list containing the paths that collide.""" - collisions = [] - for pinfo in package.files: - for pkg in pkgList: - if pkg is package: - continue - for path in pkg.files: - # if pinfo.path is a subpath of path.path like - # the example below. path.path is marked as a - # collide. Exp: - # pinfo.path: /usr/share - # path.path: /usr/share/doc - if (path.path.endswith(ctx.const.ar_file_suffix) and ctx.get_option('create_static')) or \ - (path.path.endswith(ctx.const.debug_file_suffix) and ctx.config.values.build.generatedebug): - # don't throw collision error for these files. - # we'll handle this in gen_files_xml.. - continue - if util.subpath(pinfo.path, path.path): - collisions.append(path.path) - ctx.ui.debug(_('Path %s belongs in multiple packages') % - path.path) - return collisions - - -class Builder: - """Provides the package build and creation routines""" - #FIXME: this class and every other class must use URLs as paths! - - @staticmethod - def from_name(name): - # download package and return an installer object - # find package in repository - sf, reponame = ctx.sourcedb.get_spec_repo(name) - src = sf.source - if src: - - src_uri = URI(src.sourceURI) - if src_uri.is_absolute_path(): - src_path = str(src_uri) - else: - repo = ctx.repodb.get_repo(reponame) - #FIXME: don't use dirname to work on URLs - src_path = os.path.join(os.path.dirname(repo.indexuri.get_uri()), - str(src_uri.path())) - - ctx.ui.debug(_("Source URI: %s") % src_path) - - return Builder(src_path) - else: - raise Error(_("Source %s not found in any active repository.") % name) - - def __init__(self, specuri): - - # process args - if not isinstance(specuri, URI): - specuri = URI(specuri) - - # read spec file, we'll need it :) - self.set_spec_file(specuri) - - if specuri.is_remote_file(): - self.specdir = self.fetch_files() - else: - self.specdir = dirname(self.specuri.get_uri()) - - self.sourceArchive = SourceArchive(self.spec, self.pkg_work_dir()) - - self.set_environment_vars() - - self.actionLocals = None - self.actionGlobals = None - self.srcDir = None - - def set_spec_file(self, specuri): - if not specuri.is_remote_file(): - specuri = URI(os.path.realpath(specuri.get_uri())) # FIXME: doesn't work for file:// - self.specuri = specuri - spec = SpecFile() - spec.read(specuri, ctx.config.tmp_dir()) - self.spec = spec - - # directory accessor functions - - # pkg_x_dir: per package directory for storing info type x - - def pkg_dir(self): - "package build directory" - packageDir = self.spec.source.name + '-' + \ - self.spec.getSourceVersion() + '-' + self.spec.getSourceRelease() - return util.join_path(ctx.config.dest_dir(), ctx.config.values.dirs.tmp_dir, - packageDir) - - def pkg_work_dir(self): - return self.pkg_dir() + ctx.const.work_dir_suffix - - def pkg_debug_dir(self): - return self.pkg_dir() + ctx.const.debug_dir_suffix - - def pkg_install_dir(self): - return self.pkg_dir() + ctx.const.install_dir_suffix - - def set_state(self, state): - stateFile = util.join_path(self.pkg_work_dir(), "pisiBuildState") - open(stateFile, "w").write(state) - - def get_state(self): - stateFile = util.join_path(self.pkg_work_dir(), "pisiBuildState") - if not os.path.exists(stateFile): # no state - return None - return open(stateFile, "r").read() - - def build(self): - """Build the package in one shot.""" - - ctx.ui.status(_("Building PiSi source package: %s") % self.spec.source.name) - - self.compile_action_script() - self.compile_comar_script() - - # check if all patch files exists, if there are missing no need to unpack! - self.patch_exists() - - self.check_build_dependencies() - self.fetch_component() - self.fetch_source_archive() - self.unpack_source_archive() - - # apply the patches and prepare a source directory for build. - self.apply_patches() - - self.run_setup_action() - self.run_build_action() - self.run_install_action() - - # after all, we are ready to build/prepare the packages - return self.build_packages() - - def set_environment_vars(self): - """Sets the environment variables for actions API to use""" - - # Each time a builder is created we must reset - # environment. See bug #2575 - pisi.actionsapi.variables.initVariables() - - env = { - "PKG_DIR": self.pkg_dir(), - "WORK_DIR": self.pkg_work_dir(), - "INSTALL_DIR": self.pkg_install_dir(), - "SRC_NAME": self.spec.source.name, - "SRC_VERSION": self.spec.getSourceVersion(), - "SRC_RELEASE": self.spec.getSourceRelease() - } - os.environ.update(env) - - # First check icecream, if not found use ccache, no need to use both - # together (according to kde-wiki it cause performance loss) - if ctx.config.values.build.buildhelper == "icecream": - if os.path.exists("/opt/icecream/bin/gcc"): - # Add icecream directory for support distributed compiling :) - os.environ["PATH"] = "/opt/icecream/bin/:%s" % os.environ["PATH"] - ctx.ui.info(_("IceCream detected. Make sure your daemon is up and running...")) - elif ctx.config.values.build.buildhelper == "ccache": - if os.path.exists("/usr/lib/ccache/bin/gcc"): - # Add ccache directory for support Compiler Cache :) - os.environ["PATH"] = "/usr/lib/ccache/bin/:%s" % os.environ["PATH"] - ctx.ui.info(_("CCache detected...")) - - def fetch_files(self): - self.specdiruri = dirname(self.specuri.get_uri()) - pkgname = basename(self.specdiruri) - self.destdir = join(ctx.config.tmp_dir(), pkgname) - #self.location = dirname(self.url.uri) - - self.fetch_actionsfile() - self.fetch_patches() - self.fetch_comarfiles() - self.fetch_additionalFiles() - - return self.destdir - - def fetch_actionsfile(self): - actionsuri = join(self.specdiruri, ctx.const.actions_file) - self.download(actionsuri, self.destdir) - - def fetch_patches(self): - spec = self.spec - for patch in spec.source.patches: - file_name = basename(patch.filename) - dir_name = dirname(patch.filename) - patchuri = join(self.specdiruri, - ctx.const.files_dir, dir_name, file_name) - self.download(patchuri, join(self.destdir, ctx.const.files_dir, dir_name)) - - def fetch_comarfiles(self): - spec = self.spec - for package in spec.packages: - for pcomar in package.providesComar: - comaruri = join(self.specdiruri, - ctx.const.comar_dir, pcomar.script) - self.download(comaruri, join(self.destdir, ctx.const.comar_dir)) - - def fetch_additionalFiles(self): - spec = self.spec - for pkg in spec.packages: - for afile in pkg.additionalFiles: - file_name = basename(afile.filename) - dir_name = dirname(afile.filename) - afileuri = join(self.specdiruri, - ctx.const.files_dir, dir_name, file_name) - self.download(afileuri, join(self.destdir, ctx.const.files_dir, dir_name)) - - def download(self, uri, transferdir): - # fix auth info and download - uri = File.make_uri(uri) - File.download(uri, transferdir) - - def fetch_component(self): - if not self.spec.source.partOf: - ctx.ui.warning(_('PartOf tag not defined, looking for component')) - diruri = parenturi(self.specuri.get_uri()) - parentdir = parenturi(diruri) - url = util.join_path(parentdir, 'component.xml') - progress = ctx.ui.Progress - if URI(url).is_remote_file(): - fetch_url(url, self.pkg_work_dir(), progress) - path = util.join_path(self.pkg_work_dir(), 'component.xml') - else: - if not os.path.exists(url): - raise Exception(_('Cannot find component.xml in upper directory')) - path = url - comp = component.Component() - comp.read(path) - ctx.ui.info(_('Source is part of %s component') % comp.name) - self.spec.source.partOf = comp.name - - def fetch_source_archive(self): - ctx.ui.info(_("Fetching source from: %s") % self.spec.source.archive.uri) - self.sourceArchive.fetch() - ctx.ui.info(_("Source archive is stored: %s/%s") - %(ctx.config.archives_dir(), self.spec.source.archive.name)) - - def unpack_source_archive(self): - ctx.ui.info(_("Unpacking archive..."), noln = True) - self.sourceArchive.unpack() - ctx.ui.info(_(" unpacked (%s)") % self.pkg_work_dir()) - self.set_state("unpack") - - def run_setup_action(self): - # Run configure, build and install phase - ctx.ui.action(_("Setting up source...")) - self.run_action_function(ctx.const.setup_func) - self.set_state("setupaction") - - def run_build_action(self): - ctx.ui.action(_("Building source...")) - self.run_action_function(ctx.const.build_func) - self.set_state("buildaction") - - def run_install_action(self): - ctx.ui.action(_("Installing...")) - - # Before install make sure install_dir is clean - if os.path.exists(self.pkg_install_dir()): - util.clean_dir(self.pkg_install_dir()) - - # install function is mandatory! - self.run_action_function(ctx.const.install_func, True) - self.set_state("installaction") - - def get_abandoned_files(self): - # return the files those are not collected from the install dir - - install_dir = self.pkg_dir() + ctx.const.install_dir_suffix - abandoned_files = [] - all_paths_in_packages = [] - - - for package in self.spec.packages: - for path in package.files: - map(lambda p: all_paths_in_packages.append(p), [p for p in glob.glob(install_dir + path.path)]) - - for root, dirs, files in os.walk(install_dir): - for file_ in files: - already_in_package = False - fpath = util.join_path(root, file_) - for path in all_paths_in_packages: - if not fpath.find(path): - already_in_package = True - if not already_in_package: - abandoned_files.append(fpath) - - return abandoned_files - - def compile_action_script(self): - """Compiles given actions.py to check syntax error in it and sets the actionLocals and actionGlobals""" - fname = util.join_path(self.specdir, ctx.const.actions_file) - try: - localSymbols = globalSymbols = {} - buf = open(fname).read() - exec compile(buf, "error", "exec") in localSymbols, globalSymbols - except IOError, e: - raise Error(_("Unable to read Actions Script (%s): %s") %(fname,e)) - except SyntaxError, e: - raise Error(_("SyntaxError in Actions Script (%s): %s") %(fname,e)) - - self.actionLocals = localSymbols - self.actionGlobals = globalSymbols - self.srcDir = self.pkg_src_dir() - - def compile_comar_script(self): - """Compiles comar scripts to check syntax errors""" - for package in self.spec.packages: - for pcomar in package.providesComar: - fname = util.join_path(self.specdir, ctx.const.comar_dir, - pcomar.script) - - try: - buf = open(fname).read() - compile(buf, "error", "exec") - except IOError, e: - raise Error(_("Unable to read COMAR script (%s): %s") %(fname,e)) - except SyntaxError, e: - raise Error(_("SyntaxError in COMAR file (%s): %s") %(fname,e)) - - def pkg_src_dir(self): - """Returns the real path of WorkDir for an unpacked archive.""" - try: - workdir = self.actionGlobals['WorkDir'] - except KeyError: - workdir = self.spec.source.name + "-" + self.spec.getSourceVersion() - - return util.join_path(self.pkg_work_dir(), workdir) - - def run_action_function(self, func, mandatory=False): - """Calls the corresponding function in actions.py. - - If mandatory parameter is True, and function is not present in - actionLocals pisi.build.Error will be raised.""" - # we'll need our working directory after actionscript - # finished its work in the archive source directory. - curDir = os.getcwd() - os.chdir(self.srcDir) - - - if func in self.actionLocals: - self.actionLocals[func]() - else: - if mandatory: - Error, _("unable to call function from actions: %s") %func - - os.chdir(curDir) - - def check_build_dependencies(self): - """check and try to install build dependencies, otherwise fail.""" - - build_deps = self.spec.source.buildDependencies - - if not ctx.get_option('ignore_safety'): - if ctx.componentdb.has_component('system.devel'): - build_deps_names = set([x.package for x in build_deps]) - devel_deps_names = set(ctx.componentdb.get_component('system.devel').packages) - extra_names = devel_deps_names - build_deps_names - extra_names = filter(lambda x: not ctx.installdb.is_installed(x), extra_names) - if extra_names: - ctx.ui.warning(_('Safety switch: following extra packages in system.devel will be installed: ') + - util.strlist(extra_names)) - extra_deps = [dependency.Dependency(package = x) for x in extra_names] - build_deps.extend(extra_deps) - else: - ctx.ui.warning(_('Safety switch: system.devel is already installed')) - else: - ctx.ui.warning(_('Safety switch: the component system.devel cannot be found')) - - # find out the build dependencies that are not satisfied... - dep_unsatis = [] - for dep in build_deps: - if not dependency.installed_satisfies_dep(dep): - dep_unsatis.append(dep) - - if dep_unsatis: - ctx.ui.info(_("Unsatisfied Build Dependencies:") + ' ' - + util.strlist([str(x) for x in dep_unsatis]) ) - - def fail(): - raise Error(_('Cannot build package due to unsatisfied build dependencies')) - - if ctx.config.get_option('no_install'): - fail() - - if not ctx.config.get_option('ignore_dependency'): - for dep in dep_unsatis: - if not dependency.repo_satisfies_dep(dep): - raise Error(_('Build dependency %s cannot be satisfied') % str(dep)) - if ctx.ui.confirm( - _('Do you want to install the unsatisfied build dependencies')): - ctx.ui.info(_('Installing build dependencies.')) - operations.install([dep.package for dep in dep_unsatis]) - else: - fail() - else: - ctx.ui.warning(_('Ignoring build dependencies.')) - - def patch_exists(self): - """check existence of patch files declared in PSPEC""" - - files_dir = os.path.abspath(util.join_path(self.specdir, - ctx.const.files_dir)) - for patch in self.spec.source.patches: - patchFile = util.join_path(files_dir, patch.filename) - if not os.access(patchFile, os.F_OK): - raise Error(_("Patch file is missing: %s\n") % patch.filename) - - def apply_patches(self): - files_dir = os.path.abspath(util.join_path(self.specdir, - ctx.const.files_dir)) - - for patch in self.spec.source.patches: - patchFile = util.join_path(files_dir, patch.filename) - if patch.compressionType: - patchFile = util.uncompress(patchFile, - compressType=patch.compressionType, - targetDir=ctx.config.tmp_dir()) - - ctx.ui.action(_("* Applying patch: %s") % patch.filename) - util.do_patch(self.srcDir, patchFile, level=patch.level, target=patch.target) - - def generate_static_package_object(self): - ar_files = [] - for root, dirs, files in os.walk(self.pkg_install_dir()): - for f in files: - if f.endswith(ctx.const.ar_file_suffix) and util.is_ar_file(util.join_path(root, f)): - ar_files.append(util.join_path(root, f)) - - if not len(ar_files): - return None - - static_package_obj = pisi.specfile.Package() - static_package_obj.name = self.spec.source.name + ctx.const.static_name_suffix - # FIXME: find a better way to deal with the summary and description constants. - static_package_obj.summary['en'] = u'Ar files for %s' % (self.spec.source.name) - static_package_obj.description['en'] = u'Ar files for %s' % (self.spec.source.name) - static_package_obj.partOf = self.spec.source.partOf - for f in ar_files: - static_package_obj.files.append(pisi.specfile.Path(path = f[len(self.pkg_install_dir()):], fileType = "library")) - - # append all generated packages to dependencies - for p in self.spec.packages: - static_package_obj.packageDependencies.append( - pisi.dependency.Dependency(package = p.name)) - - return static_package_obj - - def generate_debug_package_object(self): - debug_files = [] - for root, dirs, files in os.walk(self.pkg_debug_dir()): - for f in files: - if f.endswith(ctx.const.debug_file_suffix): - debug_files.append(util.join_path(root, f)) - - if not len(debug_files): - return None - - debug_package_obj = pisi.specfile.Package() - debug_package_obj.debug_package = True - debug_package_obj.name = self.spec.source.name + ctx.const.debug_name_suffix - # FIXME: find a better way to deal with the summary and description constants. - debug_package_obj.summary['en'] = u'Debug files for %s' % (self.spec.source.name) - debug_package_obj.description['en'] = u'Debug files for %s' % (self.spec.source.name) - debug_package_obj.partOf = self.spec.source.partOf + '-debug' - for f in debug_files: - debug_package_obj.files.append(pisi.specfile.Path(path = f[len(self.pkg_debug_dir()):], fileType = "debug")) - - # append all generated packages to dependencies - for p in self.spec.packages: - debug_package_obj.packageDependencies.append( - pisi.dependency.Dependency(package = p.name)) - - return debug_package_obj - - def strip_install_dir(self): - """strip install directory""" - ctx.ui.action(_("Stripping files..")) - install_dir = self.pkg_install_dir() - try: - nostrip = self.actionGlobals['NoStrip'] - util.strip_directory(install_dir, nostrip) - except KeyError: - util.strip_directory(install_dir) - - def gen_metadata_xml(self, package, build_no=None): - """Generate the metadata.xml file for build source. - - metadata.xml is composed of the information from specfile plus - some additional information.""" - metadata = MetaData() - metadata.from_spec(self.spec.source, package, self.spec.history) - - metadata.package.distribution = ctx.config.values.general.distribution - metadata.package.distributionRelease = ctx.config.values.general.distribution_release - metadata.package.architecture = "Any" - metadata.package.packageFormat = ctx.get_option('package_format') - - size = 0 - if package.debug_package: - d = self.pkg_debug_dir() - else: - d = self.pkg_install_dir() - - for path in package.files: - for p in glob.glob(util.join_path(d, path.path)): - size += util.dir_size(p) - - metadata.package.installedSize = size - - self.metadata = metadata - - def gen_files_xml(self, package): - """Generates files.xml using the path definitions in specfile and - the files produced by the build system.""" - files = Files() - - if package.debug_package: - install_dir = self.pkg_debug_dir() - else: - install_dir = self.pkg_install_dir() - - # FIXME: We need to expand globs before trying to calculate hashes - # Not on the fly like now. - - # we'll exclude collisions in get_file_hashes. Having a - # collisions list is not wrong, we must just handle it :). - collisions = check_path_collision(package, self.spec.packages) - # FIXME: material collisions after expanding globs could be - # reported as errors - - d = {} - def add_path(path): - # add the files under material path - for fpath, fhash in util.get_file_hashes(path, collisions, install_dir): - if ctx.get_option('create_static') \ - and fpath.endswith(ctx.const.ar_file_suffix) \ - and not package.name.endswith(ctx.const.static_name_suffix) \ - and util.is_ar_file(fpath): - # if this is an ar file, and this package is not a static package, - # don't include this file into the package. - continue - frpath = util.removepathprefix(install_dir, fpath) # relative path - ftype, permanent = get_file_type(frpath, package.files, install_dir) - fsize = util.dir_size(fpath) - if not os.path.islink(fpath): - st = os.stat(fpath) - else: - st = os.lstat(fpath) - d[frpath] = FileInfo(path=frpath, type=ftype, permanent=permanent, - size=fsize, hash=fhash, uid=str(st.st_uid), gid=str(st.st_gid), - mode=oct(S_IMODE(st.st_mode))) - - for pinfo in package.files: - wildcard_path = util.join_path(install_dir, pinfo.path) - for path in glob.glob(wildcard_path): - add_path(path) - - for (p, fileinfo) in d.iteritems(): - files.append(fileinfo) - - files_xml_path = util.join_path(self.pkg_dir(), ctx.const.files_xml) - files.write(files_xml_path) - self.files = files - - def calc_build_no(self, package_name): - """Calculate build number""" - - def metadata_changed(old_metadata, new_metadata): - for key in old_metadata.package.__dict__.keys(): - if old_metadata.package.__dict__[key] != new_metadata.package.__dict__[key]: - if key != "build": - return True - - return False - - # find previous build in packages dir - found = [] - def locate_old_package(old_package_fn): - if util.is_package_name(os.path.basename(old_package_fn), package_name): - try: - old_pkg = Package(old_package_fn, 'r') - old_pkg.read(util.join_path(ctx.config.tmp_dir(), 'oldpkg')) - ctx.ui.info(_('(found old version %s)') % old_package_fn) - if str(old_pkg.metadata.package.name) != package_name: - ctx.ui.warning(_('Skipping %s with wrong pkg name ') % - old_package_fn) - return - old_build = old_pkg.metadata.package.build - found.append( (old_package_fn, old_build) ) - except Error: - ctx.ui.warning('Package file %s may be corrupt. Skipping.' % old_package_fn) - - for root, dirs, files in os.walk(ctx.config.packages_dir()): - for file in files: - locate_old_package(join(root,file)) - - outdir=ctx.get_option('output_dir') - if not outdir: - outdir = '.' - for file in [join(outdir,entry) for entry in os.listdir(outdir)]: - if os.path.isfile(file): - locate_old_package(file) - - if not found: - return (1, None) - ctx.ui.warning(_('(no previous build found, setting build no to 1.)')) - else: - a = filter(lambda (x,y): y != None, found) - ctx.ui.debug(str(a)) - if a: - # sort in order of increasing build number - a.sort(lambda x,y : cmp(x[1],y[1])) - old_package_fn = a[-1][0] # get the last one - old_build = a[-1][1] - - # compare old files.xml with the new one.. - old_pkg = Package(old_package_fn, 'r') - old_pkg.read(util.join_path(ctx.config.tmp_dir(), 'oldpkg')) - - changed = False - fnew = self.files.list - fold = old_pkg.files.list - fold.sort(lambda x,y : cmp(x.path,y.path)) - fnew.sort(lambda x,y : cmp(x.path,y.path)) - - if len(fnew) != len(fold): - changed = True - else: - for i in range(len(fold)): - fo = fold.pop(0) - fn = fnew.pop(0) - if fo.path != fn.path: - changed = True - break - else: - if fo.hash != fn.hash: - changed = True - break - - if metadata_changed(old_pkg.metadata, self.metadata): - changed = True - - self.old_packages.append(os.path.basename(old_package_fn)) - else: # no old build had a build number - old_build = None - - ctx.ui.debug('old build number: %s' % old_build) - - # set build number - if old_build is None: - ctx.ui.warning(_('(old package lacks a build no, setting build no to 1.)')) - return (1, None) - elif changed: - ctx.ui.info(_('There are changes, incrementing build no to %d') % (old_build + 1)) - return (old_build + 1, old_build) - else: - ctx.ui.info(_('There is no change from previous build %d') % old_build) - return (old_build, old_build) - - def build_packages(self): - """Build each package defined in PSPEC file. After this process there - will be .pisi files hanging around, AS INTENDED ;)""" - - self.fetch_component() # bug 856 - - # Strip install directory before building .pisi packages. - self.strip_install_dir() - - if ctx.get_option('create_static'): - obj = self.generate_static_package_object() - if obj: - self.spec.packages.append(obj) - - if ctx.config.values.build.generatedebug: - obj = self.generate_debug_package_object() - if obj: - self.spec.packages.append(obj) - - self.new_packages = [] - self.old_packages = [] - - for package in self.spec.packages: - - # removing "farce" in specfile.py:SpecFile.override_tags - # this block of code came here... SpecFile should never - # ever ruin the generated PSPEC file. If build process - # needs this, we should do it in here... (bug: #3773) - if not package.summary: - package.summary = self.spec.source.summary - if not package.description: - # TODO: remove this if statement with the part in - # specfile.py:SpecFile - if not self.spec.source.description: - self.spec.dirtyWorkAround() - - package.description = self.spec.source.description - if not package.partOf: - package.partOf = self.spec.source.partOf - if not package.license: - package.license = self.spec.source.license - if not package.icon: - package.icon = self.spec.source.icon - - - - old_package_name = None - # store additional files - c = os.getcwd() - os.chdir(self.specdir) - install_dir = self.pkg_dir() + ctx.const.install_dir_suffix - for afile in package.additionalFiles: - src = os.path.join(ctx.const.files_dir, afile.filename) - dest = os.path.join(install_dir + os.path.dirname(afile.target), os.path.basename(afile.target)) - util.copy_file(src, dest) - if afile.permission: - # mode is octal! - os.chmod(dest, int(afile.permission, 8)) - if afile.owner: - try: - os.chown(dest, getpwnam(afile.owner)[2], -1) - except KeyError: - ctx.ui.warning(_("No user named '%s' found on the system") % afile.owner) - if afile.group: - try: - os.chown(dest, -1, getgrnam(afile.group)[2]) - except KeyError: - ctx.ui.warning(_("No group named '%s' found on the system") % afile.group) - os.chdir(c) - - ctx.ui.action(_("** Building package %s") % package.name); - - ctx.ui.info(_("Generating %s,") % ctx.const.files_xml) - self.gen_files_xml(package) - - ctx.ui.info(_("Generating %s,") % ctx.const.metadata_xml) - self.gen_metadata_xml(package) - - # build number - if ctx.config.options.ignore_build_no or not ctx.config.values.build.buildno: - build_no = old_build_no = None - ctx.ui.warning(_('Build number is not available. For repo builds you must enable buildno in pisi.conf.')) - else: - build_no, old_build_no = self.calc_build_no(package.name) - - self.metadata.package.build = build_no - self.metadata.write(util.join_path(self.pkg_dir(), ctx.const.metadata_xml)) - - # Calculate new and oldpackage names for buildfarm - name = util.package_name(package.name, - self.spec.getSourceVersion(), - self.spec.getSourceRelease(), - self.metadata.package.build) - - outdir = ctx.get_option('output_dir') - if outdir: - name = pisi.util.join_path(outdir, name) - self.new_packages.append(name) - - ctx.ui.info(_("Creating PiSi package %s.") % name) - - pkg = Package(name, 'w') - - # add comar files to package - os.chdir(self.specdir) - for pcomar in package.providesComar: - fname = util.join_path(ctx.const.comar_dir, - pcomar.script) - pkg.add_to_package(fname) - - # add xmls and files - os.chdir(self.pkg_dir()) - - pkg.add_to_package(ctx.const.metadata_xml) - pkg.add_to_package(ctx.const.files_xml) - - # Now it is time to add files to the packages using newly - # created files.xml - files = Files() - files.read(ctx.const.files_xml) - - if ctx.get_option('package_format') == "1.0": - for finfo in files.list: - orgname = arcname = join("install", finfo.path) - if package.debug_package: - orgname = join("debug", finfo.path) - pkg.add_to_package(orgname, arcname) - pkg.close() - else: # default package format is 1.1, so make it fallback. - ctx.build_leftover = join(self.pkg_dir(), ctx.const.install_tar_lzma) - tar = archive.ArchiveTar(ctx.const.install_tar_lzma, "tarlzma") - for finfo in files.list: - orgname = arcname = join("install", finfo.path) - if package.debug_package: - orgname = join("debug", finfo.path) - tar.add_to_archive(orgname, arcname.lstrip("install")) - tar.close() - pkg.add_to_package(ctx.const.install_tar_lzma) - pkg.close() - os.unlink(ctx.const.install_tar_lzma) - ctx.build_leftover = None - - os.chdir(c) - self.set_state("buildpackages") - ctx.ui.info(_("Done.")) - - #show the files those are not collected from the install dir - if ctx.get_option('debug'): - abandoned_files = self.get_abandoned_files() - if abandoned_files: - ctx.ui.warning(_('Abandoned files under the install dir (%s):') % (install_dir)) - for f in abandoned_files: - ctx.ui.info(' - %s' % (f)) - else: - ctx.ui.warning(_('All of the files under the install dir (%s) has been collected by package(s)') - % (install_dir)) - - if ctx.config.values.general.autoclean is True: - ctx.ui.info(_("Cleaning Build Directory...")) - util.clean_dir(self.pkg_dir()) - else: - ctx.ui.info(_("Keeping Build Directory")) - - - # reset environment variables after build. this one is for - # buildfarm actually. buildfarm re-inits pisi for each build - # and left environment variables go directly into initial dict - # making actionsapi.variables.exportFlags() useless... - os.environ = {} - os.environ = deepcopy(ctx.config.environ) - - return self.new_packages, self.old_packages - - -# build functions... - -def build(pspec): - if pspec.endswith('.xml'): - pb = Builder(pspec) - else: - pb = Builder.from_name(pspec) - return pb.build() - -order = {"none": 0, - "fetch": 1, - "unpack": 2, - "setupaction": 3, - "buildaction": 4, - "installaction": 5, - "buildpackages": 6} - -def __buildState_fetch(pb): - # fetch is the first state to run. - pb.patch_exists() - pb.fetch_source_archive() - -def __buildState_unpack(pb, last): - if order[last] < order["fetch"]: - __buildState_fetch(pb) - pb.unpack_source_archive() - pb.apply_patches() - -def __buildState_setupaction(pb, last): - if order[last] < order["unpack"]: - __buildState_unpack(pb, last) - pb.run_setup_action() - -def __buildState_buildaction(pb, last): - - if order[last] < order["setupaction"]: - __buildState_setupaction(pb, last) - pb.run_build_action() - -def __buildState_installaction(pb, last): - - if order[last] < order["buildaction"]: - __buildState_buildaction(pb, last) - pb.run_install_action() - -def __buildState_buildpackages(pb, last): - - if order[last] < order["installaction"]: - __buildState_installaction(pb, last) - pb.build_packages() - -def build_until(pspec, state): - if pspec.endswith('.xml'): - pb = Builder(pspec) - else: - pb = Builder.from_name(pspec) - - pb.compile_action_script() - pb.compile_comar_script() - - last = pb.get_state() - ctx.ui.info("Last state was %s"%last) - - if not last: last = "none" - - if state == "fetch": - __buildState_fetch(pb) - return - - if state == "unpack": - __buildState_unpack(pb, last) - return - - if state == "setup": - __buildState_setupaction(pb, last) - return - - if state == "build": - __buildState_buildaction(pb, last) - return - - if state == "install": - __buildState_installaction(pb, last) - return - - __buildState_buildpackages(pb, last) diff --git a/tags/pisi-1.1_rc10/pisi/catbox.patch b/tags/pisi-1.1_rc10/pisi/catbox.patch deleted file mode 100644 index 17f26bc3..00000000 --- a/tags/pisi-1.1_rc10/pisi/catbox.patch +++ /dev/null @@ -1,51 +0,0 @@ -Index: build.py -=================================================================== ---- build.py (revision 10048) -+++ build.py (working copy) -@@ -193,13 +193,30 @@ - # apply the patches and prepare a source directory for build. - self.apply_patches() - -+ if ctx.get_option('use_catbox'): -+ import catbox -+ ret = catbox.run( -+ self.sandboxed, -+ ["/var/pisi", "/tmp", "/dev/tty", "/dev/null"], -+ logger = self.sandbox_logger -+ ) -+ if ret != 0: -+ raise Error, "actions.py borked" -+ else: -+ self.sandboxed() -+ -+ # after all, we are ready to build/prepare the packages -+ return self.build_packages() -+ -+ def sandbox_logger(self, event, data): -+ if event == "denied": -+ ctx.ui.error("Access denied to '%s'" % data) -+ -+ def sandboxed(self): - self.run_setup_action() - self.run_build_action() - self.run_install_action() - -- # after all, we are ready to build/prepare the packages -- return self.build_packages() -- - def set_environment_vars(self): - """Sets the environment variables for actions API to use""" - -Index: cli/commands.py -=================================================================== ---- cli/commands.py (revision 10048) -+++ cli/commands.py (working copy) -@@ -452,6 +452,8 @@ - default=False, help=_("Do not install build dependencies, fail if a build dependency is present")) - group.add_option("-F", "--package-format", action="store", default='1.1', - help=_("PiSi binary package formats: '1.0', '1.1' (default)")) -+ self.parser.add_option("", "--use-catbox", action="store_true", default=False, -+ help=_("use catbox")) - - def add_steps_options(self): - group = OptionGroup(self.parser, _("build steps")) diff --git a/tags/pisi-1.1_rc10/pisi/cli/README b/tags/pisi-1.1_rc10/pisi/cli/README deleted file mode 100644 index 5ad52a09..00000000 --- a/tags/pisi-1.1_rc10/pisi/cli/README +++ /dev/null @@ -1,23 +0,0 @@ -Writing commands: ------------------ - -TODO: this is a *bit* out of date now. - -Subclass from Command. - -Be careful not to import PiSi modules before Command is run, e.g. -do it in run() method. This is necessary to prevent an obscure -initialization error. - -We used to import pisi.operations in pisi.cli - -This prevented pisi.operations from having the current global -pisi.ui.ui because it's loaded before the UI is set! So, despite -what you might understand from the python FAQ 1.2.3 -http://www.python.org/doc/faq/programming.html#how-do-i-share-global-variables-across-modules -you have to be careful about the initialization order when using -singleton modules. - -Another way to solve this is to ensure that the global module is -always imported again in every function it is called (see -ui.CLI.confirm() ) but this is more expensive. diff --git a/tags/pisi-1.1_rc10/pisi/cli/__init__.py b/tags/pisi-1.1_rc10/pisi/cli/__init__.py deleted file mode 100644 index a5139880..00000000 --- a/tags/pisi-1.1_rc10/pisi/cli/__init__.py +++ /dev/null @@ -1,165 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import sys -import logging -import locale - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -from pisi.ui import UI -import pisi.ui as ui -import pisi.util as util -from pisi.cli.colors import colorize - - -class Error(pisi.Error): - pass - - -class Exception(pisi.Exception): - pass - - -def printu(obj, err = False): - if not isinstance(obj, unicode): - obj = unicode(obj) - if err: - out = sys.stderr - else: - out = sys.stdout - out.write(obj.encode('utf-8')) - out.flush() - -class CLI(UI): - "Command Line Interface" - - def __init__(self, show_debug = False, show_verbose = False): - super(CLI, self).__init__(show_debug, show_verbose) - - def close(self): - util.xterm_title_reset() - - def output(self, msg, err = False, verbose = False): - if (verbose and self.show_verbose) or (not verbose): - if type(msg)==type(unicode()): - msg = msg.encode('utf-8') - if err: - out = sys.stderr - else: - out = sys.stdout - out.write(msg) - out.flush() - - def info(self, msg, verbose = False, noln = False): - # TODO: need to look at more kinds of info messages - # let's cheat from KDE :) - if not noln: - msg = '%s\n' % msg - self.output(unicode(msg), verbose=verbose) - - def warning(self, msg, verbose = False): - msg = unicode(msg) - if ctx.log: - ctx.log.warning(msg) - if ctx.get_option('no_color'): - self.output(_('Warning: ') + msg + '\n', err=True, verbose=verbose) - else: - self.output(colorize(msg + '\n', 'brightred'), err=True, verbose=verbose) - - def error(self, msg): - msg = unicode(msg) - if ctx.log: - ctx.log.error(msg) - if ctx.get_option('no_color'): - self.output(_('Error: ') + msg + '\n', err=True) - else: - self.output(colorize(msg + '\n', 'red'), err=True) - - def action(self, msg, verbose = False): - #TODO: this seems quite redundant? - msg = unicode(msg) - if ctx.log: - ctx.log.info(msg) - self.output(colorize(msg + '\n', 'green')) - - def choose(self, msg, opts): - print msg - for i in range(0,len(opts)): - print i + 1, opts(i) - while True: - s = raw_input(msg + colorize('1-%d' % len(opts), 'red')) - try: - opt = int(s) - if 1 <= opt and opt <= len(opts): - return opts(opt-1) - except (Exception,e): - pass - - def confirm(self, msg): - msg = unicode(msg) - if ctx.config.options and ctx.config.options.yes_all: - return True - while True: - import re - yesexpr = re.compile(locale.nl_langinfo(locale.YESEXPR)) - - prompt = msg + colorize(_(' (yes/no)'), 'red') - s = raw_input(prompt.encode('utf-8')) - if yesexpr.search(s): - return True - - return False - - def display_progress(self, operation, percent, info="", **ka): - """ display progress of any operation """ - if operation in ["removing", "rebuilding-db"]: - return - elif operation == "fetching": - totalsize = '%.1f %s' % pisi.util.human_readable_size(ka['total_size']) - out = '\r%-30.30s (%s)%3d%% %9.2f %s [%s]' % \ - (ka['filename'], totalsize, percent, - ka['rate'], ka['symbol'], ka['eta']) - self.output(out) - else: - self.output("\r%s (%d%%)" % (info, percent)) - - if percent == 100: - self.output(colorize(_(' [complete]\n'), 'gray')) - - def status(self, msg = None): - if msg: - msg = unicode(msg) - self.output(colorize(msg + '\n', 'brightgreen')) - util.xterm_title(msg) - - def notify(self, event, **keywords): - if event == ui.installed: - msg = _('Installed %s') % keywords['package'].name - elif event == ui.removed: - msg = _('Removed %s') % keywords['package'].name - elif event == ui.upgraded: - msg = _('Upgraded %s') % keywords['package'].name - elif event == ui.configured: - msg = _('Configured %s') % keywords['package'].name - elif event == ui.extracting: - msg = _('Extracting the files of %s') % keywords['package'].name - else: - msg = None - if msg: - self.output(colorize(msg + '\n', 'cyan')) - if ctx.log: - ctx.log.info(msg) diff --git a/tags/pisi-1.1_rc10/pisi/cli/colors.py b/tags/pisi-1.1_rc10/pisi/cli/colors.py deleted file mode 100644 index dc5b9ff7..00000000 --- a/tags/pisi-1.1_rc10/pisi/cli/colors.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""Colors module provides some color codes for console output.""" - -import pisi.context as ctx - -colors = {'black' : "\033[30m", - 'red' : "\033[31m", - 'green' : "\033[32m", - 'yellow' : "\033[33m", - 'blue' : "\033[34m", - 'purple' : "\033[35m", - 'cyan' : "\033[36m", - 'white' : "\033[37m", - 'brightblack' : "\033[01;30m", - 'brightred' : "\033[01;31m", - 'brightgreen' : "\033[01;32m", - 'brightyellow' : "\033[01;33m", - 'brightblue' : "\033[01;34m", - 'brightmagenta' : "\033[01;35m", - 'brightcyan' : "\033[01;36m", - 'brightwhite' : "\033[01;37m", - 'underlineblack' : "\033[04;30m", - 'underlinered' : "\033[04;31m", - 'underlinegreen' : "\033[04;32m", - 'underlineyellow' : "\033[04;33m", - 'underlineblue' : "\033[04;34m", - 'underlinemagenta' : "\033[04;35m", - 'underlinecyan' : "\033[04;36m", - 'underlinewhite' : "\033[04;37m", - 'blinkingblack' : "\033[05;30m", - 'blinkingred' : "\033[05;31m", - 'blinkinggreen' : "\033[05;32m", - 'blinkingyellow' : "\033[05;33m", - 'blinkingblue' : "\033[05;34m", - 'blinkingmagenta' : "\033[05;35m", - 'blinkingcyan' : "\033[05;36m", - 'blinkingwhite' : "\033[05;37m", - 'backgroundblack' : "\033[07;30m", - 'backgroundred' : "\033[07;31m", - 'backgroundgreen' : "\033[07;32m", - 'backgroundyellow' : "\033[07;33m", - 'backgroundblue' : "\033[07;34m", - 'backgroundmagenta' : "\033[07;35m", - 'backgroundcyan' : "\033[07;36m", - 'backgroundwhite' : "\033[07;37m", - 'default' : "\033[0m" } - -def colorize(msg, color): - """Colorize the given message for console output""" - if colors.has_key(color) and not ctx.get_option('no_color'): - return colors[color] + msg + colors['default'] - else: - return msg diff --git a/tags/pisi-1.1_rc10/pisi/cli/commands.py b/tags/pisi-1.1_rc10/pisi/cli/commands.py deleted file mode 100644 index 53374e56..00000000 --- a/tags/pisi-1.1_rc10/pisi/cli/commands.py +++ /dev/null @@ -1,1618 +0,0 @@ -# -*- coding:utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import sys -from optparse import OptionParser, OptionGroup, HelpFormatter - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.cli -import pisi.context as ctx -from pisi.uri import URI -import pisi.util as util -import pisi.api as api -from colors import colorize - -class Error(pisi.Error): - pass - -class PisiHelpFormatter(HelpFormatter): - def __init__(self, - indent_increment=1, - max_help_position=32, - width=None, - short_first=1): - HelpFormatter.__init__( - self, indent_increment, max_help_position, width, short_first) - - self._short_opt_fmt = "%s" - self._long_opt_fmt = "%s" - - def format_usage(self, usage): - return _("usage: %s\n") % usage - - def format_heading(self, heading): - return "%*s%s:\n" % (self.current_indent, "", heading) - - def format_option_strings(self, option): - """Return a comma-separated list of option strings & metavariables.""" - if option.takes_value(): - short_opts = [self._short_opt_fmt % sopt - for sopt in option._short_opts] - long_opts = [self._long_opt_fmt % lopt - for lopt in option._long_opts] - else: - short_opts = option._short_opts - long_opts = option._long_opts - - if long_opts and short_opts: - opt = "%s [%s]" % (short_opts[0], long_opts[0]) - else: - opt = long_opts[0] or short_opts[0] - - if option.takes_value(): - opt += " arg" - - return opt - - def format_option(self, option): - import textwrap - result = [] - opts = self.option_strings[option] - opt_width = self.help_position - self.current_indent - 2 - if len(opts) > opt_width: - opts = "%*s%s\n" % (self.current_indent, "", opts) - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts) - indent_first = 0 - result.append(opts) - if option.help: - help_text = self.expand_default(option) - help_lines = textwrap.wrap(help_text, self.help_width) - result.append(": %*s%s\n" % (indent_first, "", help_lines[0])) - result.extend([" %*s%s\n" % (self.help_position, "", line) - for line in help_lines[1:]]) - elif opts[-1] != "\n": - result.append("\n") - return "".join(result) - - -class Command(object): - """generic help string for any command""" - - # class variables - - cmd = [] - cmd_dict = {} - - @staticmethod - def commands_string(): - s = '' - list = [x.name[0] for x in Command.cmd] - list.sort() - for name in list: - commandcls = Command.cmd_dict[name] - trans = gettext.translation('pisi', fallback=True) - summary = trans.ugettext(commandcls.__doc__).split('\n')[0] - name = commandcls.name[0] - if commandcls.name[1]: - name += ' (%s)' % commandcls.name[1] - s += '%21s - %s\n' % (name, summary) - return s - - @staticmethod - def get_command(cmd, fail=False, args=None): - - if Command.cmd_dict.has_key(cmd): - return Command.cmd_dict[cmd](args) - - if fail: - raise Error(_("Unrecognized command: %s") % cmd) - else: - return None - - # instance variabes - - def __init__(self, args = None): - # now for the real parser - import pisi - self.comar = False - self.parser = OptionParser(usage=getattr(self, "__doc__"), - version="%prog " + pisi.__version__, - formatter=PisiHelpFormatter()) - self.options() - self.commonopts() - (self.options, self.args) = self.parser.parse_args(args) - if self.args: - self.args.pop(0) # exclude command arg - - self.process_opts() - - def commonopts(self): - '''common options''' - p = self.parser - - group = OptionGroup(self.parser, _("general options")) - - group.add_option("-D", "--destdir", action="store", default = None, - help = _("Change the system root for PiSi commands")) - group.add_option("-y", "--yes-all", action="store_true", - default=False, help = _("Assume yes in all yes/no queries")) - group.add_option("-u", "--username", action="store") - group.add_option("-p", "--password", action="store") - group.add_option("-v", "--verbose", action="store_true", - dest="verbose", default=False, - help=_("Detailed output")) - group.add_option("-d", "--debug", action="store_true", - default=False, help=_("Show debugging information")) - group.add_option("-N", "--no-color", action="store_true", default=False, - help = _("Suppresses all coloring of PiSi's output")) - - p.add_option_group(group) - - return p - - def options(self): - """This is a fall back function. If the implementer module provides an - options function it will be called""" - pass - - def process_opts(self): - self.check_auth_info() - - # make destdir absolute - if self.options.destdir: - dir = str(self.options.destdir) - import os.path - if not os.path.exists(dir): - pisi.cli.printu(_('Destination directory %s does not exist. Creating directory.\n') % dir) - os.makedirs(dir) - self.options.destdir = os.path.realpath(dir) - - def check_auth_info(self): - username = self.options.username - password = self.options.password - - # TODO: We'll get the username, password pair from a configuration - # file from users home directory. Currently we need user to - # give it from the user interface. - # if not username and not password: - # if someauthconfig.username and someauthconfig.password: - # self.authInfo = (someauthconfig.username, - # someauthconfig.password) - # return - if username and password: - self.options.authinfo = (username, password) - return - - if username and not password: - from getpass import getpass - password = getpass(_("Password: ")) - self.options.authinfo = (username, password) - else: - self.options.authinfo = None - - def init(self, database = True, write = True): - """initialize PiSi components""" - - # NB: command imports here or in the command class run fxns - import pisi.api - pisi.api.init(database = database, write = write, options = self.options, - comar = self.comar) - - def finalize(self): - """do cleanup work for PiSi components""" - pisi.api.finalize() - - def get_name(self): - return self.__class__.name - - def format_name(self): - (name, shortname) = self.get_name() - if shortname: - return "%s (%s)" % (name, shortname) - else: - return name - - def help(self): - """print help for the command""" - trans = gettext.translation('pisi', fallback=True) - print "%s: %s\n" % (self.format_name(), trans.ugettext(self.__doc__)) - print self.parser.format_option_help() - - def die(self): - """exit program""" - #FIXME: not called from anywhere? - ctx.ui.error(_('Command terminated abnormally.')) - sys.exit(-1) - - -class autocommand(type): - def __init__(cls, name, bases, dict): - super(autocommand, cls).__init__(name, bases, dict) - Command.cmd.append(cls) - name = getattr(cls, 'name', None) - if name is None: - raise pisi.cli.Error(_('Command lacks name')) - longname, shortname = name - def add_cmd(cmd): - if Command.cmd_dict.has_key(cmd): - raise pisi.cli.Error(_('Duplicate command %s') % cmd) - else: - Command.cmd_dict[cmd] = cls - add_cmd(longname) - if shortname: - add_cmd(shortname) - - -class Help(Command): - """Prints help for given commands - -Usage: help [ ... ] - -If run without parameters, it prints the general help.""" - - __metaclass__ = autocommand - - def __init__(self, args = None): - #TODO? Discard Help's own usage doc in favor of general usage doc - #self.__doc__ = usage_text - #self.__doc__ += commands_string() - super(Help, self).__init__(args) - - name = ("help", "?") - - def run(self): - - if not self.args: - self.parser.set_usage(usage_text) - pisi.cli.printu(self.parser.format_help()) - return - - self.init(database = False, write = False) - - for arg in self.args: - obj = Command.get_command(arg, True) - obj.help() - ctx.ui.info('') - - self.finalize() - - -class Clean(Command): - """Clean stale locks - -Usage: clean - -PiSi uses filesystem locks for managing database access. -This command deletes unused locks from the database directory.""" - - __metaclass__ = autocommand - - def __init__(self, args=None): - super(Clean, self).__init__(args) - - name = ("clean", None) - - def run(self): - self.init() - self.finalize() - -class DeleteCache(Command): - """Delete cache files - -Usage: delete-cache - -Sources, packages and temporary files are stored -under /var directory. Since these accumulate they can -consume a lot of disk space.""" - - __metaclass__ = autocommand - - def __init__(self, args=None): - super(DeleteCache, self).__init__(args) - - name = ("delete-cache", "dc") - - def run(self): - self.init(database=False, write=True) - pisi.api.delete_cache() - - -class Graph(Command): - """Graph package relations - -Usage: graph [ ...] - -Write a graph of package relations, tracking dependency and -conflicts relations starting from given packages. By default -shows the package relations among repository packages, and writes -the package in graphviz format to 'pgraph.dot'. -""" - - __metaclass__ = autocommand - - def __init__(self, args=None): - super(Graph, self).__init__(args) - - def options(self): - - group = OptionGroup(self.parser, _("graph options")) - - group.add_option("-r", "--repository", action="store", - default=None, - help=_("Specify a particular repository")) - group.add_option("-i", "--installed", action="store_true", - default=False, - help=_("Graph of installed packages")) - group.add_option("--ignore-installed", action="store_true", - default=False, - help=_("Do not show installed packages")) - group.add_option("-o", "--output", action="store", - default='pgraph.dot', - help=_("Dot output file")) - - self.parser.add_option_group(group) - - name = ("graph", None) - - def run(self): - self.init(write=False) - if not ctx.get_option('installed'): - if ctx.get_option('repository'): - repo = ctx.get_option('repository') - ctx.ui.info(_('Plotting packages in repository %s') % repo) - else: - repo = pisi.itembyrepodb.repos - if self.args: - a = self.args - else: - ctx.ui.info(_('Plotting a graph of relations among all repository packages')) - a = ctx.packagedb.list_packages(repo) - else: - if self.args: - a = self.args - else: - # if A is empty, then graph all packages - ctx.ui.info(_('Plotting a graph of relations among all installed packages')) - a = ctx.installdb.list_installed() - repo = pisi.itembyrepodb.installed - g = pisi.api.package_graph(a, repo = repo, - ignore_installed = ctx.get_option('ignore_installed')) - g.write_graphviz(file(ctx.get_option('output'), 'w')) - self.finalize() - -# option mixins -def buildno_opts(self, group): - group.add_option("--ignore-build-no", action="store_true", - default=False, - help=_("Do not take build no into account.")) - -def ignoredep_opt(self, group): - group.add_option("--ignore-dependency", action="store_true", - default=False, - help=_("Do not take dependency information into account")) - - -class Build(Command): - """Build PiSi packages - -Usage: build [ | ] ... - -You can give a URI of the pspec.xml file. PiSi will -fetch all necessary files and build the package for you. - -Alternatively, you can give the name of a source package -to be downloaded from a repository containing sources. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Build, self).__init__(args) - - name = ("build", "bi") - - package_formats = ('1.0', '1.1') - - def options(self): - - self.add_steps_options() - group = OptionGroup(self.parser, _("build options")) - self.add_options(group) - self.parser.add_option_group(group) - - def add_options(self, group): - buildno_opts(self, group) - ignoredep_opt(self, group) - group.add_option("-O", "--output-dir", action="store", default=None, - help=_("Output directory for produced packages")) - group.add_option("--ignore-action-errors", - action="store_true", default=False, - help=_("Bypass errors from ActionsAPI")) - group.add_option("--ignore-safety", action="store_true", - default=False, help=_("Bypass safety switch")) - group.add_option("--create-static", action="store_true", - default=False, help=_("Create a static package with ar files")) - group.add_option("--no-install", action="store_true", - default=False, help=_("Do not install build dependencies, fail if a build dependency is present")) - group.add_option("-F", "--package-format", action="store", default='1.1', - help=_("PiSi binary package formats: '1.0', '1.1' (default)")) - - def add_steps_options(self): - group = OptionGroup(self.parser, _("build steps")) - group.add_option("--fetch", dest="until", action="store_const", - const="fetch", help=_("Break build after fetching the source archive")) - group.add_option("--unpack", dest="until", action="store_const", - const="unpack", help=_("Break build after unpacking the source archive, checking sha1sum and applying patches")) - group.add_option("--setup", dest="until", action="store_const", - const="setup", help=_("Break build after running configure step")) - group.add_option("--build", dest="until", action="store_const", - const="build", help=_("Break build after running compile step")) - group.add_option("--install", dest="until", action="store_const", - const="install", help=_("Break build after running install step")) - group.add_option("--package", dest="until", action="store_const", - const="package", help=_("create PiSi package")) - self.parser.add_option_group(group) - - def run(self): - if not self.args: - self.help() - return - - if self.options.no_install: - self.init(database=True, write=False) - else: - self.init() - - if ctx.get_option('package_format') not in Build.package_formats: - raise Error(_('package_format must be one of %s ') % pisi.util.strlist(Build.package_formats)) - - if ctx.get_option('output_dir'): - ctx.ui.info(_('Output directory: %s') % ctx.config.options.output_dir) - else: - ctx.ui.info(_('Outputting packages in the working directory.')) - ctx.config.options.output_dir = '.' - - for x in self.args: - if ctx.get_option('until'): - pisi.api.build_until(x, ctx.get_option('until')) - else: - pisi.api.build(x) - self.finalize() - -class Emerge(Build): - """Build and install PiSi source packages from repository - -Usage: emerge ... - -You should give the name of a source package to be -downloaded from a repository containing sources. - -You can also give the name of a component. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Emerge, self).__init__(args) - self.comar = True - - name = ("emerge", "em") - - def options(self): - - group = OptionGroup(self.parser, _("emerge options")) - super(Emerge, self).add_options(group) - group.add_option("--ignore-file-conflicts", action="store_true", - default=False, help=_("Ignore file conflicts")) - group.add_option("--ignore-package-conflicts", action="store_true", - default=False, help=_("Ignore package conflicts")) - group.add_option("--ignore-comar", action="store_true", - default=False, help=_("Bypass comar configuration agent")) - self.parser.add_option_group(group) - - def run(self): - if not self.args: - self.help() - return - - self.init(database = True) - if ctx.get_option('output_dir'): - ctx.ui.info(_('Output directory: %s') % ctx.config.options.output_dir) - else: - ctx.ui.info(_('Outputting binary packages in the package cache.')) - ctx.config.options.output_dir = ctx.config.packages_dir() - - pisi.api.emerge(self.args) - self.finalize() - - -class PackageOp(Command): - """Abstract package operation command""" - - def __init__(self, args): - super(PackageOp, self).__init__(args) - self.comar = True - - def options(self, group): - ignoredep_opt(self, group) - group.add_option("--ignore-comar", action="store_true", - default=False, help=_("Bypass comar configuration agent")) - group.add_option("--ignore-safety", action="store_true", - default=False, help=_("Bypass safety switch")) - group.add_option("-n", "--dry-run", action="store_true", default=False, - help = _("Do not perform any action, just show what would be done")) - - def init(self): - super(PackageOp, self).init(True) - - def finalize(self): - #self.finalize_db() - pass - - -class Install(PackageOp): - """Install PiSi packages - -Usage: install ... - -You may use filenames, URI's or package names for packages. If you have -specified a package name, it should exist in a specified repository. - -You can also specify components instead of package names, which will be -expanded to package names. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Install, self).__init__(args) - - name = "install", "it" - - def options(self): - group = OptionGroup(self.parser, _("install options")) - - super(Install, self).options(group) - buildno_opts(self, group) - group.add_option("--reinstall", action="store_true", - default=False, help=_("Reinstall already installed packages")) - group.add_option("--ignore-file-conflicts", action="store_true", - default=False, help=_("Ignore file conflicts")) - group.add_option("--ignore-package-conflicts", action="store_true", - default=False, help=_("Ignore package conflicts")) - group.add_option("-c", "--component", action="append", - default=None, help=_("Install component's and recursive components' packages")) - group.add_option("-f", "--fetch-only", action="store_true", - default=False, help=_("Fetch upgrades but do not install.")) - self.parser.add_option_group(group) - - def run(self): - self.init() - - components = ctx.get_option('component') - if not components and not self.args: - self.help() - return - - packages = [] - if components: - for name in components: - if ctx.componentdb.has_component(name): - packages.extend(ctx.componentdb.get_union_packages(name, walk=True)) - packages.extend(self.args) - - pisi.api.install(packages, ctx.get_option('reinstall')) - self.finalize() - - -class Upgrade(PackageOp): - """Upgrade PiSi packages - -Usage: Upgrade [ ... ] - -: package name - -Upgrades the entire system if no package names are given - -You may use only package names to specify packages because -the package upgrade operation is defined only with respect -to repositories. If you have specified a package name, it -should exist in the package repositories. If you just want to -reinstall a package from a PiSi file, use the install command. - -You can also specify components instead of package names, which will be -expanded to package names. -""" - - __metaclass__ = autocommand - - def __init__(self, args): - super(Upgrade, self).__init__(args) - - name = ("upgrade", "up") - - def options(self): - group = OptionGroup(self.parser, _("upgrade options")) - - super(Upgrade, self).options(group) - buildno_opts(self, group) - group.add_option("--security-only", action="store_true", - default=False, help=_("Security related package upgrades only")) - group.add_option("-r", "--bypass-update-repo", action="store_true", - default=False, help=_("Do not update repositories")) - group.add_option("--ignore-file-conflicts", action="store_true", - default=False, help=_("Ignore file conflicts")) - group.add_option("--ignore-package-conflicts", action="store_true", - default=False, help=_("Ignore package conflicts")) - group.add_option("-c", "--component", action="append", - default=None, help=_("Upgrade component's and recursive components' packages")) - group.add_option("-f", "--fetch-only", action="store_true", - default=False, help=_("Fetch upgrades but do not install.")) - group.add_option("-x", "--exclude", action="append", - default=None, help=_("When upgrading system, ignore packages and components whose basenames match pattern.")) - group.add_option("--exclude-from", action="store", - default=None, help=_("When upgrading system, ignore packages and components whose basenames \ - match any pattern contained in file.")) - - self.parser.add_option_group(group) - - def exclude_from(self, packages): - import os - - patterns = [] - file = ctx.get_option('exclude_from') - if os.path.exists(file): - for line in open(file, "r").readlines(): - if not line.startswith('#') and not line == '\n': - patterns.append(line.strip()) - if patterns: - return self.exclude(packages, patterns) - - return packages - - def exclude(self, packages, patterns): - from sets import Set as set - import fnmatch - - packages = set(packages) - for pattern in patterns: - # match pattern in package names - match = fnmatch.filter(packages, pattern) - packages = packages - set(match) - - if not match: - # match pattern in component names - for cmp in fnmatch.filter(ctx.componentdb.list_components(), pattern): - packages = packages - set(ctx.componentdb.get_union_packages(cmp, walk=True)) - - return list(packages) - - def run(self): - self.init() - - if not ctx.get_option('bypass_update_repo'): - ctx.ui.info(_('Updating repositories')) - repos = ctx.repodb.list() - for repo in repos: - pisi.api.update_repo(repo) - else: - ctx.ui.info(_('Will not update repositories')) - - components = ctx.get_option('component') - packages = [] - if components: - for name in components: - if ctx.componentdb.has_component(name): - packages.extend(ctx.componentdb.get_union_packages(name, walk=True)) - packages.extend(self.args) - - if ctx.get_option('exclude_from'): - packages = self.exclude_from(packages) - - if ctx.get_option('exclude'): - patterns = ctx.get_option('exclude') - packages = self.exclude(packages, patterns) - - pisi.api.upgrade(packages) - self.finalize() - - -class Remove(PackageOp): - """Remove PiSi packages - -Usage: remove ... - -Remove package(s) from your system. Just give the package names to remove. - -You can also specify components instead of package names, which will be -expanded to package names. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Remove, self).__init__(args) - - name = ("remove", "rm") - - def options(self): - group = OptionGroup(self.parser, _("remove options")) - super(Remove, self).options(group) - group.add_option("-c", "--component", action="append", - default=None, help=_("Remove component's and recursive components' packages")) - self.parser.add_option_group(group) - - def run(self): - self.init() - - components = ctx.get_option('component') - if not components and not self.args: - self.help() - return - - packages = [] - if components: - for name in components: - if ctx.componentdb.has_component(name): - packages.extend(ctx.componentdb.get_union_packages(name, walk=True)) - packages.extend(self.args) - - pisi.api.remove(packages) - self.finalize() - -class ConfigurePending(PackageOp): - """Configure pending packages - -If COMAR configuration of some packages were not -done at installation time, they are added to a list -of packages waiting to be configured. This command -configures those packages. -""" - - __metaclass__ = autocommand - - def __init__(self, args): - super(ConfigurePending, self).__init__(args) - - name = ("configure-pending", "cp") - - def options(self): - group = OptionGroup(self.parser, _("configure-pending options")) - super(ConfigurePending, self).options(group) - self.parser.add_option_group(group) - - def run(self): - - self.init() - pisi.api.configure_pending() - self.finalize() - - -class Info(Command): - """Display package information - -Usage: info ... - - is either a package name or a .pisi file, -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Info, self).__init__(args) - - name = ("info", None) - - def options(self): - - group = OptionGroup(self.parser, _("info options")) - self.add_options(group) - self.parser.add_option_group(group) - - def add_options(self, group): - group.add_option("-f", "--files", action="store_true", - default=False, - help=_("Show a list of package files.")) - group.add_option("-c", "--component", action="append", - default=None, help=_("Info about the given component")) - group.add_option("-F", "--files-path", action="store_true", - default=False, - help=_("Show only paths.")) - group.add_option("-s", "--short", action="store_true", - default=False, help=_("Do not show details")) - group.add_option("--xml", action="store_true", - default=False, help=_("Output in xml format")) - - def run(self): - - self.init(database = True, write = False) - - components = ctx.get_option('component') - if not components and not self.args: - self.help() - return - - index = pisi.index.Index() - index.distribution = None - - # info of components - if components: - for name in components: - if ctx.componentdb.has_component(name): - component = ctx.componentdb.get_union_comp(name) - if self.options.xml: - index.add_component(component) - else: - if not self.options.short: - ctx.ui.info(unicode(component)) - else: - ctx.ui.info("%s - %s" % (component.name, component.summary)) - - # info of packages - for arg in self.args: - if self.options.xml: - index.packages.append(pisi.api.info(arg)[0].package) - else: - self.info_package(arg) - - if self.options.xml: - errs = [] - index.newDocument() - index.encode(index.rootNode(), errs) - index.writexmlfile(sys.stdout) - sys.stdout.write('\n') - self.finalize() - - - def info_package(self, arg): - if arg.endswith(ctx.const.package_suffix): - metadata, files = pisi.api.info_file(arg) - ctx.ui.info(_('Package file: %s') % arg) - self.print_pkginfo(metadata, files) - else: - if ctx.installdb.is_installed(arg): - metadata, files = pisi.api.info_name(arg, True) - if self.options.short: - ctx.ui.info(_('[inst] '), noln=True) - else: - ctx.ui.info(_('Installed package:')) - self.print_pkginfo(metadata, files,pisi.itembyrepodb.installed) - - if ctx.packagedb.has_package(arg): - metadata, files = pisi.api.info_name(arg, False) - if self.options.short: - ctx.ui.info(_('[repo] '), noln=True) - else: - ctx.ui.info(_('Package found in repository:')) - self.print_pkginfo(metadata, files, pisi.itembyrepodb.repos) - - if not ctx.packagedb.has_package(arg): - ctx.ui.info(_("%s is not found in repositories") % arg) - - if not ctx.installdb.is_installed(arg): - ctx.ui.info(_("%s is not installed") % arg) - - def print_pkginfo(self, metadata, files, repo = None): - import os.path - - if ctx.get_option('short'): - pkg = metadata.package - ctx.ui.info('%15s - %s' % (pkg.name, unicode(pkg.summary))) - else: - ctx.ui.info(unicode(metadata.package)) - if repo: - revdeps = [x[0] for x in - ctx.packagedb.get_rev_deps(metadata.package.name, repo)] - print _('Reverse Dependencies:'), util.strlist(revdeps) - if self.options.files or self.options.files_path: - if files: - print _('\nFiles:') - files.list.sort(key = lambda x:x.path) - for fileinfo in files.list: - if self.options.files: - print fileinfo - else: - print "/" + fileinfo.path - else: - ctx.ui.warning(_('File information not available')) - if not self.options.short: - print - - -class Check(Command): - """Verify installation - -Usage: check [ ... ] - -: package name - -A cryptographic checksum is stored for each installed -file. Check command uses the checksums to verify a package. -Just give the names of packages. - -If no packages are given, checks all installed packages. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Check, self).__init__(args) - - name = ("check", None) - - def run(self): - self.init(database = True, write = False) - if self.args: - pkgs = self.args - else: - ctx.ui.info(_('Checking all installed packages')) - pkgs = ctx.installdb.list_installed() - for pkg in pkgs: - ctx.ui.info(_('* Checking %s... ') % pkg, noln=True) - if ctx.installdb.is_installed(pkg): - corrupt = pisi.api.check(pkg) - if corrupt: - ctx.ui.info(_('\nPackage %s is corrupt.') % pkg) - else: - ctx.ui.info(_("OK"), verbose=False) - else: - ctx.ui.info(_('Package %s not installed') % pkg) - self.finalize() - - -class Index(Command): - """Index PiSi files in a given directory - -Usage: index ... - -This command searches for all PiSi files in a directory, collects PiSi -tags from them and accumulates the information in an output XML file, -named by default 'pisi-index.xml'. In particular, it indexes both -source and binary packages. - -If you give multiple directories, the command still works, but puts -everything in a single index file. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Index, self).__init__(args) - - name = ("index", "ix") - - def options(self): - - group = OptionGroup(self.parser, _("index options")) - - group.add_option("-a", "--absolute-urls", action="store_true", - default=False, - help=_("Store absolute links for indexed files.")) - group.add_option("-o", "--output", action="store", - default='pisi-index.xml', - help=_("Index output file")) - group.add_option("--skip-sources", action="store_true", - default=False, - help=_("Do not index PiSi spec files.")) - group.add_option("--skip-signing", action="store_true", - default=False, - help=_("Do not sign index.")) - - self.parser.add_option_group(group) - - def run(self): - - self.init(database = True, write = False) - from pisi.api import index - if len(self.args)>0: - index(self.args, ctx.get_option('output'), - skip_sources = ctx.get_option('skip_sources'), - skip_signing = ctx.get_option('skip_signing')) - elif len(self.args)==0: - ctx.ui.info(_('Indexing current directory.')) - index(['.'], ctx.get_option('output'), - skip_sources = ctx.get_option('skip_sources'), - skip_signing = ctx.get_option('skip_signing')) - self.finalize() - - -class ListInstalled(Command): - """Print the list of all installed packages - -Usage: list-installed -""" - - __metaclass__ = autocommand - - def __init__(self, args): - super(ListInstalled, self).__init__(args) - - name = ("list-installed", "li") - - def options(self): - - group = OptionGroup(self.parser, _("list-installed options")) - - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show in long format")) - group.add_option("-c", "--component", action="store", - default=None, help=_("List installed packages under given component")) - group.add_option("-i", "--install-info", action="store_true", - default=False, help=_("Show detailed install info")) - - self.parser.add_option_group(group) - - def run(self): - self.init(database = True, write = False) - installed = ctx.installdb.list_installed() - - component = ctx.get_option('component') - if component: - #FIXME: pisi api is insufficient to do this - from sets import Set as set - component_pkgs = ctx.componentdb.get_union_packages(component, walk=True) - installed = list(set(installed) & set(component_pkgs)) - - installed.sort() - if self.options.install_info: - ctx.ui.info(_('Package Name |St| Version| Rel.| Build| Distro| Date')) - print '========================================================================' - for pkg in installed: - package = ctx.packagedb.get_package(pkg, pisi.itembyrepodb.installed) - inst_info = ctx.installdb.get_info(pkg) - if self.options.long: - ctx.ui.info(unicode(package)) - ctx.ui.info(unicode(inst_info)) - elif self.options.install_info: - ctx.ui.info('%-15s |%s' % (package.name, inst_info.one_liner())) - else: - ctx.ui.info('%15s - %s' % (package.name, unicode(package.summary))) - self.finalize() - -class RebuildDb(Command): - """Rebuild Databases - -Usage: rebuilddb [ ... ] - -Rebuilds the PiSi databases - -If package specs are given, they should be the names of package -dirs under /var/lib/pisi -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(RebuildDb, self).__init__(args) - - name = ("rebuild-db", "rdb") - - def options(self): - - group = OptionGroup(self.parser, _("rebuild-db options")) - - group.add_option("-f", "--files", action="store_true", - default=False, help=_("Rebuild files database")) - - self.parser.add_option_group(group) - - def run(self): - if self.args: - self.init(database=True) - for package_fn in self.args: - pisi.api.resurrect_package(package_fn, ctx.get_option('files`')) - else: - self.init(database=False) - if ctx.ui.confirm(_('Rebuild PiSi databases?')): - pisi.api.rebuild_db(ctx.get_option('files')) - - self.finalize() - - -class UpdateRepo(Command): - """Update repository databases - -Usage: update-repo [ ... ] - -: repository name - -Synchronizes the PiSi databases with the current repository. -If no repository is given, all repositories are updated. -""" - __metaclass__ = autocommand - - def __init__(self,args): - super(UpdateRepo, self).__init__(args) - - name = ("update-repo", "ur") - - def options(self): - - group = OptionGroup(self.parser, _("update-repo options")) - - group.add_option("-f", "--force", action="store_true", - default=False, - help=_("Update database in any case")) - - self.parser.add_option_group(group) - - def run(self): - self.init(database = True) - - if self.args: - repos = self.args - else: - repos = ctx.repodb.list() - - for repo in repos: - pisi.api.update_repo(repo, ctx.get_option('force')) - self.finalize() - - -class AddRepo(Command): - """Add a repository - -Usage: add-repo - -: name of repository to add -: URI of index file - -If no repo is given, add-repo pardus-devel repo is added by default - -NB: We support only local files (e.g., /a/b/c) and http:// URIs at the moment -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(AddRepo, self).__init__(args) - - name = ("add-repo", "ar") - - def options(self): - - group = OptionGroup(self.parser, _("add-repo options")) - group.add_option("--at", action="store", - type="int", default=None, - help=_("Add repository at given position (0 is first)")) - self.parser.add_option_group(group) - - def run(self): - - if len(self.args)==2 or len(self.args)==0: - self.init() - if len(self.args)==2: - name = self.args[0] - indexuri = self.args[1] - else: - name = 'pardus-2007' - indexuri = 'http://paketler.pardus.org.tr/pardus-2007/pisi-index.xml.bz2' - pisi.api.add_repo(name, indexuri, ctx.get_option('at')) - if ctx.ui.confirm(_('Update PiSi database for repository %s?') % name): - try: - pisi.api.update_repo(name) - except pisi.fetcher.FetchError: - ctx.ui.warning(_("%s repository could not be reached. Removing %s from system.") % (name, name)) - pisi.api.remove_repo(name) - self.finalize() - else: - self.help() - return - - -class RemoveRepo(Command): - """Remove repositories - -Usage: remove-repo ... - -Remove all repository information from the system. -""" - __metaclass__ = autocommand - - def __init__(self,args): - super(RemoveRepo, self).__init__(args) - - name = ("remove-repo", "rr") - - def run(self): - - if len(self.args)>=1: - self.init() - for repo in self.args: - pisi.api.remove_repo(repo) - self.finalize() - else: - self.help() - return - - -class ListRepo(Command): - """List repositories - -Usage: list-repo - -Lists currently tracked repositories. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(ListRepo, self).__init__(args) - - name = ("list-repo", "lr") - - def run(self): - - self.init(database = True, write = False) - for repo in ctx.repodb.list(): - ctx.ui.info(repo) - print ' ', ctx.repodb.get_repo(repo).indexuri.get_uri() - self.finalize() - - -class ListAvailable(Command): - """List available packages in the repositories - -Usage: list-available [ ... repon ] - -Gives a brief list of PiSi packages published in the specified -repositories. If no repository is specified, we list packages in -all repositories. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(ListAvailable, self).__init__(args) - - name = ("list-available", "la") - - def options(self): - - group = OptionGroup(self.parser, _("list-available options")) - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show in long format")) - group.add_option("-c", "--component", action="store", - default=None, help=_("List available packages under given component")) - group.add_option("-U", "--uninstalled", action="store_true", - default=False, help=_("Show uninstalled packages only")) - self.parser.add_option_group(group) - - def run(self): - - self.init(database = True, write = False) - - if not (ctx.get_option('no_color') or ctx.config.get_option('uninstalled')): - ctx.ui.info(colorize(_('Installed packages are shown in this color'), 'green')) - - if self.args: - for arg in self.args: - self.print_packages(arg) - else: - # print for all repos - for repo in ctx.repodb.list(): - ctx.ui.info(_("Repository : %s\n") % repo) - self.print_packages(repo) - self.finalize() - - def print_packages(self, repo): - - component = ctx.get_option('component') - if component: - list = ctx.componentdb.get_packages(component, walk=True, repo=repo) - else: - list = ctx.packagedb.list_packages(repo) - installed_list = ctx.installdb.list_installed() - list.sort() - for p in list: - package = ctx.packagedb.get_package(p) - if self.options.long: - ctx.ui.info(unicode(package)) - else: - lenp = len(p) - if p in installed_list: - if ctx.config.get_option('uninstalled'): - continue - p = colorize(p, 'green') - p = p + ' ' * max(0, 15 - lenp) - ctx.ui.info('%s - %s ' % (p, unicode(package.summary))) - -class ListComponents(Command): - """List available components - -Usage: list-components - -Gives a brief list of PiSi components published in the -repositories. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(ListComponents, self).__init__(args) - - name = ("list-components", "lc") - - def options(self): - group = OptionGroup(self.parser, _("list-components options")) - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show in long format")) - self.parser.add_option_group(group) - - def run(self): - - self.init(database = True, write = False) - - list = ctx.componentdb.list_components() - list.sort() - for p in list: - component = ctx.componentdb.get_component(p) - if self.options.long: - ctx.ui.info(unicode(component)) - else: - lenp = len(p) - #if p in installed_list: - # p = colorize(p, 'cyan') - p = p + ' ' * max(0, 15 - lenp) - ctx.ui.info('%s - %s ' % (component.name, unicode(component.summary))) - self.finalize() - - -class ListSources(Command): - """List available sources - -Usage: list-sources - -Gives a brief list of sources published in the repositories. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(ListSources, self).__init__(args) - - name = ("list-sources", "ls") - - def options(self): - group = OptionGroup(self.parser, _("list-sources options")) - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show in long format")) - self.parser.add_option_group(group) - - def run(self): - - self.init(database = True, write = False) - - list = ctx.sourcedb.list() - list.sort() - for p in list: - sf, repo = ctx.sourcedb.get_spec_repo(p) - if self.options.long: - ctx.ui.info('[Repository: ' + repo + ']') - ctx.ui.info(unicode(sf.source)) - else: - lenp = len(p) - #if p in installed_list: - # p = colorize(p, 'cyan') - p = p + ' ' * max(0, 15 - lenp) - ctx.ui.info('%s - %s' % (sf.source.name, unicode(sf.source.summary))) - self.finalize() - -class ListUpgrades(Command): - """List packages to be upgraded - -Usage: list-upgrades - -Lists the packages that will be upgraded. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(ListUpgrades, self).__init__(args) - - name = ("list-upgrades", "lu") - - def options(self): - group = OptionGroup(self.parser, _("list-upgrades options")) - buildno_opts(self, group) - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show in long format")) - group.add_option("-c", "--component", action="store", - default=None, help=_("List upgradable packages under given component")) - group.add_option("-i", "--install-info", action="store_true", - default=False, help=_("Show detailed install info")) - self.parser.add_option_group(group) - - def run(self): - self.init(database = True, write = False) - upgradable_pkgs = pisi.api.list_upgradable() - - component = ctx.get_option('component') - if component: - #FIXME: PiSi api is insufficient to do this - from sets import Set as set - component_pkgs = ctx.componentdb.get_union_packages(component, walk=True) - upgradable_pkgs = list(set(upgradable_pkgs) & set(component_pkgs)) - - if not upgradable_pkgs: - ctx.ui.info(_('No packages to upgrade.')) - - upgradable_pkgs.sort() - if self.options.install_info: - ctx.ui.info(_('Package Name |St| Version| Rel.| Build| Distro| Date')) - print '========================================================================' - for pkg in upgradable_pkgs: - package = ctx.packagedb.get_package(pkg, pisi.itembyrepodb.installed) - inst_info = ctx.installdb.get_info(pkg) - if self.options.long: - ctx.ui.info(package) - print inst_info - elif self.options.install_info: - ctx.ui.info('%-15s | %s ' % (package.name, inst_info.one_liner())) - else: - ctx.ui.info('%15s - %s ' % (package.name, package.summary)) - self.finalize() - - -class ListPending(Command): - """List pending packages - -Lists packages waiting to be configured. -""" - - __metaclass__ = autocommand - - def __init__(self, args): - super(ListPending, self).__init__(args) - - name = ("list-pending", "lp") - - def run(self): - self.init(database = True, write = False) - - A = ctx.installdb.list_pending() - order = api.generate_pending_order(A) - - if len(order): - for p in order: - print p - else: - ctx.ui.info(_('There are no packages waiting to be configured')) - self.finalize() - - -class Search(Info): - """Search packages - -Usage: search ... - -Finds a package containing specified search terms -in summary, description, and package name fields. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(Search, self).__init__(args) - - name = ("search", "sr") - - def options(self): - group = OptionGroup(self.parser, _("search options")) - super(Search, self).add_options(group) - group.add_option("-L", "--language", action="store", - help=_("Set search language")) - group.remove_option("--component") - group.remove_option("--short") - group.remove_option("--xml") - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show details")) - self.parser.add_option_group(group) - - def get_lang(self): - lang = ctx.get_option('language') - if not lang: - lang = pisi.pxml.autoxml.LocalText.get_lang() - if not lang in ['en', 'tr']: - lang = 'en' - return lang - - def run(self): - - self.init(database = True, write = False) - - if not self.args: - self.help() - return - - r = pisi.api.search_package_terms(self.args, self.get_lang()) - ctx.ui.info(_('%s packages found') % len(r)) - - ctx.config.options.short = not ctx.config.options.long - for pkg in r: - self.info_package(pkg) - - self.finalize() - -class SearchFile(Command): - """Search for a file - -Usage: search-file ... - -Finds the installed package which contains the specified file. -""" - __metaclass__ = autocommand - - def __init__(self, args): - super(SearchFile, self).__init__(args) - - name = ("search-file", "sf") - - def options(self): - group = OptionGroup(self.parser, _("search-file options")) - group.add_option("-l", "--long", action="store_true", - default=False, help=_("Show in long format")) - group.add_option("-f", "--fuzzy", action="store_true", - default=False, help=_("Fuzzy search")) - group.add_option("-q", "--quiet", action="store_true", - default=False, help=_("Show only package name")) - self.parser.add_option_group(group) - - # what does exact mean? -- exa - @staticmethod - def search_exact(path): - files = [] - path = path.lstrip('/') #FIXME: this shouldn't be necessary :/ - - if not ctx.config.options.fuzzy: - if ctx.filesdb.has_file(path): - files.append(ctx.filesdb.get_file(path)) - else: - #FIXME: this linear search thing is not working well -- exa - files = ctx.filesdb.match_files(path) - - if files: - for (pkg_name, file_info) in files: - if ctx.config.options.quiet: - ctx.ui.info(pkg_name) - else: - ctx.ui.info(_("Package %s has file %s") % (pkg_name, file_info.path)) - if ctx.config.options.long: - ctx.ui.info(_('Type: %s, Hash: %s') % (file_info.type, - file_info.hash)) - else: - ctx.ui.error(_("Path '%s' does not belong to an installed package") % path) - - def run(self): - - self.init(database = True, write = False) - - if not self.args: - self.help() - return - - # search among existing files - for path in self.args: - if not ctx.config.options.quiet: - ctx.ui.info(_('Searching for %s') % path) - import os.path - if os.path.exists(path): - path = os.path.realpath(path) - self.search_exact(path) - - self.finalize() - -# texts - -usage_text1 = _("""%prog [options] [arguments] - -where is one of: - -""") - -usage_text2 = _(""" -Use \"%prog help \" for help on a specific command. -""") - -usage_text = (usage_text1 + Command.commands_string() + usage_text2) diff --git a/tags/pisi-1.1_rc10/pisi/cli/pisicli.py b/tags/pisi-1.1_rc10/pisi/cli/pisicli.py deleted file mode 100644 index 6f07d93e..00000000 --- a/tags/pisi-1.1_rc10/pisi/cli/pisicli.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import sys -from optparse import OptionParser - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.cli -from pisi.cli import printu -from pisi.uri import URI -from pisi.cli.commands import * - -class ParserError(pisi.Exception): - pass - -class Error(pisi.Error): - pass - -class PreParser(OptionParser): - """consumes any options, and finds arguments from command line""" - - def __init__(self, version): - OptionParser.__init__(self, usage=usage_text, version=version) - - def error(self, msg): - raise ParserError, msg - - def parse_args(self, args=None): - self.opts = [] - self.rargs = self._get_args(args) - self._process_args() - return (self.opts, self.args) - - def _process_args(self): - args = [] - rargs = self.rargs - if not self.allow_interspersed_args: - first_arg = False - while rargs: - arg = rargs[0] - def option(): - if not self.allow_interspersed_args and first_arg: - self.error(_('Options must precede non-option arguments')) - arg = rargs[0] - if arg.startswith('--'): - self.opts.append(arg[2:]) - else: - self.opts.append(arg[1:]) - del rargs[0] - return - # We handle bare "--" explicitly, and bare "-" is handled by the - # standard arg handler since the short arg case ensures that the - # len of the opt string is greater than 1. - if arg == "--": - del rargs[0] - break - elif arg[0:2] == "--": - # process a single long option (possibly with value(s)) - option() - elif arg[:1] == "-" and len(arg) > 1: - # process a cluster of short options (possibly with - # value(s) for the last one only) - option() - else: # then it must be an argument - args.append(arg) - del rargs[0] - self.args = args - - -class PisiCLI(object): - - def __init__(self, orig_args=None): - # first construct a parser for common options - # this is really dummy - self.parser = PreParser(version="%prog " + pisi.__version__) - try: - opts, args = self.parser.parse_args(args=orig_args) - if len(args)==0: # more explicit than using IndexError - if 'version' in opts: - self.parser.print_version() - sys.exit(0) - elif 'help' in opts or 'h' in opts: - self.die() - raise Error(_('No command given')) - cmd_name = args[0] - except ParserError: - raise Error(_('Command line parsing error')) - - self.command = Command.get_command(cmd_name, args=orig_args) - if not self.command: - raise Error(_("Unrecognized command: %s") % cmd_name) - - def die(self): - printu('\n' + self.parser.format_help()) - sys.exit(1) - - def run_command(self): - self.command.run() diff --git a/tags/pisi-1.1_rc10/pisi/comariface.py b/tags/pisi-1.1_rc10/pisi/comariface.py deleted file mode 100644 index 1f53d2e8..00000000 --- a/tags/pisi-1.1_rc10/pisi/comariface.py +++ /dev/null @@ -1,135 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005-2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import time -import select - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx - -class Error(pisi.Error): - pass - -try: - import comar -except ImportError: - raise Error(_("comar package is not fully installed")) - -def get_comar(): - """Connect to the comar daemon and return the handle""" - - sockname = "/var/run/comar.socket" - # YALI starts comar chrooted in the install target, but uses PiSi outside of - # the chroot environment, so PiSi needs to use a different socket path to be - # able to connect true comar (usually /mnt/target/var/run/comar.socket). - if ctx.comar_sockname: - sockname = ctx.comar_sockname - - # This function is sometimes called when comar has recently started - # or restarting after an update. So we give comar a chance to become - # active in a reasonable time. - timeout = 7 - while timeout > 0: - try: - com = comar.Link(sockname) - return com - except comar.CannotConnect: - pass - time.sleep(0.2) - timeout -= 0.2 - raise Error(_("cannot connect to comar")) - -def wait_for_result(com, package_name=None): - multiple = False - while True: - try: - reply = com.read_cmd() - except select.error: - if ctx.keyboard_interrupt_pending(): - return - raise - except comar.LinkClosed: - # Comar postInstall does a "service comar restart" which cuts - # our precious communication link, so we waitsss - if package_name == "comar": - try: - get_comar() - except Error: - raise Error, _("Could not restart comar") - return - else: - if ctx.keyboard_interrupt_pending(): - return - raise Error, _("connection with comar unexpectedly closed") - - cmd = reply[0] - if cmd == com.RESULT and not multiple: - return - elif cmd == com.NONE and not multiple: - # no post/pre function, that is ok - return - elif cmd == com.RESULT_START: - multiple = True - elif cmd == com.RESULT_END: - return - elif cmd == com.FAIL: - raise Error, _("Configuration error: %s") % reply[2] - elif cmd == com.ERROR: - raise Error, _("Script error: %s") % reply[2] - elif cmd == com.DENIED: - raise Error, _("comar denied our access") - -def post_install(package_name, provided_scripts, scriptpath, metapath, filepath): - """Do package's post install operations""" - - ctx.ui.info(_("Configuring %s package") % package_name) - self_post = False - com = get_comar() - - for script in provided_scripts: - ctx.ui.debug(_("Registering %s comar script") % script.om) - if script.om == "System.Package": - self_post = True - com.register(script.om, package_name, os.path.join(scriptpath, script.script)) - wait_for_result(com) - - ctx.ui.debug(_("Calling post install handlers")) - com.call("System.PackageHandler.setupPackage", [ "metapath", metapath, "filepath", filepath ]) - wait_for_result(com) - - if self_post: - ctx.ui.debug(_("Running package's post install script")) - com.call_package("System.Package.postInstall", package_name) - wait_for_result(com, package_name) - -def pre_remove(package_name, metapath, filepath): - """Do package's pre removal operations""" - - ctx.ui.info(_("Configuring %s package for removal") % package_name) - com = get_comar() - - ctx.ui.debug(_("Running package's pre remove script")) - com.call_package("System.Package.preRemove", package_name) - wait_for_result(com) - - ctx.ui.debug(_("Calling pre remove handlers")) - com.call("System.PackageHandler.cleanupPackage", [ "metapath", metapath, "filepath", filepath ]) - wait_for_result(com) - - ctx.ui.debug(_("Unregistering comar scripts")) - com.remove(package_name) - wait_for_result(com) diff --git a/tags/pisi-1.1_rc10/pisi/component.py b/tags/pisi-1.1_rc10/pisi/component.py deleted file mode 100644 index 22778a5c..00000000 --- a/tags/pisi-1.1_rc10/pisi/component.py +++ /dev/null @@ -1,243 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -import pisi.pxml.xmlfile as xmlfile -import pisi.pxml.autoxml as autoxml -import pisi.lockeddbshelve as shelve -from pisi.itembyrepodb import ItemByRepoDB -import pisi.itembyrepodb as itembyrepodb - -class Error(pisi.Error): - pass - -__metaclass__ = autoxml.autoxml - - -class Distribution(xmlfile.XmlFile): - - __metaclass__ = autoxml.autoxml - - tag = "PISI" - - t_SourceName = [autoxml.Text, autoxml.mandatory] # name of distribution (source) - t_Description = [autoxml.LocalText, autoxml.mandatory] - t_Version = [autoxml.Text, autoxml.optional] - t_Type = [autoxml.Text, autoxml.mandatory] - t_Dependencies = [ [autoxml.Text], autoxml.optional, "Dependencies/Distribution"] - - t_BinaryName = [autoxml.Text, autoxml.optional] # name of repository (binary distro) - t_Architecture = [autoxml.Text, autoxml.optional] # architecture identifier - - -class Component(xmlfile.XmlFile): - "representation for component declarations" - - __metaclass__ = autoxml.autoxml - - tag = "PISI" - - t_Name = [autoxml.String, autoxml.mandatory] # fully qualified name - - # component name in other languages, for instance in Turkish - # LocalName for system.base could be sistem.taban or "Taban Sistem", - # this could be useful for GUIs - - t_LocalName = [autoxml.LocalText, autoxml.mandatory] - - # Information about the component - t_Summary = [autoxml.LocalText, autoxml.mandatory] - t_Description = [autoxml.LocalText, autoxml.mandatory] - t_Icon = [ autoxml.String, autoxml.optional] - t_VisibleTo = [autoxml.String, autoxml.optional] - - # Dependencies to other components - t_Dependencies = [ [autoxml.String], autoxml.optional, "Dependencies/Component"] - - # the parts of this component. - # to be filled by the component database, thus it is optional. - t_Packages = [ [autoxml.String], autoxml.optional, "Parts/Package"] - - t_Sources = [ [autoxml.String], autoxml.optional, "Parts/Source"] - -class ComponentDB(object): - """a database of components""" - - def __init__(self): - self.d = ItemByRepoDB('component') - - def close(self): - self.d.close() - - def destroy(self): - self.d.destroy() - - def has_component(self, name, repo = pisi.itembyrepodb.repos, txn = None): - name = str(name) - return self.d.has_key(name, repo, txn) - - def get_component(self, name, repo=None, txn = None): - try: - return self.d.get_item(name, repo, txn=txn) - except pisi.itembyrepodb.NotfoundError, e: - raise Error(_('Component %s not found') % name) - - def get_component_repo(self, name, repo=None, txn = None): - try: - return self.d.get_item_repo(name, repo, txn=txn) - except pisi.itembyrepodb.NotfoundError, e: - raise Error(_('Component %s not found') % name) - - def get_union_comp(self, name, txn = None, repo = pisi.itembyrepodb.repos ): - """get a union of all repository components packages, not just the first repo in order. - get only basic repo info from the first repo""" - def proc(txn): - s = self.d.d.get(name, txn=txn) - pkgs = set() - srcs = set() - for repostr in self.d.order(repo = repo): - if s.has_key(repostr): - pkgs |= set(s[repostr].packages) - srcs |= set(s[repostr].sources) - comp = self.get_component(name) - comp.packages = list(pkgs) - comp.sources = list(srcs) - return comp - return self.d.txn_proc(proc, txn) - - def list_components(self, repo=None): - return self.d.list(repo) - - # walk: walks through the underlying components' packages - def get_union_packages(self, component_name, walk=False, repo=pisi.itembyrepodb.repos, txn = None): - """returns union of all repository component's packages, not just the first repo's - component's in order""" - - component = self.get_union_comp(component_name, txn, repo) - if not walk: - return component.packages - - packages = [] - packages.extend(component.packages) - for dep in component.dependencies: - packages.extend(self.get_union_packages(dep, walk, repo, txn)) - - return packages - - # walk: walks through the underlying components' packages - def get_packages(self, component_name, walk=False, repo=None, txn = None): - """returns the given component's and underlying recursive components' packages""" - - component = self.get_component(component_name, repo, txn) - if not walk: - return component.packages - - packages = [] - packages.extend(component.packages) - for dep in component.dependencies: - packages.extend(self.get_packages(dep, walk, repo, txn)) - - return packages - - def add_child(self, component, repo, txn = None): - """update component tree""" - parent_name = ".".join(component.name.split(".")[:-1]) - if not parent_name: # root component - return - - if self.has_component(parent_name, repo, txn): - parent = self.get_component(parent_name, repo, txn) - else: - parent = Component(name = parent_name) - - if component.name not in parent.dependencies: - parent.dependencies.append(component.name) - self.d.add_item(parent_name, parent, repo, txn) - - def update_component(self, component, repo, txn = None): - def proc(txn): - if self.has_component(component.name, repo, txn): - # preserve list of sources, packages and dependencies - current = self.d.get_item(component.name, repo, txn) - component.packages = current.packages - component.sources = current.sources - component.dependencies = current.dependencies - self.d.add_item(component.name, component, repo, txn) - self.add_child(component, repo, txn) - self.d.txn_proc(proc, txn) - - def add_package(self, component_name, package, repo, txn = None): - def proc(txn): - assert component_name - if self.has_component(component_name, repo, txn): - component = self.get_component(component_name, repo, txn) - else: - component = Component( name = component_name ) - if not package in component.packages: - component.packages.append(package) - self.d.add_item(component_name, component, repo, txn) # update - self.add_child(component, repo, txn) - self.d.txn_proc(proc, txn) - - def remove_package(self, component_name, package, repo = None, txn = None): - def proc(txn, repo): - if not self.has_component(component_name, repo, txn): - raise Error(_('Information for component %s not available') % component_name) - if not repo: - repo = self.d.which_repo(component_name, txn=txn) # get default repo then - component = self.get_component(component_name, repo, txn) - if package in component.packages: - component.packages.remove(package) - self.d.add_item(component_name, component, repo, txn) # update - - ctx.txn_proc(lambda x: proc(txn, repo), txn) - - def add_spec(self, component_name, spec, repo, txn = None): - def proc(txn): - assert component_name - if self.has_component(component_name, repo, txn): - component = self.get_component(component_name, repo, txn) - else: - component = Component( name = component_name ) - if not spec in component.sources: - component.sources.append(spec) - self.d.add_item(component_name, component, repo, txn) # update - self.add_child(component, repo, txn) - self.d.txn_proc(proc, txn) - - def remove_spec(self, component_name, spec, repo = None, txn = None): - def proc(txn, repo): - if not self.has_component(component_name, repo, txn): - raise Error(_('Information for component %s not available') % component_name) - if not repo: - repo = self.d.which_repo(component_name, txn=txn) # get default repo then - component = self.get_component(component_name, repo, txn) - if spec in component.sources: - component.sources.remove(spec) - self.d.add_item(component_name, component, repo, txn) # update - - ctx.txn_proc(lambda x: proc(txn, repo), txn) - - def clear(self, txn = None): - self.d.clear(txn) - - def remove_component(self, name, repo = None, txn = None): - name = str(name) - self.d.remove_item(name, repo, txn) - - def remove_repo(self, repo, txn = None): - self.d.remove_repo(repo, txn=txn) diff --git a/tags/pisi-1.1_rc10/pisi/config.py b/tags/pisi-1.1_rc10/pisi/config.py deleted file mode 100644 index cfffd985..00000000 --- a/tags/pisi-1.1_rc10/pisi/config.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" -PiSi Configuration module is used for gathering and providing -regular PiSi configurations. -""" - -import os -from copy import deepcopy - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -from pisi.configfile import ConfigurationFile -import pisi.util -from pisi.util import join_path as join - -class Error(pisi.Error): - pass - -class Options(object): - def __getattr__(self, name): - if not self.__dict__.has_key(name): - return None - else: - return self.__dict__[name] - - def __setattr__(self, name, value): - self.__dict__[name] = value - -class Config(object): - """Config Singleton""" - - def __init__(self, options = Options()): - self.options = options - self.values = ConfigurationFile("/etc/pisi/pisi.conf") - - destdir = self.get_option('destdir') - if destdir: - if destdir.strip().startswith('/'): - self.destdir = destdir - else: - self.destdir = join(os.getcwd(), destdir) - else: - self.destdir = self.values.general.destinationdirectory - - if not os.path.exists(self.destdir): - ctx.ui.warning( _('Destination directory %s does not exist. Creating it.') % self.destdir) - os.makedirs(self.destdir) - - # get the initial environment variables. this is needed for - # build process. - self.environ = deepcopy(os.environ) - - def set_option(self, opt, val): - setattr(self.options, opt, val) - - def get_option(self, opt): - if self.options: - if hasattr(self.options, opt): - return getattr(self.options, opt) - return None - - # directory accessor functions - # here is how it goes - # x_dir: system wide directory for storing info type x - # pkg_x_dir: per package directory for storing info type x - - def dest_dir(self): - return self.destdir - - def subdir(self, path): - dir = join(self.dest_dir(), path) - pisi.util.check_dir(dir) - return dir - - def lib_dir(self): - return self.subdir(self.values.dirs.lib_dir) - - def db_dir(self): - return self.subdir(self.values.dirs.db_dir) - - def archives_dir(self): - return self.subdir(self.values.dirs.archives_dir) - - def packages_dir(self): - return self.subdir(self.values.dirs.packages_dir) - - def index_dir(self): - return self.subdir(self.values.dirs.index_dir) - - def tmp_dir(self): - sysdir = self.subdir(self.values.dirs.tmp_dir) - if os.environ.has_key('USER'): - userdir = self.subdir('/tmp/pisi-' + os.environ['USER']) - else: - userdir = self.subdir('/tmp/pisi-root') - # check write access - if os.access(sysdir, os.W_OK): - return sysdir - else: - return userdir - -#TODO: remove this -config = Config() diff --git a/tags/pisi-1.1_rc10/pisi/configfile.py b/tags/pisi-1.1_rc10/pisi/configfile.py deleted file mode 100644 index 7ccc9f7f..00000000 --- a/tags/pisi-1.1_rc10/pisi/configfile.py +++ /dev/null @@ -1,159 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -# PiSi Configuration File module, obviously, is used to read from the -# configuration file. Module also defines default values for -# configuration parameters. -# -# Configuration file is located in /etc/pisi/pisi.conf by default, -# having an INI like format like below. -# -#[general] -#destinationdirectory = / -#autoclean = False -# -#[build] -#host = i686-pc-linux-gnu -#generateDebug = False -#jobs = "-j1" -#CFLAGS= -mtune=i686 -O2 -pipe -fomit-frame-pointer -#CXXFLAGS= -mtune=i686 -O2 -pipe -fomit-frame-pointer -#LDFLAGS= -#buildno=True # necessary for generating build nos -#buildhelper = None / ccache / icecream -#compressionlevel = 7 -#fallback = "ftp://ftp.pardus.org.tr/pub/pisi/source" -# -#[directories] -#lib_dir = /var/lib/pisi -#db_dir = /var/db/pisi -#archives_dir = /var/cache/pisi/archives -#packages_dir = /var/cache/pisi/packages -#index_dir = /var/cache/pisi/index -#tmp_dir = /var/tmp/pisi -#kde_dir = /usr/kde/3.5 -#qt_dir = /usr/qt/3 - -import os -from ConfigParser import ConfigParser, NoSectionError - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi - -class Error(pisi.Error): - pass - -class GeneralDefaults: - """Default values for [general] section""" - destinationdirectory = "/" - autoclean = False - distribution = "Pardus" - distribution_release = "2007" - http_proxy = os.getenv("HTTP_PROXY") or None - https_proxy = os.getenv("HTTPS_PROXY") or None - ftp_proxy = os.getenv("FTP_PROXY") or None - -class BuildDefaults: - """Default values for [build] section""" - host = "i686-pc-linux-gnu" - jobs = "-j1" - generateDebug = False - cflags = "-mtune=i686 -O2 -pipe -fomit-frame-pointer" - cxxflags = "-mtune=i686 -O2 -pipe -fomit-frame-pointer" - ldflags = "" - buildno = False - buildhelper = None - compressionlevel = 7 - fallback = "ftp://ftp.pardus.org.tr/pub/pisi/source" - -class DirectoriesDefaults: - "Default values for [directories] section" - lib_dir = "/var/lib/pisi" - db_dir = "/var/db/pisi" - archives_dir = "/var/cache/pisi/archives" - packages_dir = "/var/cache/pisi/packages" - index_dir = "/var/lib/pisi/index" - tmp_dir = "/var/pisi" - kde_dir = "/usr/kde/3.5" - qt_dir = "/usr/qt/3" - -class ConfigurationSection(object): - """ConfigurationSection class defines a section in the configuration - file, using defaults (above) as a fallback.""" - def __init__(self, section, items=[]): - self.items = items - - if section == "general": - self.defaults = GeneralDefaults - elif section == "build": - self.defaults = BuildDefaults - elif section == "directories": - self.defaults = DirectoriesDefaults - else: - e = _("No section by name '%s'") % section - raise Error, e - - self.section = section - - def __getattr__(self, attr): - - # first search for attribute in the items provided in the - # configuration file. - if self.items: - for item in self.items: - if item[0] == attr: - # all values are returned as string types by ConfigParser. - # evaluate "True" or "False" strings to boolean. - if item[1] in ["True", "False", "None"]: - return eval(item[1]) - else: - return item[1] - - # then fall back to defaults - if hasattr(self.defaults, attr): - return getattr(self.defaults, attr) - - return "" - - # We'll need to access configuration keys by their names as a - # string. Like; ["default"]... - def __getitem__(self, key): - return self.__getattr__(key) - -class ConfigurationFile(object): - """Parse and get configuration values from the configuration file""" - def __init__(self, filePath): - parser = ConfigParser() - self.filePath = filePath - - parser.read(self.filePath) - - try: - generalitems = parser.items("general") - except NoSectionError: - generalitems = [] - self.general = ConfigurationSection("general", generalitems) - - try: - builditems = parser.items("build") - except NoSectionError: - builditems = [] - self.build = ConfigurationSection("build", builditems) - - try: - dirsitems = parser.items("directories") - except NoSectionError: - dirsitems = [] - self.dirs = ConfigurationSection("directories", dirsitems) diff --git a/tags/pisi-1.1_rc10/pisi/conflict.py b/tags/pisi-1.1_rc10/pisi/conflict.py deleted file mode 100644 index cdb6366d..00000000 --- a/tags/pisi-1.1_rc10/pisi/conflict.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""conflict analyzer""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi.context as ctx -from pisi.version import Version -import pisi.pxml.autoxml as autoxml -import pisi.itembyrepodb - -class Conflict: - - __metaclass__ = autoxml.autoxml - - s_Package = [autoxml.String, autoxml.mandatory] - a_version = [autoxml.String, autoxml.optional] - a_versionFrom = [autoxml.String, autoxml.optional] - a_versionTo = [autoxml.String, autoxml.optional] - a_release = [autoxml.String, autoxml.optional] - a_releaseFrom = [autoxml.String, autoxml.optional] - a_releaseTo = [autoxml.String, autoxml.optional] - - def __str__(self): - s = self.package - if self.versionFrom: - s += _(" version >= ") + self.versionFrom - if self.versionTo: - s += _(" version <= ") + self.versionTo - if self.releaseFrom: - s += _(" release >= ") + self.releaseFrom - if self.releaseTo: - s += _(" release <= ") + self.releaseTo - return s - - def conflicts(self, pkg_name, version, release): - """determine if a package ver. conflicts with given conflicting spec""" - ret = True - v = Version(version) - if self.version: - ret &= v == Version(self.version) - if self.versionFrom: - ret &= v >= Version(self.versionFrom) - if self.versionTo: - ret &= v <= Version(self.versionTo) - r = Version(release) - if self.release: - ret &= r == Version(self.release) - if self.releaseFrom: - ret &= r >= Version(self.releaseFrom) - if self.releaseTo: - ret &= r <= Version(self.releaseTo) - return ret - -def installed_package_conflicts(confinfo): - """determine if an installed package in *repository* conflicts with -given conflicting spec""" - pkg_name = confinfo.package - if not ctx.installdb.is_installed(pkg_name): - return False - else: - pkg = ctx.packagedb.get_package(pkg_name, pisi.itembyrepodb.installed) - (version, release) = (pkg.version, pkg.release) - return confinfo.conflicts(pkg_name, version, release) - -def package_conflicts(pkg, confs): - for c in confs: - if pkg.name == c.package and c.conflicts(pkg.name, pkg.version, pkg.release): - return c - - return None diff --git a/tags/pisi-1.1_rc10/pisi/constants.py b/tags/pisi-1.1_rc10/pisi/constants.py deleted file mode 100644 index 45353234..00000000 --- a/tags/pisi-1.1_rc10/pisi/constants.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""PiSi constants. -If you have a "magic" constant value this is where it should be -defined.""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi - -class _constant: - "Constant members implementation" - class ConstError(TypeError): - pass - - def __setattr__(self, name, value): - if self.__dict__.has_key(name): - raise self.ConstError, _("Can't rebind constant: %s") % name - # Binding an attribute once to a const is available - self.__dict__[name] = value - - def __delattr__(self, name): - if self.__dict__.has_key(name): - raise self.ConstError, _("Can't unbind constant: %s") % name - # we don't have an attribute by this name - raise NameError, name - -class Constants: - "Pisi Constants Singleton" - - __c = _constant() - - def __init__(self): - # suffix for package names - self.__c.package_suffix = ".pisi" - - # suffix for lzma - self.__c.lzma_suffix = ".lzma" - - # suffix for auto generated debug packages - self.__c.debug_name_suffix = "-debug" - self.__c.debug_file_suffix = ".debug" - - # suffix for auto generated ar packages - self.__c.static_name_suffix = "-static" # an admissible use of constant - self.__c.ar_file_suffix = ".a" - - # directory suffixes for build - self.__c.work_dir_suffix = "/work" # these, too, because we might wanna change 'em - self.__c.install_dir_suffix = "/install" - self.__c.debug_dir_suffix = "/debug" - - # file/directory names - #note: these don't seem very well, constants are used - #when it is easier/more meaningful to write the constant name, or - #when the constant is bound to change later on. - #in some places literals are just as good, for instance - #when constant is the same as string. readability is important... - self.__c.actions_file = "actions.py" - self.__c.files_dir = "files" - self.__c.metadata_dir = "metadata" - self.__c.comar_dir = "comar" - self.__c.files_xml = "files.xml" - self.__c.metadata_xml = "metadata.xml" - self.__c.install_tar = "install.tar" - self.__c.install_tar_lzma = "install.tar.lzma" - self.__c.mirrors_conf = "/etc/pisi/mirrors.conf" - - #file/directory permissions - self.__c.umask = 0022 - - # functions in actions_file - self.__c.setup_func = "setup" - self.__c.build_func = "build" - self.__c.install_func = "install" - - # file types - # FIXME: these seem redundant - self.__c.doc = "doc" - self.__c.man = "man" - self.__c.info = "info" - self.__c.conf = "config" - self.__c.header = "header" - self.__c.library = "library" - self.__c.executable = "executable" - self.__c.data = "data" - self.__c.localedata = "localedata" - - def __getattr__(self, attr): - return getattr(self.__c, attr) - - def __setattr__(self, attr, value): - setattr(self.__c, attr, value) - - def __delattr__(self, attr): - delattr(self.__c, attr) diff --git a/tags/pisi-1.1_rc10/pisi/context.py b/tags/pisi-1.1_rc10/pisi/context.py deleted file mode 100644 index 361ca92c..00000000 --- a/tags/pisi-1.1_rc10/pisi/context.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -# global variables here - -import signal - -import pisi.constants -import pisi.signalhandler - -const = pisi.constants.Constants() -sig = None - -config = None - -log = None - -def set_option(opt, val): - config.set_option(opt, val) - -def get_option(opt): - return config and config.get_option(opt) - -# default UI is CLI -ui = None # not now - -# stdout, stderr for PiSi API -stdout = None -stderr = None - -dbenv = None -installdb = None -packagedb = None -repodb = None -invidx = None - -comar = None -comar_sockname = None - -initialized = False - -# Bug #2879 -# FIXME: Maybe we can create a simple rollback mechanism. There are other -# places which need this, too. -# this is needed in build process to clean after if something goes wrong. -build_leftover = None - -#def register(_impl): -# """ Register a UI implementation""" -# ui = _impl - -import bsddb3.db as db - -# copy of DBShelve.txn_proc, the only difference is it doesn't need a shelf object -#FIXME: remove this redundancy, and move all this stuff to database.py -def txn_proc(proc, txn = None): - # can be used to txn protect a method automatically - if not txn: - if dbenv: - autotxn = dbenv.txn_begin() - try: - retval = proc(autotxn) - except db.DBError, e: - autotxn.abort() - raise e - except Exception, e: - autotxn.abort() - raise e - autotxn.commit() - else: - retval = proc(None) - return retval - else: - return proc(txn) - -def disable_keyboard_interrupts(): - sig and sig.disable_signal(signal.SIGINT) - -def enable_keyboard_interrupts(): - sig and sig.enable_signal(signal.SIGINT) - -def keyboard_interrupt_disabled(): - return sig and sig.signal_disabled(signal.SIGINT) - -def keyboard_interrupt_pending(): - return sig and sig.signal_pending(signal.SIGINT) diff --git a/tags/pisi-1.1_rc10/pisi/dbshelve.py b/tags/pisi-1.1_rc10/pisi/dbshelve.py deleted file mode 100644 index d3eb0f70..00000000 --- a/tags/pisi-1.1_rc10/pisi/dbshelve.py +++ /dev/null @@ -1,317 +0,0 @@ -#------------------------------------------------------------------------ -# Copyright (c) 1997-2001 by Total Control Software -# All Rights Reserved -#------------------------------------------------------------------------ -# -# Module Name: dbShelve.py -# -# Description: A reimplementation of the standard shelve.py that -# forces the use of cPickle, and DB. -# -# Creation Date: 11/3/97 3:39:04PM -# -# License: This is free software. You may use this software for any -# purpose including modification/redistribution, so long as -# this header remains intact and that you do not claim any -# rights of ownership or authorship of this software. This -# software has been tested, but no warranty is expressed or -# implied. -# -# 13-Dec-2000: Updated to be used with the new bsddb3 package. -# Added DBShelfCursor class. -# -# 13-Dec-2005: Minor hacking by exa to make it work better with PiSi -#------------------------------------------------------------------------ - -"""Manage shelves of pickled objects using bsddb database files for the -storage. - -Add transaction processing by default to dictionary ops also -Also other minor improvements -- exa - -Now added support for overriding the marshalling method -""" - -#------------------------------------------------------------------------ - -import cPickle -import bsddb3.db as db -import bsddb3.dbobj as dbobj -import string -import sys -import traceback -import pisi - -class CodingError(pisi.Error): - pass - -class DBShelf: - """A shelf to hold pickled objects, built upon a bsddb DB object. It - automatically pickles/unpickles data objects going to/from the DB. - """ - def __init__(self, dbenv = None): - self.dbenv = dbenv - # how lame is bsddb3? - if self.dbenv: - self.db = dbobj.DB(dbenv) - else: - self.db = db.DB(None) - - # it is better to explicitly close a shelf - #def __del__(self): - # self.close() - - allowed_chars = string.letters + string.digits + '-' - def check_key(key): - return pisi.util.all(lambda x: x in allowed_chars, key) - - def has_key(self, key, txn = None): - if txn: - return self.db.has_key(key, txn) - else: - return self.db.has_key(key) - - def txn_proc(self, proc, txn): - # can be used to txn protect a method automatically - if not txn: - if self.dbenv: - autotxn = self.dbenv.txn_begin() - try: - retval = proc(autotxn) - except db.DBError, e: - autotxn.abort() - raise pisi.Error, e - autotxn.commit() - else: # execute without transactions - retval = proc(None) - return retval - else: - return proc(txn) - - def decode(self, data): - try: - return cPickle.loads(data) - except cPickle.UnpicklingError: - raise CodingError() - - def encode(self, obj): - return cPickle.dumps(obj, 1) - - def clear(self, txn = None): - def proc(txn): - for x in self.keys(txn): - self.db.delete(x, txn) - self.txn_proc(proc, txn) - - def delete(self, x, txn): - def proc(txn): - self.db.delete(x, txn) - self.txn_proc(proc, txn) - - # another lame pythonic implementation method: - #def __getattr__(self, name): - # """Many methods we can just pass through to the DB object. - # (See below) - # """ - # print 'aptal bsddb3', name - # return getattr(self.db, name) - - #----------------------------------- - # Dictionary access methods - - def __len__(self): - return len(self.db) - - def __getitem__(self, key): - def proc(txn): - data = self.db.get(key) - return self.decode(data) - return self.txn_proc(proc, None) - - def __setitem__(self, key, value): - # hyperdandik transactions - def proc(txn): - data = self.encode(value) - self.db.put(key,data,txn) - return self.txn_proc(proc, None) - - def __delitem__(self, key): - txn = self.dbenv.txn_begin() - try: - self.db.delete(key, txn) - except db.DBError, e: - txn.abort() - raise e - txn.commit() - - def keys(self, txn=None): - if txn != None: - return self.db.keys(txn) - else: - return self.db.keys() - - def items(self, txn=None): - if txn != None: - items = self.db.items(txn) - else: - items = self.db.items() - newitems = [] - - for k, v in items: - newitems.append( (k, self.decode(v) ) ) - return newitems - - def values(self, txn=None): - if txn != None: - values = self.db.values(txn) - else: - values = self.db.values() - - return map(lambda x : self.decode(x), values) - - #----------------------------------- - # Other methods - - def __append(self, value, txn=None): - data = self.encode(value) - return self.db.append(data, txn) - - def append(self, value, txn=None): - if self.get_type() != db.DB_RECNO: - self.append = self.__append - return self.append(value, txn=txn) - raise db.DBError, "append() only supported when dbshelve opened with filetype=dbshelve.db.DB_RECNO" - - - def associate(self, secondaryDB, callback, flags=0): - def _shelf_callback(priKey, priData, realCallback=callback): - data = self.decode(priData) - return realCallback(priKey, data) - return self.db.associate(secondaryDB, _shelf_callback, flags) - - - #def get(self, key, default=None, txn=None, flags=0): - def get(self, *args, **kw): - # We do it with *args and **kw so if the default value wasn't - # given nothing is passed to the extension module. That way - # an exception can be raised if set_get_returns_none is turned - # off. - data = apply(self.db.get, args, kw) - try: - return self.decode(data) - except (TypeError, CodingError): - return data # we may be getting the default value, or None, - # so it doesn't need unpickled. - - def get_both(self, key, value, txn=None, flags=0): - data = self.encode(value) - data = self.db.get(key, data, txn, flags) - return self.decode(data) - - def cursor(self, txn=None, flags=0): - c = DBShelfCursor(self.db.cursor(txn, flags)) - c.binary = self.binary - return c - - def put(self, key, value, txn=None, flags=0): - data = self.encode(value) - return self.db.put(key, data, txn, flags) - - def join(self, cursorList, flags=0): - raise NotImplementedError - - #---------------------------------------------- - # Methods allowed to pass-through to self.db - # - # close, delete, fd, get_byteswapped, get_type, has_key, - # key_range, open, remove, rename, stat, sync, - # upgrade, verify, and all set_* methods. - - -#--------------------------------------------------------------------------- - -class DBShelfCursor: - """ - """ - def __init__(self, cursor): - self.dbc = cursor - - def __del__(self): - self.close() - - def __getattr__(self, name): - """Some methods we can just pass through to the cursor object. (See below)""" - return getattr(self.dbc, name) - - #---------------------------------------------- - - def dup(self, flags=0): - return DBShelfCursor(self.dbc.dup(flags)) - - def put(self, key, value, flags=0): - data = self.encode(value) - return self.dbc.put(key, data, flags) - - - def get(self, *args): - count = len(args) # a method overloading hack - method = getattr(self, 'get_%d' % count) - apply(method, args) - - def get_1(self, flags): - rec = self.dbc.get(flags) - return self._extract(rec) - - def get_2(self, key, flags): - rec = self.dbc.get(key, flags) - return self._extract(rec) - - def get_3(self, key, value, flags): - data = self.encode(value) - rec = self.dbc.get(key, flags) - return self._extract(rec) - - - def current(self, flags=0): return self.get_1(flags|db.DB_CURRENT) - def first(self, flags=0): return self.get_1(flags|db.DB_FIRST) - def last(self, flags=0): return self.get_1(flags|db.DB_LAST) - def next(self, flags=0): return self.get_1(flags|db.DB_NEXT) - def prev(self, flags=0): return self.get_1(flags|db.DB_PREV) - def consume(self, flags=0): return self.get_1(flags|db.DB_CONSUME) - def next_dup(self, flags=0): return self.get_1(flags|db.DB_NEXT_DUP) - def next_nodup(self, flags=0): return self.get_1(flags|db.DB_NEXT_NODUP) - def prev_nodup(self, flags=0): return self.get_1(flags|db.DB_PREV_NODUP) - - def get_both(self, key, value, flags=0): - data = self.encode(value) - rec = self.dbc.get_both(key, flags) - return self._extract(rec) - - def set(self, key, flags=0): - rec = self.dbc.set(key, flags) - return self._extract(rec) - - def set_range(self, key, flags=0): - rec = self.dbc.set_range(key, flags) - return self._extract(rec) - - def set_recno(self, recno, flags=0): - rec = self.dbc.set_recno(recno, flags) - return self._extract(rec) - - set_both = get_both - - def _extract(self, rec): - if rec is None: - return None - else: - key, data = rec - return key, self.decode(data) - - #---------------------------------------------- - # Methods allowed to pass-through to self.dbc - # - # close, count, delete, get_recno, join_item - - -#--------------------------------------------------------------------------- diff --git a/tags/pisi-1.1_rc10/pisi/dependency.py b/tags/pisi-1.1_rc10/pisi/dependency.py deleted file mode 100644 index a33df4ea..00000000 --- a/tags/pisi-1.1_rc10/pisi/dependency.py +++ /dev/null @@ -1,121 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""dependency analyzer""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi.context as ctx -#import pisi.packagedb as packagedb -from pisi.version import Version -import pisi.pxml.autoxml as autoxml -import pisi.itembyrepodb - -class Dependency: - - __metaclass__ = autoxml.autoxml - - s_Package = [autoxml.String, autoxml.mandatory] - a_version = [autoxml.String, autoxml.optional] - a_versionFrom = [autoxml.String, autoxml.optional] - a_versionTo = [autoxml.String, autoxml.optional] - a_release = [autoxml.String, autoxml.optional] - a_releaseFrom = [autoxml.String, autoxml.optional] - a_releaseTo = [autoxml.String, autoxml.optional] - - def __str__(self): - s = self.package - if self.versionFrom: - s += _(" version >= ") + self.versionFrom - if self.versionTo: - s += _(" version <= ") + self.versionTo - if self.releaseFrom: - s += _(" release >= ") + self.releaseFrom - if self.releaseTo: - s += _(" release <= ") + self.releaseTo - return s - - def satisfies(self, pkg_name, version, release): - """determine if a package ver. satisfies given dependency spec""" - ret = True - v = Version(version) - if self.version: - ret &= v == Version(self.version) - if self.versionFrom: - ret &= v >= Version(self.versionFrom) - if self.versionTo: - ret &= v <= Version(self.versionTo) - r = Version(release) - if self.release: - ret &= r == Version(self.release) - if self.releaseFrom: - ret &= r >= Version(self.releaseFrom) - if self.releaseTo: - ret &= r <= Version(self.releaseTo) - return ret - -def dict_satisfies_dep(dict, depinfo): - """determine if a package in a dictionary satisfies given dependency spec""" - pkg_name = depinfo.package - if not dict.has_key(pkg_name): - return False - else: - pkg = dict[pkg_name] - (version, release) = (pkg.version, pkg.release) - return depinfo.satisfies(pkg_name, version, release) - -def installed_satisfies_dep(depinfo): - """determine if a package in *repository* satisfies given -dependency spec""" - pkg_name = depinfo.package - if not ctx.installdb.is_installed(pkg_name): - return False - else: - pkg = ctx.packagedb.get_package(pkg_name, pisi.itembyrepodb.installed) - (version, release) = (pkg.version, pkg.release) - return depinfo.satisfies(pkg_name, version, release) - -def repo_satisfies_dep(depinfo): - """determine if a package in *repository* satisfies given -dependency spec""" - pkg_name = depinfo.package - if not ctx.packagedb.has_package(pkg_name): - return False - else: - pkg = ctx.packagedb.get_package(pkg_name) - (version, release) = (pkg.version, pkg.release) - return depinfo.satisfies(pkg_name, version, release) - -def satisfies_dependencies(pkg, deps, sat = installed_satisfies_dep): - for dep in deps: - if not sat(dep): - ctx.ui.error(_('Package %s does not satisfy dependency %s') % - (pkg,dep)) - return False - return True - -def satisfies_runtime_deps(pkg): - deps = ctx.packagedb.get_package(pkg).runtimeDependencies() - return satisfies_dependencies(pkg, deps) - -def installable(pkg): - """calculate if pkg name is installable currently - which means it has to satisfy both install and runtime dependencies""" - if not ctx.packagedb.has_package(pkg): - ctx.ui.info(_("Package %s is not present in the package database") % pkg); - return False - elif satisfies_runtime_deps(pkg): - return True - else: - return False diff --git a/tags/pisi-1.1_rc10/pisi/fetcher.py b/tags/pisi-1.1_rc10/pisi/fetcher.py deleted file mode 100644 index abe2d88a..00000000 --- a/tags/pisi-1.1_rc10/pisi/fetcher.py +++ /dev/null @@ -1,371 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""Yet another Pisi module for fetching files from various sources. Of -course, this is not limited to just fetching source files. We fetch -all kinds of things: source tarballs, index files, packages, and God -knows what.""" - -# python standard library modules -import urllib2 -import urllib -import ftplib -import os -import socket -import sys -from mimetypes import guess_type -from mimetools import Message -from base64 import encodestring -from shutil import move -from time import time -from time import gmtime - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# pisi modules -import pisi -import pisi.util as util -import pisi.context as ctx -from pisi.uri import URI - -class FetchError(pisi.Error): - pass - -class RangeError(pisi.Error): - pass - -# helper functions -def fetch_url(url, destdir, progress=None, resume=True): - fetch = Fetcher(url, destdir) - if not resume: - fetch.resume = False - fetch.progress = progress - fetch.fetch() - -class Fetcher: - """Fetcher can fetch a file from various sources using various - protocols.""" - def __init__(self, url, destdir, resume = True): - if not isinstance(url, URI): - url = URI(url) - - if ctx.config.get_option("authinfo"): - url.set_auth_info(ctx.config.get_option("authinfo")) - - self.resume = resume - self.scheme = url.scheme() - self.url = url - self.destdir = destdir - util.check_dir(self.destdir) - self.eta = '??:??:??' - self.percent = 0 - self.rate = 0.0 - self.progress = None - self.exist_size = 0 - - def fetch (self): - """Return value: Fetched file's full path..""" - - if not self.url.filename(): - self.err(_('Filename error')) - - if not os.access(self.destdir, os.W_OK): - self.err(_('Access denied to write to destination directory: "%s"') % (self.destdir)) - - archive_file = os.path.join(self.destdir, self.url.filename()) - - if os.path.exists(archive_file) and not os.access(archive_file, os.W_OK): - self.err(_('Access denied to destination file: "%s"') % (archive_file)) - - partial_file = archive_file + '.part' - - if self.url.is_local_file(): - self.fetchLocalFile(partial_file) - else: - self.fetchRemoteFile(partial_file) - - if os.stat(partial_file).st_size == 0: - os.remove(partial_file) - self.err(_('A problem occured. Please check the archive address and/or permissions again.')) - - move(partial_file, archive_file) - - return archive_file - - def _do_grab(self, fileURI, dest, total_size): - bs, tt, = 1024, int(time()) - s_time = time() - Tdiff = lambda: time() - s_time - downloaded_size = exist_size = self.exist_size - symbol = 'B/s' - st = time() - chunk = fileURI.read(bs) - downloaded_size += len(chunk) - - if self.progress: - p = self.progress(total_size, exist_size) - self.percent = p.update(downloaded_size) - self.complete = False - - while chunk: - dest.write(chunk) - chunk = fileURI.read(bs) - downloaded_size += len(chunk) - ct = time() - if int(tt) != int(ct): - self.rate = (downloaded_size - exist_size) / (ct - st) - - if self.percent: - self.eta = '%02d:%02d:%02d' %\ - tuple([i for i in gmtime((Tdiff() * (100 - self.percent)) / self.percent)[3:6]]) - - self.rate, symbol = util.human_readable_rate(self.rate) - - tt = time() - - if self.progress: - if p.update(downloaded_size): - self.percent = p.percent - if not self.complete: - ctx.ui.display_progress(operation = "fetching", - percent = self.percent, - filename = self.url.filename(), - total_size = total_size, - downloaded_size = downloaded_size, - rate = self.rate, - eta = self.eta, - symbol = symbol) - if self.percent == 100: #FIXME: will be superseded by a - self.complete = True # working progress interface - - dest.close() - - def fetchLocalFile (self, archive_file): - url = self.url - - if not os.access(url.path(), os.F_OK): - self.err(_('No such file or no permission to read')) - - dest = open(archive_file, 'w') - total_size = os.path.getsize(url.path()) - fileObj = open(url.path()) - self._do_grab(fileObj, dest, total_size) - - def fetchRemoteFile (self, archive_file): - from httplib import HTTPException - - if os.path.exists(archive_file) and self.resume: - if self.scheme == 'http' or self.scheme == 'https' or self.scheme == 'ftp': - self.exist_size = os.path.getsize(archive_file) - dest = open(archive_file, 'ab') - else: - dest = open(archive_file, 'wb') - - uri = self.url.get_uri() - - flag = 1 - try: - try: - try: - fileObj = urllib2.urlopen(self.formatRequest(urllib2.Request(uri))) - except RangeError: - ctx.ui.info(_('Requested range not satisfiable, starting again.')) - dest = open(archive_file, 'wb') - self.exist_size = 0 - fileObj = urllib2.urlopen(self.formatRequest(urllib2.Request(uri))) - headers = fileObj.info() - flag = 0 - except ValueError, e: - self.err(_('Cannot fetch %s; value error: %s') % (uri, e)) - except urllib2.HTTPError, e: - self.err(_('Cannot fetch %s; %s') % (uri, e)) - except urllib2.URLError, e: - self.err(_('Cannot fetch %s; %s') % (uri, e[-1][-1])) - except OSError, e: - self.err(_('Cannot fetch %s; %s') % (uri, e)) - except HTTPException, e: - self.err(_('Cannot fetch %s; (%s): %s') % (uri, e.__class__.__name__, e)) - finally: - if flag: - if os.stat(archive_file).st_size == 0: - os.remove(archive_file) - - try: - total_size = int(headers['Content-Length']) + self.exist_size - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - total_size = 0 - - self._do_grab(fileObj, dest, total_size) - - def formatRequest(self, request): - if self.url.auth_info(): - enc = encodestring('%s:%s' % self.url.auth_info()) - request.add_header('Authorization', 'Basic %s' % enc) - - range_handlers = { - 'http' : HTTPRangeHandler, - 'https': HTTPRangeHandler, - 'ftp' : FTPRangeHandler - } - - if self.exist_size and range_handlers.has_key(self.scheme): - opener = urllib2.build_opener(range_handlers.get(self.scheme)()) - urllib2.install_opener(opener) - request.add_header('Range', 'bytes=%d-' % self.exist_size) - - proxy_handler = None - - if ctx.config.values.general.http_proxy and self.url.scheme() == "http": - http_proxy = ctx.config.values.general.http_proxy - proxy_handler = urllib2.ProxyHandler({URI(http_proxy).scheme(): http_proxy}) - - elif ctx.config.values.general.https_proxy and self.url.scheme() == "https": - https_proxy = ctx.config.values.general.https_proxy - proxy_handler = urllib2.ProxyHandler({URI(https_proxy): https_proxy}) - - elif ctx.config.values.general.ftp_proxy and self.url.scheme() == "ftp": - ftp_proxy = ctx.config.values.general.ftp_proxy - proxy_handler = urllib2.ProxyHandler({URI(http_proxy): ftp_proxy}) - - if proxy_handler: - ctx.ui.info(_("Proxy configuration has been found for '%s' protocol") % self.url.scheme()) - opener = urllib2.build_opener(proxy_handler) - urllib2.install_opener(opener) - - return request - - def err (self, error): - raise FetchError(error) - -class HTTPRangeHandler(urllib2.BaseHandler): - """ - to override the urllib2 error: 'Error 206: Partial Content' - this reponse from the HTTP server is already what we expected to get. - Don't give up, resume downloading.. - """ - - def http_error_206(self, request, fp, errcode, msg, headers): - return urllib.addinfourl(fp, headers, request.get_full_url()) - - def http_error_416(self, request, fp, errcode, msg, headers): - # HTTP 1.1's 'Range Not Satisfiable' error.. - raise RangeError - - -class FTPRangeHandler(urllib2.FTPHandler): - """ - FTP Range support.. - """ - def ftp_open(self, req): - host = req.get_host() - host, port = urllib.splitport(host) - if port is None: - port = ftplib.FTP_PORT - - try: - host = socket.gethostbyname(host) - except socket.error, msg: - raise FetchError(msg) - - path, attrs = urllib.splitattr(req.get_selector()) - dirs = path.split('/') - dirs = map(urllib.unquote, dirs) - dirs, file = dirs[:-1], dirs[-1] - if dirs and not dirs[0]: - dirs = dirs[1:] - try: - fw = self.connect_ftp('', '', host, port, dirs) - type = file and 'I' or 'D' - for attr in attrs: - attr, value = urllib.splitattr(attr) - if attr.lower() == 'type' and \ - value in ('a', 'A', 'i', 'I', 'd', 'D'): - type = value.upper() - - rawr = req.headers.get('Range', None) - if rawr: - rest = int(rawr.split("=")[1].rstrip("-")) - else: - rest = 0 - - fp, retrlen = fw.retrfile(file, type, rest) - - fb, lb = rest, retrlen - if retrlen is None or retrlen == 0: - raise RangeError - retrlen = lb - fb - if retrlen < 0: - # beginning of range is larger than file - raise RangeError - - headers = '' - mtype = guess_type(req.get_full_url())[0] - if mtype: - headers += 'Content-Type: %s\n' % mtype - if retrlen is not None and retrlen >= 0: - headers += 'Content-Length: %d\n' % retrlen - - try: - from cStringIO import StringIO - except ImportError, msg: - from StringIO import StringIO - - return urllib.addinfourl(fp, Message(StringIO(headers)), req.get_full_url()) - except ftplib.all_errors, msg: - raise IOError, (_('ftp error'), msg), sys.exc_info()[2] - - def connect_ftp(self, user, passwd, host, port, dirs): - fw = ftpwrapper('', '', host, port, dirs) - return fw - -class ftpwrapper(urllib.ftpwrapper): - def retrfile(self, file, type, rest=None): - self.endtransfer() - if type in ('d', 'D'): cmd = 'TYPE A'; isdir = 1 - else: cmd = 'TYPE ' + type; isdir = 0 - try: - self.ftp.voidcmd(cmd) - except ftplib.all_errors: - self.init() - self.ftp.voidcmd(cmd) - conn = None - if file and not isdir: - try: - self.ftp.nlst(file) - except ftplib.error_perm, reason: - raise IOError, (_('ftp error'), reason), sys.exc_info()[2] - # Restore the transfer mode! - self.ftp.voidcmd(cmd) - try: - cmd = 'RETR ' + file - conn = self.ftp.ntransfercmd(cmd, rest) - except ftplib.error_perm, reason: - if str(reason)[:3] == '501': - # workaround for REST not suported error - fp, retrlen = self.retrfile(file, type) - fp = RangeableFileObject(fp, (rest,'')) - return (fp, retrlen) - elif str(reason)[:3] != '550': - raise IOError, (_('ftp error'), reason), sys.exc_info()[2] - if not conn: - self.ftp.voidcmd('TYPE A') - if file: cmd = 'LIST ' + file - else: cmd = 'LIST' - conn = self.ftp.ntransfercmd(cmd) - self.busy = 1 - return (urllib.addclosehook(conn[0].makefile('rb'), - self.endtransfer), conn[1]) - diff --git a/tags/pisi-1.1_rc10/pisi/file.py b/tags/pisi-1.1_rc10/pisi/file.py deleted file mode 100644 index fb257735..00000000 --- a/tags/pisi-1.1_rc10/pisi/file.py +++ /dev/null @@ -1,266 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" -generic file abstraction that allows us to use URIs for everything -we support only the simple read case ATM -we are just encapsulating a common pattern in our program, nothing big. -like all pisi classes, it has been programmed in a non-restrictive way -""" - -import os -import types -import bz2 -import shutil - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -from pisi.uri import URI -from pisi.util import join_path as join -from pisi.fetcher import fetch_url -import pisi.context as ctx - -class AlreadyHaveException(pisi.Exception): - def __init__(self, url, localfile): - pisi.Exception.__init__(self, "URL %s already downloaded as %s" % (url, localfile)) - self.url = url - self.localfile = localfile - -class NoSignatureFound(pisi.Exception): - def __init__(self, url): - pisi.Exception.__init__(self, "No signature found for %s" % url) - self.url = url - -class Error(pisi.Error): - pass - -class InvalidSignature(pisi.Error): - def __init__(self, url): - pisi.Exception.__init__(self, " invalid for %s" % url) - self.url = url - -class File: - - (read, write) = range(2) # modes - (bz2, gzip, auto) = range(3) # compress enums - (detached, whatelse) = range(2) - - @staticmethod - def make_uri(uri): - "handle URI arg" - if type(uri) == types.StringType or type(uri) == types.UnicodeType: - uri = URI(uri) - elif not isinstance(uri, URI): - raise Error(_("uri must have type either URI or string")) - return uri - - @staticmethod - def choose_method(filename, compress): - # this is really simple (^_^) -- exa - if compress == File.auto: - if filename.endswith('.bz2'): - return File.bz2 - elif filename.endswith('.gz'): - return File.gzip - else: - return None - else: - return compress - - @staticmethod - def decompress(localfile, compress): - compress = File.choose_method(localfile, compress) - if compress == File.bz2: - open(localfile[:-4], "w").write(bz2.BZ2File(localfile).read()) - localfile = localfile[:-4] - elif compress == File.gzip: - raise Error(_("zip compression not supported yet")) - return localfile - - @staticmethod - def download(uri, transfer_dir = "/tmp", sha1sum = False, - compress = None, sign = None, copylocal = False): - - assert isinstance(uri, URI) - - if sha1sum: - sha1filename = File.download(URI(uri.get_uri() + '.sha1sum'), transfer_dir) - sha1f = file(sha1filename) - newsha1 = sha1f.read().split("\n")[0] - - if uri.is_remote_file() or copylocal: - localfile = join(transfer_dir, uri.filename()) - - # TODO: code to use old .sha1sum file, is this a necessary optimization? - #oldsha1fn = localfile + '.sha1sum' - #if os.exists(oldsha1fn): - #oldsha1 = file(oldsha1fn).readlines()[0] - if sha1sum and os.path.exists(localfile): - oldsha1 = pisi.util.sha1_file(localfile) - if (newsha1 == oldsha1): - # early terminate, we already got it ;) - raise AlreadyHaveException(uri, localfile) - - if uri.is_remote_file(): - ctx.ui.info(_("Fetching %s") % uri.get_uri(), verbose=True) - fetch_url(uri, transfer_dir, ctx.ui.Progress) - else: - # copy to transfer dir, - localfile = join(transfer_dir, uri.filename()) - ctx.ui.info(_("Copying %s to transfer dir") % uri.get_uri(), verbose=True) - shutil.copy(uri.get_uri(), transfer_dir) - else: - localfile = uri.get_uri() #TODO: use a special function here? - if not os.path.exists(localfile): - raise IOError(_("File '%s' not found.") % localfile) - if not os.access(localfile, os.W_OK): - oldfn = localfile - localfile = join(transfer_dir, os.path.basename(localfile)) - shutil.copy(oldfn, localfile) - - if sha1sum: - if (pisi.util.sha1_file(localfile) != newsha1): - raise Error(_("File integrity of %s compromised.") % uri) - - localfile = File.decompress(localfile, compress) - - return localfile - - - def __init__(self, uri, mode, transfer_dir = "/tmp", - sha1sum = False, compress = None, sign = None): - "it is pointless to open a file without a URI and a mode" - - self.transfer_dir = transfer_dir - self.sha1sum = sha1sum - self.compress = compress - self.sign = sign - - uri = File.make_uri(uri) - if mode==File.read or mode==File.write: - self.mode = mode - else: - raise Error(_("File mode must be either File.read or File.write")) - if uri.is_remote_file(): - if self.mode == File.read: - localfile = File.download(uri, transfer_dir, sha1sum, compress, sign) - else: - raise Error(_("Remote write not implemented")) - else: - localfile = uri.get_uri() - if self.mode == File.read: - localfile = File.decompress(localfile, self.compress) - - if self.mode == File.read: - access = 'r' - else: - access = 'w' - self.__file__ = file(localfile, access) - self.localfile = localfile - - def local_file(self): - "returns the underlying file object" - return self.__file__ - - def close(self, delete_transfer = False): - "this method must be called at the end of operation" - self.__file__.close() - if self.mode == File.write: - compressed_file = None - if self.compress == File.bz2: - compressed_file = self.localfile + ".bz2" - bz2.BZ2File(compressed_file, "w").write(open(self.localfile, "r").read()) - - elif self.compress == File.gzip: - raise Error(_("gzip compression not supported yet")) - - if self.sha1sum: - sha1 = pisi.util.sha1_file(self.localfile) - cs = file(self.localfile + '.sha1sum', 'w') - cs.write(sha1) - cs.close() - if compressed_file: - sha1 = pisi.util.sha1_file(compressed_file) - cs = file(compressed_file + '.sha1sum', 'w') - cs.write(sha1) - cs.close() - - if self.sign==File.detached: - if pisi.util.run_batch('gpg --detach-sig ' + self.localfile)[0]: - raise Error(_("ERROR: gpg --detach-sig %s failed") % self.localfile) - if compressed_file: - if pisi.util.run_batch('gpg --detach-sig ' + compressed_file)[0]: - raise Error(_("ERROR: gpg --detach-sig %s failed") % compressed_file) - - @staticmethod - def check_signature(uri, transfer_dir, sign=detached): - if sign==File.detached: - try: - sigfilename = File.download(URI(uri + '.sig'), transfer_dir) - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - raise NoSignatureFound(uri) - if os.system('gpg --verify ' + sigfilename) != 0: - raise InvalidSignature(uri) - # everything is all right here - - def flush(self): - self.__file__.flush() - - def fileno(self): - return self.__file__.fileno() - - def isatty(self): - return self.__file__.isatty() - - def next(self): - return self.__file__.next() - - def read(self, size = None): - if size: - return self.__file__.read(size) - else: - return self.__file__.read() - - def readline(self, size = None): - if size: - return self.__file__.readline(size) - else: - return self.__file__.readline() - - def readlines(self, size = None): - if size: - return self.__file__.readlines(size) - else: - return self.__file__.readlines() - - def xreadlines(self): - return self.__file__.xreadlines() - - def seek(self, offset, whence=0): - self.__file__.seek(offset, whence) - - def tell(self): - return self.__file__.tell() - - def truncate(self): - self.__file__.truncate() - - def write(self, str): - self.__file__.write(str) - - def writelines(self, sequence): - self.__file__.writelines(sequence) diff --git a/tags/pisi-1.1_rc10/pisi/files.py b/tags/pisi-1.1_rc10/pisi/files.py deleted file mode 100644 index 0dab0d0b..00000000 --- a/tags/pisi-1.1_rc10/pisi/files.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -'''Files module provides access to files.xml. files.xml is generated -during the build process of a package and used in installation.''' - - -import pisi.pxml.autoxml as autoxml -import pisi.lockeddbshelve as shelve - - -class FileInfo: - """File holds the information for a File node/tag in files.xml""" - - __metaclass__ = autoxml.autoxml - - t_Path = [ autoxml.String, autoxml.mandatory ] - t_Type = [ autoxml.String, autoxml.mandatory ] - t_Size = [ autoxml.Long, autoxml.optional ] - t_Uid = [ autoxml.String, autoxml.optional ] - t_Gid = [ autoxml.String, autoxml.optional ] - t_Mode = [ autoxml.String, autoxml.optional ] - t_Hash = [ autoxml.String, autoxml.optional, "SHA1Sum" ] - t_Permanent = [ autoxml.String, autoxml.optional ] - - def __str__(self): - s = "/%s, type: %s, size: %s, sha1sum: %s" % (self.path, self.type, - self.size, self.hash) - return s - - -class Files(autoxml.XmlFile): - - __metaclass__ = autoxml.autoxml - - tag = "Files" - - t_List = [ [FileInfo], autoxml.optional, "File"] - - def append(self, fileinfo): - self.list.append(fileinfo) - - -class FilesDB(shelve.LockedDBShelf): - - def __init__(self): - shelve.LockedDBShelf.__init__(self, 'files') - - def add_files(self, pkg_name, files, txn = None): - def proc(txn): - for x in files.list: - path = x.path - del x.path # don't store redundant attribute in db - self.put(path, (pkg_name, x), txn) - x.path = path # store it back in - self.txn_proc(proc, txn) - - def remove_files(self, files, txn = None): - def proc(txn): - for x in files.list: - if self.has_key(x.path): - self.delete(x.path, txn) - self.txn_proc(proc, txn) - - def has_file(self, path, txn = None): - return self.has_key(str(path), txn) - - def get_file(self, path, txn = None): - path = str(path) - def proc(txn): - if not self.has_key(path, txn): - return None - else: - (name, fileinfo) = self.get(path, txn) - fileinfo.path = path - return (name, fileinfo) - return self.txn_proc(proc, txn) - - def match_files(self, glob): - # NB: avoid using, this reads the entire db - import fnmatch - glob = str(glob) - infos = [] - for key in self.keys(): - if fnmatch.fnmatch(key, glob): - - # FIXME: Why should we assign path attribute manually - # in fileinfo? This is also done in get_file(), seems - # like a dirty workaround... - baris - name = self[key][0] - fileinfo = self[key][1] - fileinfo.path = key - infos.append((name, fileinfo)) - return infos diff --git a/tags/pisi-1.1_rc10/pisi/graph.py b/tags/pisi-1.1_rc10/pisi/graph.py deleted file mode 100644 index d11a0dc6..00000000 --- a/tags/pisi-1.1_rc10/pisi/graph.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# the most simple minded digraph class ever - - -import sys -import string - -import pisi - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# not an error! - -class CycleException(pisi.Exception): - def __init__(self, cycle): - self.cycle = cycle - - def __str__(self): - return _('Encountered cycle %s') % self.cycle - -class Digraph(object): - - def __init__(self): - self.__v = set() - self.__adj = {} - self.__vdata = {} - self.__edata = {} - - def vertices(self): - "return set of vertex descriptors" - return self.__v - - def edges(self): - "return a list of edge descriptors" - list = [] - for u in self.__v: - for v in self.__adj[u]: - list.append( (u,v) ) - return list - - def from_list(self, el): - "convert a list of edges (u,v) to graph" - for (u,v) in el: - self.add_edge(u,v) - - def add_vertex(self, u, data = None): - "add vertex u, optionally with data" - assert not u in self.__v - self.__v.add(u) - self.__adj[u] = set() - if data: - self.__vdata[u] = data - self.__edata[u] = {} - - def add_edge(self, u, v, edata = None, udata = None, vdata = None): - "add edge u -> v" - if not u in self.__v: - self.add_vertex(u, udata) - if not v in self.__v: - self.add_vertex(v, vdata) - self.__adj[u].add(v) - if edata != None: - self.__edata[u][v] = edata - - def add_biedge(self, u, v, edata = None): - self.add_edge(u, v, edata) - self.add_edge(v, u, edata) - - def set_vertex_data(self, u, data): - self.__vdata[u] = data - - def vertex_data(self, u): - return self.__vdata[u] - - def edge_data(self, u, v): - return self.__edata[u][v] - - def has_vertex(self, u): - return u in self.__v - - def has_edge(self, u,v): - if u in self.__v: - return v in self.__adj[u] - else: - return False - - def adj(self, u): - return self.__adj[u] - - def dfs(self, finish_hook = None): - self.color = {} - self.p = {} - self.d = {} - self.f = {} - for u in self.__v: - self.color[u] = 'w' # mark white (unexplored) - self.p[u] = None - self.time = 0 - for u in self.__v: - if self.color[u] == 'w': - self.dfs_visit(u, finish_hook) - - def dfs_visit(self, u, finish_hook): - self.color[u] = 'g' # mark green (discovered) - self.d[u] = self.time = self.time + 1 - for v in self.adj(u): - if self.color[v] == 'w': # explore unexplored vertices - self.p[v] = u - self.dfs_visit(v, finish_hook) - elif self.color[v] == 'g': # cycle detected - cycle = [u] - while self.p[u]: - u = self.p[u] - cycle.append(u) - cycle.reverse() - raise CycleException(cycle) - self.color[u] = 'b' # mark black (completed) - if finish_hook: - finish_hook(u) - self.f[u] = self.time = self.time + 1 - - def cycle_free(self): - try: - self.dfs() - return True - except CycleException: - return False - - def topological_sort(self): - list = [] - self.dfs(lambda u: list.append(u)) - list.reverse() - return list - - def id_str(self, u): - def repl(char): - if char in string.punctuation: - return '_' - else: - return char - return pisi.util.concat(map(repl, str(u))) - - def write_graphviz(self, f): - f.write('digraph G {\n') - for u in self.vertices(): - f.write(self.id_str(u)) - self.write_graphviz_vlabel(f, u) - f.write(';\n') - f.write('\n') - for u in self.vertices(): - for v in self.adj(u): - f.write( self.id_str(u) + ' -> ' + self.id_str(v)) - self.write_graphviz_elabel(f, u, v) - f.write(';\n') - f.write('\n') - f.write('}\n') - - def write_graphviz_vlabel(self, f, u): - pass - - def write_graphviz_elabel(self, f, u, v): - pass - diff --git a/tags/pisi-1.1_rc10/pisi/index.py b/tags/pisi-1.1_rc10/pisi/index.py deleted file mode 100644 index fa801250..00000000 --- a/tags/pisi-1.1_rc10/pisi/index.py +++ /dev/null @@ -1,181 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""PiSi source/package index""" - -import os -import shutil - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -import pisi.specfile as specfile -import pisi.metadata as metadata -import pisi.packagedb as packagedb -import pisi.sourcedb as sourcedb -import pisi.util as util -from pisi.package import Package -from pisi.pxml.xmlfile import XmlFile -from pisi.file import File -import pisi.pxml.autoxml as autoxml -from pisi.uri import URI -import pisi.component as component -import pisi.specfile as specfile - - -class Error(pisi.Error): - pass - -class Index(XmlFile): - __metaclass__ = autoxml.autoxml - - tag = "PISI" - - t_Distribution = [ component.Distribution, autoxml.optional ] - t_Specs = [ [specfile.SpecFile], autoxml.optional, "SpecFile"] - t_Packages = [ [metadata.Package], autoxml.optional, "Package"] - #t_Metadatas = [ [metadata.MetaData], autoxml.optional, "MetaData"] - t_Components = [ [component.Component], autoxml.optional, "Component"] - - def name(self): - return self.distribution.name + self.distribution.repositoryname - - def read_uri(self, uri, tmpdir, force = False): - self.read(uri, tmpDir=tmpdir, sha1sum=not force, - compress=File.auto, sign=File.detached, copylocal = True) - - # read index for a given repo, force means download even if remote not updated - def read_uri_of_repo(self, uri, repo = None, force = False): - """Read PSPEC file""" - if repo: - tmpdir = os.path.join(ctx.config.index_dir(), repo) - else: - tmpdir = os.path.join(ctx.config.tmp_dir(), 'index') - pisi.util.clean_dir(tmpdir) - pisi.util.check_dir(tmpdir) - - # write uri - urlfile = file(pisi.util.join_path(tmpdir, 'uri'), 'w') - urlfile.write(uri) # uri - urlfile.close() - - self.read_uri(uri, tmpdir, force) - - if not repo: - repo = self.distribution.name() - # and what do we do with it? move it to index dir properly - newtmpdir = os.path.join(ctx.config.index_dir(), repo) - pisi.util.clean_dir(newtmpdir) # replace newtmpdir - shutil.move(tmpdir, newtmpdir) - - def check_signature(self, filename, repo): - tmpdir = os.path.join(ctx.config.index_dir(), repo) - File.check_signature(filename, tmpdir) - - def index(self, repo_uri, skip_sources=False): - self.repo_dir = repo_uri - for root, dirs, files in os.walk(repo_uri): - for fn in files: - if fn.endswith(ctx.const.package_suffix): - ctx.ui.info(_('Adding %s to package index') % fn) - self.add_package(os.path.join(root, fn), repo_uri) - if fn == 'component.xml': - ctx.ui.info(_('Adding %s to component index') % fn) - self.add_component(os.path.join(root, fn)) - if fn == 'pspec.xml' and not skip_sources: - self.add_spec(os.path.join(root, fn), repo_uri) - if fn == 'distribution.xml': - self.add_distro(os.path.join(root, fn)) - - def update_db(self, repo, txn = None): - # FIXME: updating db takes too much time. So a notify mechanism is used to inform the status - # of the operation. - - self.progress = ctx.ui.Progress(len(self.packages)+len(self.specs)) - self.processed = 0 - - def update_progress(): - self.processed += 1 - ctx.ui.display_progress(operation = "updatingrepo", - percent = self.progress.update(self.processed), - info = _("Updating package database of %s") % repo) - - ctx.componentdb.remove_repo(repo, txn=txn) - for comp in self.components: - ctx.componentdb.update_component(comp, repo, txn) - ctx.packagedb.remove_repo(repo, txn=txn) - for pkg in self.packages: - ctx.packagedb.add_package(pkg, repo, txn=txn) - update_progress() - ctx.sourcedb.remove_repo(repo, txn=txn) - for sf in self.specs: - ctx.sourcedb.add_spec(sf, repo, txn=txn) - update_progress() - - def add_package(self, path, repo_uri): - package = Package(path, 'r') - md = package.get_metadata() - md.package.packageSize = os.path.getsize(path) - md.package.packageHash = util.sha1_file(path) - if ctx.config.options and ctx.config.options.absolute_urls: - md.package.packageURI = os.path.realpath(path) - else: # create relative path by default - # TODO: in the future well do all of this with purl/pfile/&helpers - # really? heheh -- future exa - md.package.packageURI = util.removepathprefix(repo_uri, path) - # check package semantics - errs = md.errors() - if md.errors(): - ctx.ui.error(_('Package %s: metadata corrupt, skipping...') % md.package.name) - ctx.ui.error(unicode(Error(*errs))) - else: - # No need to carry these with index (#3965) - md.package.files = None - md.package.additionalFiles = None - self.packages.append(md.package) - - def add_component(self, path): - comp = component.Component() - #try: - comp.read(path) - self.components.append(comp) - #except: - # raise Error(_('Component in %s is corrupt') % path) - #ctx.ui.error(str(Error(*errs))) - - def add_distro(self, path): - distro = component.Distribution() - #try: - distro.read(path) - self.distribution = distro - #except: - # raise Error(_('Distribution in %s is corrupt') % path) - #ctx.ui.error(str(Error(*errs))) - - def add_spec(self, path, repo_uri): - import pisi.build - ctx.ui.info(_('Adding %s to source index') % path) - #TODO: may use try/except to handle this - builder = pisi.build.Builder(path) - #ctx.ui.error(_('SpecFile in %s is corrupt, skipping...') % path) - #ctx.ui.error(str(Error(*errs))) - builder.fetch_component() - sf = builder.spec - if ctx.config.options and ctx.config.options.absolute_urls: - sf.source.sourceURI = os.path.realpath(path) - else: # create relative path by default - sf.source.sourceURI = util.removepathprefix(repo_uri, path) - # check component - self.specs.append(sf) diff --git a/tags/pisi-1.1_rc10/pisi/installdb.py b/tags/pisi-1.1_rc10/pisi/installdb.py deleted file mode 100644 index 9e36be74..00000000 --- a/tags/pisi-1.1_rc10/pisi/installdb.py +++ /dev/null @@ -1,217 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# -# -# installation database -# - -# System -import os -import fcntl - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# PiSi -import pisi -import pisi.context as ctx -import pisi.lockeddbshelve as shelve -from pisi.files import Files -import pisi.util as util -from pisi.util import join_path as join - - -class InstallDBError(pisi.Error): - pass - - -class InstallInfo: - # some data is replicated from packagedb - # we store as an object, hey, we can waste O(1) space. - # this is also easier to modify in the future, without - # requiring database upgrades! wow! - def __init__(self, state, version, release, build, distribution, time): - self.state = state - self.version = version - self.release = release - self.build = build - self.distribution = distribution - self.time = time - - def one_liner(self): - import time - time_str = time.strftime("%d %b %Y %H:%M", self.time) - s = '%2s|%10s|%6s|%6s|%8s|%12s' % (self.state, self.version, self.release, - self.build, self.distribution, - time_str) - return s - - state_map = { 'i': _('installed'), 'ip':_('installed-pending'), - 'r':_('removed'), 'p': _('purged') } - - def __str__(self): - s = _("State: %s\nVersion: %s, Release: %s, Build: %s\n") % \ - (InstallInfo.state_map[self.state], self.version, - self.release, self.build) - import time - time_str = time.strftime("%d %b %Y %H:%M", self.time) - s += _('Distribution: %s, Install Time: %s\n') % (self.distribution, - time_str) - return s - - -class InstallDB: - - def __init__(self): - self.d = shelve.LockedDBShelf('install') - self.dp = shelve.LockedDBShelf('configpending') - self.files_dir = join(ctx.config.db_dir(), 'files') - - def close(self): - self.d.close() - self.dp.close() - - def files_name(self, pkg, version, release): - pkg_dir = self.pkg_dir(pkg, version, release) - return join(pkg_dir, ctx.const.files_xml) - - def files(self, pkg): - pkg = str(pkg) - pkginfo = self.d[pkg] - files = Files() - files.read(self.files_name(pkg,pkginfo.version,pkginfo.release)) - return files - - def pkg_dir(self, pkg, version, release): - return join(ctx.config.lib_dir(), 'package', - pkg + '-' + version + '-' + release) - - def is_recorded(self, pkg, txn = None): - pkg = str(pkg) - def proc(txn): - return self.d.has_key(pkg) - return self.d.txn_proc(proc, txn) - - def is_installed(self, pkg, txn = None): - pkg = str(pkg) - def proc(txn): - if self.is_recorded(pkg, txn): - info = self.d.get(pkg, txn) - return info.state=='i' or info.state=='ip' - else: - return False - return self.d.txn_proc(proc, txn) - - def list_installed(self, txn = None): - def proc(txn): - list = [] - for (pkg, info) in self.d.items(txn): - if info.state=='i' or info.state=='ip': - list.append(pkg) - return list - return self.d.txn_proc(proc, txn) - - def list_pending(self): - # warning: reads the entire db - dict = {} - for (pkg, x) in self.dp.items(): - pkginfo = self.d[pkg] - dict[pkg] = pkginfo - return dict - - def get_info(self, pkg): - pkg = str(pkg) - return self.d[pkg] - - def get_version(self, pkg): - pkg = str(pkg) - info = self.d[pkg] - return (info.version, info.release, info.build) - - def is_removed(self, pkg): - pkg = str(pkg) - if self.is_recorded(pkg): - info = self.d[pkg] - return info.state=='r' - else: - return False - - def install(self, pkg, version, release, build, distro = "", - config_later = False, rebuild=False, txn = None): - """install package with specific version, release, build""" - pkg = str(pkg) - def proc(txn): - if self.is_installed(pkg, txn): - raise InstallDBError(_("Already installed")) - if config_later: - state = 'ip' - self.dp.put(pkg, True, txn) - else: - state = 'i' - - # FIXME: it might be more appropriate to pass date - # as an argument, or installation data afterwards - # to do this -- exa - if not rebuild: - import time - ctime = time.localtime() - else: - files_xml = self.files_name(pkg, version, release) - ctime = util.creation_time(files_xml) - - self.d.put(pkg, InstallInfo(state, version, release, build, distro, ctime), txn) - - self.d.txn_proc(proc,txn) - - def clear_pending(self, pkg, txn = None): - pkg = str(pkg) - def proc(txn): - info = self.d.get(pkg, txn) - if self.is_installed(pkg, txn): - assert info.state == 'ip' - info.state = 'i' - self.d.put(pkg, info, txn) - self.dp.delete(pkg, txn) - self.d.txn_proc(proc,txn) - - def remove(self, pkg, txn = None): - pkg = str(pkg) - def proc(txn): - info = self.d.get(pkg, txn) - info.state = 'r' - self.d.put(pkg, info, txn) - if self.dp.has_key(pkg): - self.dp.delete(pkg, txn) - self.d.txn_proc(proc, txn) - - def purge(self, pkg, txn = None): - pkg = str(pkg) - def proc(txn): - if self.d.has_key(pkg, txn): - self.d.delete(pkg, txn) - self.d.txn_proc(proc, txn) - -db = None - -def init(): - global db - if db: - return db - - db = InstallDB() - return db - -def finalize(): - global db - if db: - db.close() - db = None diff --git a/tags/pisi-1.1_rc10/pisi/itembyrepodb.py b/tags/pisi-1.1_rc10/pisi/itembyrepodb.py deleted file mode 100644 index 11741336..00000000 --- a/tags/pisi-1.1_rc10/pisi/itembyrepodb.py +++ /dev/null @@ -1,220 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import fcntl -import types - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.util as util -import pisi.context as ctx -import pisi.lockeddbshelve as shelve - -installed, thirdparty, repos, all = range(1, 5) - -"""installed and thirdparty are special databases to keep track -of already installed stuff and third party stuff not in any real repository. -repos means search in repositories only, and all means search in -repositories and special databases (called tracking databases) -""" - -class Error(pisi.Error): - pass - -class NotfoundError(pisi.Error): - pass - -class ItemByRepoDB(object): - - def __init__(self, name): - self.d = shelve.LockedDBShelf(name) - #self.dbyrepo = shelve.LockedDBShelf(name + '-byrepo') - - def close(self): - self.d.close() - - def clear(self, txn = None): - self.d.clear(txn=txn) - - def txn_proc(self, proc, txn): - return self.d.txn_proc(proc, txn) - - def items(self): - return self.d.items() - - @staticmethod - def not_just_tracking(data): - keys = data.keys() - if len(keys)==1: - if 'trdparty' in keys or 'inst' in keys: - return False - elif len(keys)==2: - if 'trdparty' in keys and 'inst' in keys: - return False - return True - #below is a slower way - #for x in data.keys(): - # if x.startsWith('repo-'): - # return True - #return False - - def list_if(self, pred): - return [ k for k,data in self.d.items() if pred(k, data)] - - def list(self, repo = None): - if repo == None: - repo = repos - if repo not in [repos, all]: - return [ k for k,data in self.d.items() if data.has_key(self.repo_str(repo))] - else: - if repo == all: - return [ pkg for pkg in self.d.keys() ] - else: - return self.list_if( lambda k,data: ItemByRepoDB.not_just_tracking(data) ) - - # TODO: carry this to repodb, really :/ - def order(self, repo = None): - if repo == None: - repo = repos - assert repo in [all, repos] - import pisi.repodb - order = [ 'repo-' + x for x in ctx.repodb.list() ] - if repo == all: - order += ['trdparty', 'inst'] - return order - -# def list_repo(self, repo): -# return self.dbyrepo[repo] - - def repo_str(self, repo): - if repo==thirdparty: - repo='trdparty' - elif repo==installed: - repo='inst' - else: - assert type(repo) == type("") - repo='repo-'+repo - return repo - - def str_repo(self, str): - if str.startswith('repo-'): - return str[5:] - elif str=='trdparty': - return thirdparty - elif str=='inst': - return installed - else: - raise Error(_('Invalid repository string')) - - def has_key(self, name, repo = None, txn = None): - name = str(name) - if repo == None: - repo = repos - haskey = self.d.has_key(name, txn) - if repo == all: - return haskey - elif repo == repos: - data = self.d.get(name, txn) - return haskey and ItemByRepoDB.not_just_tracking(data) - else: - repostr = self.repo_str(repo) - return haskey and self.d.get(name, txn).has_key(repostr) - - def get_item_repo(self, name, repo = None, txn = None): - name = str(name) - if repo == None: - repo = repos - def proc(txn): - if not self.d.has_key(name, txn=txn): - raise NotfoundError(_('Key %s not found') % name) - s = self.d.get(name, txn=txn) - if repo in [repos, all]: - for repostr in self.order(repo): - if s.has_key(repostr): - return (s[repostr], self.str_repo(repostr)) - else: - repostr = self.repo_str(repo) - if s.has_key(repostr): - return (s[repostr], repo) - raise NotfoundError(_('Key %s in repo %s not found') % (name, repo)) - #return None - - return self.d.txn_proc(proc, txn) - - def get_item(self, name, repo = None, txn = None): - if repo == None: - repo = repos - x = self.get_item_repo(name, repo, txn) - if x: - item, repo = x - # discard repo, not always needed - return item - else: - return None - - def which_repo(self, name, txn = None): - x = self.get_item_repo(name, txn=txn) - if x: - item, repo = x - return repo - else: - return None - - def add_item(self, name, obj, repo, txn = None): - assert not repo in [all, repos] - repostr = self.repo_str(repo) - def proc(txn): - if not self.d.has_key(name): - s = dict() - else: - s = self.d.get(name, txn) - s[ repostr ] = obj - self.d.put(name, s, txn) - self.d.txn_proc(proc, txn) - - def remove_item_repo(self, name, repo, txn = None): - assert not repo in [all, repos] - name = str(name) - def p(txn): - s = self.d.get(name, txn) - repostr = self.repo_str(repo) - if s.has_key(repostr): - del s[repostr] - if not len(s): - self.d.delete(name, txn) - else: - self.d.put(name, s, txn) - self.d.txn_proc(p, txn) - - def remove_item_only(self, name, txn = None): - def p(txn): - repo = self.which_repo(name, txn=txn) - self.remove_item_repo(name, repo, txn=txn) - self.d.txn_proc(p, txn) - - def remove_item(self, name, repo=None, txn=None): - if repo == None: - repo = repos - if not repo in [all, repos]: - self.remove_item_repo(name, repo,txn=txn) - else: - self.remove_item_only(name,txn=txn) - - def remove_repo(self, repo, txn = None): - def proc(txn): - for key in self.d.keys(): - self.remove_item_repo(key, repo, txn=txn) - self.d.txn_proc(proc, txn) diff --git a/tags/pisi-1.1_rc10/pisi/lockeddbshelve.py b/tags/pisi-1.1_rc10/pisi/lockeddbshelve.py deleted file mode 100644 index ea8cb9ed..00000000 --- a/tags/pisi-1.1_rc10/pisi/lockeddbshelve.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import fcntl -import types - -import bsddb3.db as db -import bsddb3.dbobj as dbobj -import pisi.dbshelve as shelve - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -from pisi.util import join_path - -from pisi.version import Version - -class Error(pisi.Error): - pass - -# check database version -# if write is given it knows it has write access -# if force is given it updates the specified db version -def check_dbversion(versionfile, ver, write=False, update=False): - verfn = join_path(pisi.context.config.db_dir(), versionfile) - firsttime = False - if os.path.exists(verfn): - verfile = file(verfn, 'r') - ls = verfile.readlines() - currver = Version(ls[0]) - dbver = Version(ver) - if currver < dbver: - if not update: - raise Error(_('Database version for %s insufficient. Please run rebuild-db command.') % versionfile) - else: - pass # continue to update, then - elif currver > dbver: - raise Error(_('Database version for %s greater than PiSi version. You need a newer PiSi.') % versionfile) - elif not update: - return True # db version is OK - else: - firsttime = True - if write and (update or firsttime): - if os.access(pisi.context.config.db_dir(), os.W_OK): - verfile = file(verfn, 'w') - verfile.write(ver) - verfile.close() - else: - raise Error(_('Cannot attain write access to database environment')) - else: - raise Error(_('Database version %s not present.') % versionfile) - -def lock_dbenv(): - ctx.dbenv_lock = file(join_path(pisi.context.config.db_dir(), 'dbenv.lock'), 'w') - try: - fcntl.flock(ctx.dbenv_lock, fcntl.LOCK_EX | fcntl.LOCK_NB) - except IOError: - raise Error(_("Another instance of PiSi is running. Only one instance is allowed to modify the PiSi database at a time.")) - -# write: write access to database environment -# writeversion: would you like to be able -def init_dbenv(write=False, writeversion=False): - if os.access(pisi.context.config.db_dir(), os.R_OK): - # try to read version - check_dbversion('dbversion', pisi.__dbversion__, write=write, update=writeversion) - check_dbversion('filesdbversion', pisi.__filesdbversion__, write=write, update=writeversion) - else: - raise Error(_('Cannot attain read access to database environment')) - if write: - if os.access(pisi.context.config.db_dir(), os.W_OK): - lock_dbenv() - ctx.dbenv = dbobj.DBEnv() - flags = (db.DB_INIT_MPOOL | # cache - db.DB_INIT_TXN | # transaction subsystem - db.DB_INIT_LOG | # logging subsystem - db.DB_RECOVER | # run normal recovery - db.DB_CREATE) # allow db to create files - ctx.dbenv.set_cachesize(0, 4*1024*1024) - ctx.dbenv.open(pisi.context.config.db_dir(), flags) - ctx.dbenv.set_flags(db.DB_LOG_AUTOREMOVE, 1) # clear inactive logs automatically - else: - raise Error(_("Cannot attain write access to PiSi database. You have to be root for this operation.")) - else: - ctx.dbenv = None # read-only access to database - -class LockedDBShelf(shelve.DBShelf): - """A simple wrapper to implement locking for bsddb's dbshelf""" - - def __init__(self, dbname, mode=0644, - filetype=db.DB_BTREE, dbenv = None): - if dbenv == None: - dbenv = ctx.dbenv - shelve.DBShelf.__init__(self, dbenv) - filename = join_path(pisi.context.config.db_dir(), dbname + '.bdb') - if dbenv and os.access(os.path.dirname(filename), os.W_OK): - flags = 'w' - elif os.access(filename, os.R_OK): - flags = 'r' - else: - raise Error(_('Cannot attain read or write access to database %s') % dbname) - self.open(filename, dbname, filetype, flags, mode) - - def destroy(self): - os.unlink(self.filename) - - def __del__(self): - # superclass does something funky, we don't need that - pass - - def open(self, filename, dbname, filetype, flags=db.DB_CREATE, mode=0644): - self.filename = filename - self.closed = False - if type(flags) == type(''): - sflag = flags - if sflag == 'r': - flags = db.DB_RDONLY - elif sflag == 'rw': - flags = 0 - elif sflag == 'w': - flags = db.DB_CREATE - elif sflag == 'c': - flags = db.DB_CREATE - elif sflag == 'n': - flags = db.DB_TRUNCATE | db.DB_CREATE - else: - raise Error, _("Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags") - self.flags = flags - if self.flags & db.DB_RDONLY == 0: - flags |= db.DB_AUTO_COMMIT # use txn subsystem in write mode - self.lock() - filename = os.path.realpath(filename) # we give absolute path due to dbenv - #print 'opening', filename, filetype, flags, mode - return self.db.open(filename, None, filetype, flags, mode) - - def lock(self): - self.lockfile = file(self.filename + '.lock', 'w') - try: - fcntl.flock(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) - except IOError: - raise Error(_("Another instance of PiSi is running. Only one instance is allowed to modify the PiSi database at a time.")) - - def close(self): - if self.closed: - return - self.db.close() - if self.flags & db.DB_RDONLY == 0: - self.unlock() - self.closed = True - - def unlock(self): - self.lockfile.close() - os.unlink(self.filename + '.lock') - - @staticmethod - def encodekey(key): - '''utility method for dbs that must store unicodes in keys''' - if type(key)==types.UnicodeType: - return key.encode('utf-8') - elif type(key)==types.StringType: - return key - else: - raise Error('Key must be either string or unicode') diff --git a/tags/pisi-1.1_rc10/pisi/metadata.py b/tags/pisi-1.1_rc10/pisi/metadata.py deleted file mode 100644 index f26e5ac1..00000000 --- a/tags/pisi-1.1_rc10/pisi/metadata.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" -Metadata module provides access to metadata.xml. metadata.xml is -generated during the build process of a package and used in the -installation. Package repository also uses metadata.xml for building -a package index. -""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi.context as ctx -import pisi.specfile as specfile -import pisi.pxml.xmlfile as xmlfile -import pisi.pxml.autoxml as autoxml -import pisi.util as util - -class Source: - __metaclass__ = autoxml.autoxml - - t_Name = [autoxml.String, autoxml.mandatory] - t_Homepage = [autoxml.String, autoxml.optional] - t_Packager = [specfile.Packager, autoxml.mandatory] - -class Package(specfile.Package): - __metaclass__ = autoxml.autoxml - - t_Build = [ autoxml.Integer, autoxml.optional] - t_Distribution = [ autoxml.String, autoxml.mandatory] - t_DistributionRelease = [ autoxml.String, autoxml.mandatory] - t_Architecture = [ autoxml.String, autoxml.mandatory] - t_InstalledSize = [ autoxml.Long, autoxml.mandatory] - t_PackageSize = [ autoxml.Long, autoxml.optional] - t_PackageHash = [ autoxml.String, autoxml.optional, "SHA1Sum" ] - t_PackageURI = [ autoxml.String, autoxml.optional] - t_PackageFormat = [ autoxml.String, autoxml.optional] - - t_Source = [ Source, autoxml.optional] - - def decode_hook(self, node, errs, where): - self.version = self.history[0].version - self.release = self.history[0].release - - def __str__(self): - s = specfile.Package.__str__(self) - s += _('Distribution: %s, Dist. Release: %s\n') % \ - (self.distribution, self.distributionRelease) - s += _('Architecture: %s, Installed Size: %s') % \ - (self.architecture, self.installedSize) - return s - -class MetaData(xmlfile.XmlFile): - """Package metadata. Metadata is composed of Specfile and various - other information. A metadata has two parts, Source and Package.""" - - __metaclass__ = autoxml.autoxml - - tag = "PISI" - - t_Source = [ Source, autoxml.mandatory] - t_Package = [ Package, autoxml.mandatory] - #t_History = [ [Update], autoxml.mandatory] - - def from_spec(self, src, pkg, history): - # this just copies fields, it doesn't fix every necessary field - self.source.name = src.name - self.source.homepage = src.homepage - self.source.packager = src.packager - self.package.source = self.source # FIXME: I know that replication sucks here, but this is the easiest for now-- exa - self.package.name = pkg.name - self.package.summary = pkg.summary - self.package.description = pkg.description - self.package.icon = pkg.icon - # merge pkg.isA with src.isA - pkg.isA.extend(src.isA) - self.package.isA = pkg.isA - self.package.partOf = pkg.partOf - self.package.license = pkg.license - self.package.packageDependencies = pkg.packageDependencies - self.package.componentDependencies = pkg.componentDependencies - self.package.files = pkg.files - # FIXME: no need to copy full history with comments - self.package.history = history - self.package.conflicts = pkg.conflicts - self.package.providesComar = pkg.providesComar - #self.package.requiresComar = pkg.requiresComar - self.package.additionalFiles = pkg.additionalFiles - - # FIXME: right way to do it? - self.source.version = src.version - self.source.release = src.release - self.package.version = src.version - self.package.release = src.release diff --git a/tags/pisi-1.1_rc10/pisi/mirrors.py b/tags/pisi-1.1_rc10/pisi/mirrors.py deleted file mode 100644 index e0c75386..00000000 --- a/tags/pisi-1.1_rc10/pisi/mirrors.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import os.path -import pisi.context as ctx -from pisi import Error - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -class Mirrors: - def __init__(self, config=ctx.const.mirrors_conf): - self.mirrors = {} - self._parse(config) - - def get_mirrors(self, name): - if self.mirrors.has_key(name): - return list(self.mirrors[name]) - - return None - - def _add_mirror(self, name, url): - if self.mirrors.has_key(name): - self.mirrors[name].append(url) - else: - self.mirrors[name] = [url] - - def _parse(self, config): - if os.path.exists(config): - for line in open(config, "r").readlines(): - if not line.startswith('#') and not line == '\n': - mirror = line.strip().split() - if len(mirror) == 2: - (name, url) = mirror - self._add_mirror(name, url) - else: - raise Error(_('Mirrors file %s does not exist. Could not resolve mirrors://') % config) - diff --git a/tags/pisi-1.1_rc10/pisi/oo.py b/tags/pisi-1.1_rc10/pisi/oo.py deleted file mode 100644 index 5b893f24..00000000 --- a/tags/pisi-1.1_rc10/pisi/oo.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# - -# Guido's cool metaclass examples. fair use. ahahah. -# I find these quite handy. Use them :) - -class autoprop(type): - def __init__(cls, name, bases, dict): - super(autoprop, cls).__init__(name, bases, dict) - props = {} - for name in dict.keys(): - if name.startswith("_get_") or name.startswith("_set_"): - props[name[5:]] = 1 - for name in props.keys(): - fget = getattr(cls, "_get_%s" % name, None) - fset = getattr(cls, "_set_%s" % name, None) - setattr(cls, name, property(fget, fset)) - -class autosuper(type): - def __init__(cls, name, bases, dict): - super(autosuper, cls).__init__(name, bases, dict) - setattr(cls, "_%s__super" % name, super(cls)) - -class autosuprop(autosuper, autoprop): - pass - -class autoeq(type): - "useful for structures" - def __init__(cls, name, bases, dict): - super(autoeq, cls).__init__(name, bases, dict) - def equal(self, other): - return self.__dict__ == other.__dict__ - cls.__eq__ = equal - -class Struct: - __metaclass__ = autoeq - - def __init__(self, **entries): - self.__dict__.update(entries) diff --git a/tags/pisi-1.1_rc10/pisi/operations.py b/tags/pisi-1.1_rc10/pisi/operations.py deleted file mode 100644 index 1aff30ac..00000000 --- a/tags/pisi-1.1_rc10/pisi/operations.py +++ /dev/null @@ -1,813 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import sys - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -from pisi.uri import URI -import pisi.util as util -import pisi.dependency as dependency -import pisi.conflict -import pisi.pgraph as pgraph -import pisi.packagedb as packagedb -import pisi.repodb -import pisi.installdb -from pisi.index import Index -import pisi.cli -import pisi.atomicoperations as atomicoperations -import pisi.ui as ui -from pisi.version import Version - -class Error(pisi.Error): - pass - -def upgrade_pisi(): - """forces to reload pisi modules and runs rebuild-db if needed.""" - import pisi - import pisi.context as ctx - import pisi.version - - old_filesdbversion = pisi.__filesdbversion__ - old_dbversion = pisi.__dbversion__ - # we have to keep old_ui or by calling raw init, we lose it - old_ui = ctx.ui - - def rebuild_db(): - """rebuild_db is necessary if database structures has changed.""" - if pisi.version.Version(pisi.__filesdbversion__) > pisi.version.Version(old_filesdbversion) or \ - pisi.version.Version(pisi.__dbversion__) > pisi.version.Version(old_dbversion): - - pisi.api.init(database=False, ui=old_ui) - #FIXME: we can not use _( ) here or NoneType object is not callable error is seen from package-manager - ctx.ui.info("* PiSi database version has changed. Rebuilding database...") - pisi.api.rebuild_db(files=True) - ctx.ui.info("* Database rebuild operation is completed succesfully.") - pisi.api.finalize() - - def reload_pisi(): - for module in sys.modules.keys(): - if not module.startswith("pisi.ui") and not module.startswith("pisi.cli") and module.startswith("pisi."): - """removal from sys.modules forces reload via import""" - del(sys.modules[module]) - - pisi.api.finalize() - reload_pisi() - reload(pisi) - rebuild_db() - pisi.api.init(ui=old_ui) - -# high level operations - -def install(packages, reinstall = False, ignore_file_conflicts=False): - """install a list of packages (either files/urls, or names)""" - - if not ctx.get_option('ignore_file_conflicts'): - ctx.set_option('ignore_file_conflicts', ignore_file_conflicts) - - # FIXME: this function name "install" makes impossible to import - # and use install module directly. - from pisi.atomicoperations import Error as InstallError - - # determine if this is a list of files/urls or names - if packages and packages[0].endswith(ctx.const.package_suffix): # they all have to! - return install_pkg_files(packages) - else: - return install_pkg_names(packages, reinstall) - -def reorder_base_packages(order): - """system.base packages must be first in order""" - systembase = ctx.componentdb.get_union_comp('system.base').packages - - systembase_order = [] - nonbase_order = [] - for pkg in order: - if pkg in systembase: - systembase_order.append(pkg) - else: - nonbase_order.append(pkg) - - return systembase_order + nonbase_order - -def install_pkg_files(package_URIs): - """install a number of pisi package files""" - from package import Package - - ctx.ui.debug('A = %s' % str(package_URIs)) - - for x in package_URIs: - if not x.endswith(ctx.const.package_suffix): - raise Error(_('Mixing file names and package names not supported yet.')) - - if ctx.config.get_option('ignore_dependency'): - # simple code path then - for x in package_URIs: - atomicoperations.install_single_file(x) - return # short circuit - - # read the package information into memory first - # regardless of which distribution they come from - d_t = {} - dfn = {} - for x in package_URIs: - package = Package(x) - package.read() - name = str(package.metadata.package.name) - d_t[name] = package.metadata.package - dfn[name] = x - - def satisfiesDep(dep): - # is dependency satisfied among available packages - # or packages to be installed? - return dependency.installed_satisfies_dep(dep) \ - or dependency.dict_satisfies_dep(d_t, dep) - - # for this case, we have to determine the dependencies - # that aren't already satisfied and try to install them - # from the repository - dep_unsatis = [] - for name in d_t.keys(): - pkg = d_t[name] - deps = pkg.runtimeDependencies() - for dep in deps: - if not satisfiesDep(dep): - dep_unsatis.append(dep) - - # now determine if these unsatisfied dependencies could - # be satisfied by installing packages from the repo - - # if so, then invoke install_pkg_names - extra_packages = [x.package for x in dep_unsatis] - if extra_packages: - ctx.ui.info(_("""The following packages will be installed -in the respective order to satisfy extra dependencies: -""") + util.strlist(extra_packages)) - if not ctx.ui.confirm(_('Do you want to continue?')): - raise Error(_('External dependencies not satisfied')) - install_pkg_names(extra_packages) - - class PackageDB: - def get_package(self, key, repo = None): - return d_t[str(key)] - - packagedb = PackageDB() - - A = d_t.keys() - - if len(A)==0: - ctx.ui.info(_('No packages to install.')) - return - - # try to construct a pisi graph of packages to - # install / reinstall - - G_f = pgraph.PGraph(packagedb) # construct G_f - - # find the "install closure" graph of G_f by package - # set A using packagedb - for x in A: - G_f.add_package(x) - B = A - while len(B) > 0: - Bp = set() - for x in B: - pkg = packagedb.get_package(x) - for dep in pkg.runtimeDependencies(): - if dependency.dict_satisfies_dep(d_t, dep): - if not dep.package in G_f.vertices(): - Bp.add(str(dep.package)) - G_f.add_dep(x, dep) - B = Bp - if ctx.config.get_option('debug'): - G_f.write_graphviz(sys.stdout) - order = G_f.topological_sort() - if not ctx.get_option('ignore_package_conflicts'): - conflicts = check_conflicts(order, packagedb) - if conflicts: - remove_conflicting_packages(conflicts) - order.reverse() - ctx.ui.info(_('Installation order: ') + util.strlist(order) ) - - if ctx.get_option('dry_run'): - return - - ctx.ui.notify(ui.packagestogo, order = order) - - for x in order: - atomicoperations.install_single_file(dfn[x]) - - pisi_installed = ctx.installdb.is_installed('pisi') - - if 'pisi' in order and pisi_installed: - upgrade_pisi() - -def check_conflict(pkg, order): - conflicts = [] - - for conflict in pkg.conflicts: - if conflict.package not in order and pisi.conflict.installed_package_conflicts(conflict): - conflicts.append(conflict) - - return conflicts - -def calculate_conflicts(order, packagedb): - B_0 = set(order) - C = D = set() - pkg_conflicts = {} - - for x in order: - pkg = packagedb.get_package(x) - - # check if any package has conflicts with the installed packages - conflicts = check_conflict(pkg, order) - if conflicts: - pkg_conflicts[x] = map(lambda c:str(c), conflicts) - C = C.union(map(lambda c:c.package, conflicts)) - - # now check if any package has conflicts with each other - B_i = B_0.intersection(set(map(lambda c:c.package, pkg.conflicts))) - D_i = set() - for p in map(lambda x:packagedb.get_package(x), B_i): - conflicted = pisi.conflict.package_conflicts(p, pkg.conflicts) - if conflicted: - D_i.add(str(conflicted)) - - if D_i: - D = D.union(D_i) - D.add(pkg.name) - - return (C, D, pkg_conflicts) - -def remove_conflicting_packages(conflicts): - if remove(conflicts, ignore_dep=True, ignore_safety=True) == False: - raise Error(_("Conflicts remain")) - -def check_conflicts(order, packagedb): - """check if upgrading to the latest versions will cause havoc - done in a simple minded way without regard for dependencies of - conflicts, etc.""" - - (C, D, pkg_conflicts) = calculate_conflicts(order, packagedb) - - if D: - raise Error(_("Selected packages [%s] are in conflict with each other.") % - util.strlist(list(D))) - - if pkg_conflicts: - conflicts = "" - for pkg in pkg_conflicts.keys(): - conflicts += _("[%s conflicts with: %s]\n") % (pkg, util.strlist(pkg_conflicts[pkg])) - - ctx.ui.info(_("The following packages have conflicts:\n%s") % - conflicts) - - if not ctx.ui.confirm(_('Remove the following conflicting packages?')): - raise Error(_("Conflicts remain")) - - return list(C) - -def is_upgradable(name, ignore_build = False): - if not ctx.installdb.is_installed(name): - return False - (version, release, build) = ctx.installdb.get_version(name) - try: - pkg = ctx.packagedb.get_package(name) - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - return False - if ignore_build or (not build) or (not pkg.build): - return Version(release) < Version(pkg.release) - else: - return build < pkg.build - -def upgrade_base(A = set(), ignore_package_conflicts = False): - ignore_build = ctx.get_option('ignore_build_no') - if not ctx.get_option('ignore_safety'): - if ctx.componentdb.has_component('system.base'): - systembase = set(ctx.componentdb.get_union_comp('system.base').packages) - extra_installs = filter(lambda x: not ctx.installdb.is_installed(x), systembase - set(A)) - if extra_installs: - ctx.ui.warning(_('Safety switch: Following packages in system.base will be installed: ') + - util.strlist(extra_installs)) - G_f, install_order = plan_install_pkg_names(extra_installs, ignore_package_conflicts) - extra_upgrades = filter(lambda x: is_upgradable(x, ignore_build), systembase - set(install_order)) - upgrade_order = [] - if extra_upgrades: - ctx.ui.warning(_('Safety switch: Following packages in system.base will be upgraded: ') + - util.strlist(extra_upgrades)) - G_f, upgrade_order = plan_upgrade(extra_upgrades, ignore_build) - # return packages that must be added to any installation - return set(install_order + upgrade_order) - else: - ctx.ui.warning(_('Safety switch: the component system.base cannot be found')) - return set() - -def install_pkg_names(A, reinstall = False): - """This is the real thing. It installs packages from - the repository, trying to perform a minimum number of - installs""" - - A = [str(x) for x in A] #FIXME: why do we still get unicode input here? :/ -- exa - # A was a list, remove duplicates - A_0 = A = set(A) - - # filter packages that are already installed - if not reinstall: - Ap = set(filter(lambda x: not ctx.installdb.is_installed(x), A)) - d = A - Ap - if len(d) > 0: - ctx.ui.warning(_("The following package(s) are already installed and are not going to be installed again:\n") + - util.strlist(d)) - A = Ap - - if len(A)==0: - ctx.ui.info(_('No packages to install.')) - return - - A |= upgrade_base(A) - - if not ctx.config.get_option('ignore_dependency'): - G_f, order = plan_install_pkg_names(A) - else: - G_f = None - order = list(A) - - # Bug 4211 - if ctx.componentdb.has_component('system.base'): - order = reorder_base_packages(order) - - if len(order) > 1: - ctx.ui.info(_("Following packages will be installed in the respective " - "order to satisfy dependencies:\n") + util.strlist(order)) - - total_size, cached_size = calculate_download_sizes(order) - total_size, symbol = util.human_readable_size(total_size) - ctx.ui.info(_('Total size of package(s): %.2f %s') % (total_size, symbol)) - - if ctx.get_option('dry_run'): - return - - if set(order) - A_0: - if not ctx.ui.confirm(_('There are extra packages due to dependencies. Do you want to continue?')): - return False - - ctx.ui.notify(ui.packagestogo, order = order) - - pisi_installed = ctx.installdb.is_installed('pisi') - - for x in order: - atomicoperations.install_single_name(x, True) # allow reinstalls here - - if 'pisi' in order and pisi_installed: - upgrade_pisi() - -def plan_install_pkg_names(A, ignore_package_conflicts = False): - # try to construct a pisi graph of packages to - # install / reinstall - - G_f = pgraph.PGraph(ctx.packagedb) # construct G_f - - # find the "install closure" graph of G_f by package - # set A using packagedb - for x in A: - G_f.add_package(x) - B = A - - while len(B) > 0: - Bp = set() - for x in B: - pkg = ctx.packagedb.get_package(x) - for dep in pkg.runtimeDependencies(): - ctx.ui.debug('checking %s' % str(dep)) - # we don't deal with already *satisfied* dependencies - if not dependency.installed_satisfies_dep(dep): - if not dep.package in G_f.vertices(): - Bp.add(str(dep.package)) - G_f.add_dep(x, dep) - B = Bp - if ctx.config.get_option('debug'): - G_f.write_graphviz(sys.stdout) - order = G_f.topological_sort() - order.reverse() - if not ctx.get_option('ignore_package_conflicts') and not ignore_package_conflicts: - conflicts = check_conflicts(order, ctx.packagedb) - if conflicts: - remove_conflicting_packages(conflicts) - return G_f, order - -def upgrade(A): - upgrade_pkg_names(A) - -def upgrade_pkg_names(A = []): - """Re-installs packages from the repository, trying to perform - a minimum or maximum number of upgrades according to options.""" - - ignore_build = ctx.get_option('ignore_build_no') - security_only = ctx.get_option('security_only') - - if not A: - # if A is empty, then upgrade all packages - A = ctx.installdb.list_installed() - - A_0 = A = set(A) - - Ap = [] - for x in A: - if x.endswith(ctx.const.package_suffix): - ctx.ui.debug(_("Warning: package *name* ends with '.pisi'")) - - if not ctx.installdb.is_installed(x): - ctx.ui.info(_('Package %s is not installed.') % x, True) - continue - (version, release, build) = ctx.installdb.get_version(x) - if ctx.packagedb.has_package(x): - pkg = ctx.packagedb.get_package(x) - else: - ctx.ui.info(_('Package %s is not available in repositories.') % x, True) - continue - - if security_only: - updates = [i for i in pkg.history if Version(i.release) > Version(release)] - if not pisi.util.any(lambda i:i.type == 'security', updates): - continue - - if ignore_build or (not build) or (not pkg.build): - if Version(release) < Version(pkg.release): - Ap.append(x) - else: - ctx.ui.info(_('Package %s is already at the latest release %s.') - % (pkg.name, pkg.release), True) - else: - if build < pkg.build: - Ap.append(x) - else: - ctx.ui.info(_('Package %s is already at the latest build %s.') - % (pkg.name, pkg.build), True) - - - A = set(Ap) - - if len(A)==0: - ctx.ui.info(_('No packages to upgrade.')) - return True - - A |= upgrade_base(A) - - ctx.ui.debug('A = %s' % str(A)) - - if not ctx.config.get_option('ignore_dependency'): - G_f, order = plan_upgrade(A, ignore_build) - else: - G_f = None - order = list(A) - - # Bug 4211 - if ctx.componentdb.has_component('system.base'): - order = reorder_base_packages(order) - - if not ctx.get_option('ignore_package_conflicts'): - conflicts = check_conflicts(order, ctx.packagedb) - - ctx.ui.info(_('The following packages will be upgraded: ') + - util.strlist(order)) - - total_size, cached_size = calculate_download_sizes(order) - total_size, symbol = util.human_readable_size(total_size) - ctx.ui.info(_('Total size of package(s): %.2f %s') % (total_size, symbol)) - - if ctx.get_option('dry_run'): - return - - if set(order) - A_0: - if not ctx.ui.confirm(_('There are extra packages due to dependencies. Do you want to continue?')): - return False - - ctx.ui.notify(ui.packagestogo, order = order) - - paths = [] - for x in order: - install_op = atomicoperations.Install.from_name(x) - paths.append(install_op.package_fname) - - # fetch to be upgraded packages but do not install them. - if ctx.get_option('fetch_only'): - return - - if not ctx.get_option('ignore_package_conflicts'): - if conflicts: - remove_conflicting_packages(conflicts) - - for path in paths: - install_op = atomicoperations.Install(path, ignore_file_conflicts = True) - install_op.install(True) - - if 'pisi' in order: - upgrade_pisi() - -def plan_upgrade(A, ignore_build = False): - # try to construct a pisi graph of packages to - # install / reinstall - - packagedb = ctx.packagedb - - G_f = pgraph.PGraph(packagedb) # construct G_f - - # find the "install closure" graph of G_f by package - # set A using packagedb - for x in A: - G_f.add_package(x) - B = A - - # TODO: conflicts - - while len(B) > 0: - Bp = set() - for x in B: - pkg = packagedb.get_package(x) - for dep in pkg.runtimeDependencies(): - # add packages that can be upgraded - if dependency.repo_satisfies_dep(dep): - if ctx.installdb.is_installed(dep.package): - if dependency.installed_satisfies_dep(dep): - continue - if not dep.package in G_f.vertices(): - Bp.add(str(dep.package)) - G_f.add_dep(x, dep) - else: - ctx.ui.error(_('Dependency %s of %s cannot be satisfied') % (dep, x)) - raise Error(_("Upgrade is not possible.")) - B = Bp - # now, search reverse dependencies to see if anything - # should be upgraded - B = A - while len(B) > 0: - Bp = set() - for x in B: - pkg = packagedb.get_package(x) - rev_deps = packagedb.get_rev_deps(x) - for (rev_dep, depinfo) in rev_deps: - # add only installed but unsatisfied reverse dependencies - if ctx.installdb.is_installed(rev_dep) and \ - (not dependency.installed_satisfies_dep(depinfo)): - if not dependency.repo_satisfies_dep(depinfo): - raise Error(_('Reverse dependency %s of %s cannot be satisfied') % (rev_dep, x)) - if not rev_dep in G_f.vertices(): - Bp.add(rev_dep) - G_f.add_plain_dep(rev_dep, x) - B = Bp - - if ctx.config.get_option('debug'): - G_f.write_graphviz(sys.stdout) - order = G_f.topological_sort() - order.reverse() - return G_f, order - -def remove(A, ignore_dep = False, ignore_safety = False): - """remove set A of packages from system (A is a list of package names)""" - - A = [str(x) for x in A] - - # filter packages that are not installed - A_0 = A = set(A) - - if not ctx.get_option('ignore_safety') and not ignore_safety: - if ctx.componentdb.has_component('system.base'): - systembase = set(ctx.componentdb.get_union_comp('system.base').packages) - refused = A.intersection(systembase) - if refused: - ctx.ui.warning(_('Safety switch: cannot remove the following packages in system.base: ') + - util.strlist(refused)) - A = A - systembase - else: - ctx.ui.warning(_('Safety switch: the component system.base cannot be found')) - - Ap = [] - for x in A: - if ctx.installdb.is_installed(x): - Ap.append(x) - else: - ctx.ui.info(_('Package %s does not exist. Cannot remove.') % x) - A = set(Ap) - - if len(A)==0: - ctx.ui.info(_('No packages to remove.')) - return False - - if not ctx.config.get_option('ignore_dependency') and not ignore_dep: - G_f, order = plan_remove(A) - else: - G_f = None - order = A - - ctx.ui.info(_("""The following minimal list of packages will be removed -in the respective order to satisfy dependencies: -""") + util.strlist(order)) - if len(order) > len(A_0): - if not ctx.ui.confirm(_('Do you want to continue?')): - ctx.ui.warning(_('Package removal declined')) - return False - - if ctx.get_option('dry_run'): - return - - ctx.ui.notify(ui.packagestogo, order = order) - - for x in order: - if ctx.installdb.is_installed(x): - atomicoperations.remove_single(x) - else: - ctx.ui.info(_('Package %s is not installed. Cannot remove.') % x) - -def plan_remove(A): - # try to construct a pisi graph of packages to - # install / reinstall - - G_f = pgraph.PGraph(ctx.packagedb, pisi.itembyrepodb.installed) # construct G_f - - # find the (install closure) graph of G_f by package - # set A using packagedb - for x in A: - G_f.add_package(x) - B = A - while len(B) > 0: - Bp = set() - for x in B: - pkg = ctx.packagedb.get_package(x, pisi.itembyrepodb.installed) - rev_deps = ctx.packagedb.get_rev_deps(x, pisi.itembyrepodb.installed) - for (rev_dep, depinfo) in rev_deps: - # we don't deal with uninstalled rev deps - # and unsatisfied dependencies (this is important, too) - if ctx.packagedb.has_package(rev_dep, pisi.itembyrepodb.installed) and \ - dependency.installed_satisfies_dep(depinfo): - if not rev_dep in G_f.vertices(): - Bp.add(rev_dep) - G_f.add_plain_dep(rev_dep, x) - B = Bp - if ctx.config.get_option('debug'): - G_f.write_graphviz(sys.stdout) - order = G_f.topological_sort() - return G_f, order - -def expand_src_components(A): - Ap = set() - for x in A: - if ctx.componentdb.has_component(x): - Ap = Ap.union(ctx.componentdb.get_union_comp(x).sources) - else: - Ap.add(x) - return Ap - -def emerge(A, rebuild_all = False): - - # A was a list, remove duplicates and expand components - A = [str(x) for x in A] - A_0 = A = expand_src_components(set(A)) - ctx.ui.debug('A = %s' % str(A)) - - if len(A)==0: - ctx.ui.info(_('No packages to emerge.')) - return - - #A |= upgrade_base(A) - - # FIXME: Errr... order_build changes type conditionally and this - # is not good. - baris - if not ctx.config.get_option('ignore_dependency'): - G_f, order_inst, order_build = plan_emerge(A, rebuild_all) - else: - G_f = None - order_inst = [] - order_build = A - - if order_inst: - ctx.ui.info(_("""The following minimal list of packages will be installed -from repository in the respective order to satisfy dependencies: -""") + util.strlist(order_inst)) - ctx.ui.info(_("""The following minimal list of packages will be built and -installed in the respective order to satisfy dependencies: -""") + util.strlist(order_build)) - - if ctx.get_option('dry_run'): - return - - if len(order_inst) + len(order_build) > len(A_0): - if not ctx.ui.confirm(_('There are extra packages due to dependencies. Do you want to continue?')): - return False - - ctx.ui.notify(ui.packagestogo, order = order_inst) - - pisi_installed = ctx.installdb.is_installed('pisi') - - for x in order_inst: - atomicoperations.install_single_name(x) - - #ctx.ui.notify(ui.packagestogo, order = order_build) - - for x in order_build: - package_names = atomicoperations.build(x)[0] - install_pkg_files(package_names) # handle inter-package deps here - - # FIXME: take a look at the fixme above :(, we have to be sure - # that order_build is a known type... - U = set(order_build) - U.update(order_inst) - if 'pisi' in order_build or (('pisi' in U) and pisi_installed): - upgrade_pisi() - -def plan_emerge(A, rebuild_all): - - # try to construct a pisi graph of packages to - # install / reinstall - - G_f = pisi.graph.Digraph() - - def get_spec(name): - if ctx.sourcedb.has_spec(name): - return ctx.sourcedb.get_spec(name) - else: - raise Error(_('Cannot find source package: %s') % name) - def get_src(name): - return get_spec(name).source - def add_src(src): - if not str(src.name) in G_f.vertices(): - G_f.add_vertex(str(src.name), (src.version, src.release)) - def pkgtosrc(pkg): - return ctx.sourcedb.pkgtosrc(pkg) - - # setup first - #specfiles = [ ctx.sourcedb.get_source(x)[1] for x in A ] - #pkgtosrc = {} - B = A - - install_list = set() - - while len(B) > 0: - Bp = set() - for x in B: - sf = get_spec(x) - src = sf.source - add_src(src) - - # add dependencies - - def process_dep(dep): - if not dependency.installed_satisfies_dep(dep): - if dependency.repo_satisfies_dep(dep): - install_list.add(dep.package) - return - srcdep = pkgtosrc(dep.package) - if not srcdep in G_f.vertices(): - Bp.add(srcdep) - add_src(get_src(srcdep)) - if not src.name == srcdep: # firefox - firefox-devel thing - G_f.add_edge(src.name, srcdep) - - for builddep in src.buildDependencies: - process_dep(builddep) - - for pkg in sf.packages: - for rtdep in pkg.packageDependencies: - process_dep(rtdep) - B = Bp - - if ctx.config.get_option('debug'): - G_f.write_graphviz(sys.stdout) - order_build = G_f.topological_sort() - order_build.reverse() - - G_f2, order_inst = plan_install_pkg_names(install_list) - - return G_f, order_inst, order_build - -def calculate_download_sizes(order): - total_size = cached_size = 0 - - for pkg in [ctx.packagedb.get_package(name) for name in order]: - - # get the cached package's path - fn = util.package_name(pkg.name, pkg.version, pkg.release, pkg.build, True) - path = util.join_path(ctx.config.packages_dir(), fn) - - # check the file and sha1sum to be sure it _is_ the cached package - if os.path.exists(path) and util.sha1_file(path) == pkg.packageHash: - cached_size += pkg.packageSize - - total_size += pkg.packageSize - - ctx.ui.notify(ui.cached, total=total_size, cached=cached_size) - return total_size, cached_size diff --git a/tags/pisi-1.1_rc10/pisi/package.py b/tags/pisi-1.1_rc10/pisi/package.py deleted file mode 100644 index 42807766..00000000 --- a/tags/pisi-1.1_rc10/pisi/package.py +++ /dev/null @@ -1,146 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""package abstraction methods to add/remove files, extract control files""" - -from os.path import join, exists, basename, dirname, getsize - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.context as ctx -import pisi.archive as archive -from pisi.uri import URI -from pisi.metadata import MetaData -from pisi.files import Files -import pisi.util as util - -class Error(pisi.Error): - pass - - -class Package: - """PiSi Package Class provides access to a pisi package (.pisi - file).""" - def __init__(self, packagefn, mode='r'): - self.filepath = packagefn - url = URI(packagefn) - - if url.is_remote_file(): - self.fetch_remote_file(url) - - self.impl = archive.ArchiveZip(self.filepath, 'zip', mode) - - def fetch_remote_file(self, url): - from fetcher import fetch_url - dest = ctx.config.packages_dir() - self.filepath = join(dest, url.filename()) - - if not exists(self.filepath): - try: - fetch_url(url, dest, ctx.ui.Progress) - except pisi.fetcher.FetchError: - # Bug 3465 - if ctx.get_option('reinstall'): - raise Error(_("There was a problem while fetching '%s'.\nThe package " - "may have been upgraded. Please try to upgrade the package.") % url); - raise - else: - ctx.ui.info(_('%s [cached]') % url.filename()) - - def add_to_package(self, fn, an=None): - """Add a file or directory to package""" - self.impl.add_to_archive(fn, an) - - def close(self): - """Close the package archive""" - self.impl.close() - - def extract(self, outdir): - """Extract entire package contents to directory""" - self.extract_dir('', outdir) # means package root - - def extract_files(self, paths, outdir): - """Extract paths to outdir""" - self.impl.unpack_files(paths, outdir) - - def extract_file(self, path, outdir): - """Extract file with path to outdir""" - self.extract_files([path], outdir) - - def extract_dir(self, dir, outdir): - """Extract directory recursively, this function - copies the directory archiveroot/dir to outdir""" - self.impl.unpack_dir(dir, outdir) - - def extract_install(self, outdir): - if self.impl.has_file(ctx.const.install_tar_lzma): - self.extract_file(ctx.const.install_tar_lzma, ctx.config.tmp_dir()) - tar = archive.ArchiveTar(join(ctx.config.tmp_dir(), ctx.const.install_tar_lzma), 'tarlzma', False, False) - tar.unpack_dir(outdir) - else: - self.extract_dir_flat('install', outdir) - - def extract_dir_flat(self, dir, outdir): - """Extract directory recursively, this function - unpacks the *contents* of directory archiveroot/dir inside outdir - this is the function used by the installer""" - self.impl.unpack_dir_flat(dir, outdir) - - def extract_pisi_files(self, outdir): - """Extract PiSi control files: metadata.xml, files.xml, - action scripts, etc.""" - self.extract_files([ctx.const.metadata_xml, ctx.const.files_xml], outdir) - self.extract_dir('config', outdir) - - def get_metadata(self): - """reads metadata.xml from the PiSi package and returns MetaData object""" - md = MetaData() - md.parse(self.impl.read_file(ctx.const.metadata_xml)) - return md - - def get_files(self): - """reads files.xml from the PiSi package and returns Files object""" - files = Files() - files.parse(self.impl.read_file(ctx.const.files_xml)) - return files - - def read(self, outdir = None): - if not outdir: - outdir = ctx.config.tmp_dir() - - # extract control files - self.extract_pisi_files(outdir) - - self.metadata = MetaData() - self.metadata.read( join(outdir, ctx.const.metadata_xml) ) - errs = self.metadata.errors() - if errs: - util.print_errors(errs) - raise Error, _("MetaData format wrong") - - self.files = Files() - self.files.read( join(outdir, ctx.const.files_xml) ) - if self.files.errors(): - raise Error, _("Invalid %s") % ctx.const.files_xml - - def pkg_dir(self): - packageDir = self.metadata.package.name + '-' \ - + self.metadata.package.version + '-' \ - + self.metadata.package.release - - return join( ctx.config.lib_dir(), 'package', packageDir) - - def comar_dir(self): - return join(self.pkg_dir(), ctx.const.comar_dir) diff --git a/tags/pisi-1.1_rc10/pisi/packagedb.py b/tags/pisi-1.1_rc10/pisi/packagedb.py deleted file mode 100644 index 736f6d5b..00000000 --- a/tags/pisi-1.1_rc10/pisi/packagedb.py +++ /dev/null @@ -1,187 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""package database -interface for update/query to local package repository - -we basically store everything in PackageInfo class -yes, we are cheap -""" - -import os -import fcntl -import types - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.util as util -import pisi.context as ctx -import pisi.lockeddbshelve as shelve -from pisi.itembyrepodb import ItemByRepoDB -import pisi.itembyrepodb as itembyrepodb - -class Error(pisi.Error): - pass - -class NotfoundError(pisi.Error): - def __init__(self, pkg): - pisi.Error.__init__("Package %s not found" % pkg) - self.pkg = pkg - -class PackageDB(object): - """PackageDB class provides an interface to the package database - using shelf objects""" - - def __init__(self): - self.d = ItemByRepoDB('package') - self.dr = ItemByRepoDB('revdep') - - def close(self): - self.d.close() - self.dr.close() - - def destroy(self): - self.d.destroy() - self.dr.destroy() - - def has_package(self, name, repo=None, txn = None): - return self.d.has_key(name, repo, txn=txn) - - def get_package(self, name, repo=None, txn = None): - try: - return self.d.get_item(name, repo, txn=txn) - except pisi.itembyrepodb.NotfoundError, e: - raise Error(_('Package %s not found') % name) - - def get_package_repo(self, name, repo=None, txn = None): - return self.d.get_item_repo(name, repo, txn=txn) - - def which_repo(self, name, txn = None): - return self.d.which_repo(name, txn=txn) - - def get_rev_deps(self, name, repo = None, txn = None): - if self.dr.has_key(name, repo, txn=txn): - return self.dr.get_item(name, repo, txn=txn) - else: - return [] - - def get_deps(self, name, repo = None, txn = None): - if self.d.has_key(name, repo, txn=txn): - pinfo = self.d.get_item(name, repo, txn=txn) - return pinfo.packageDependencies - else: - return [] - - def list_packages(self, repo=None): - return self.d.list(repo) - - def add_package(self, package_info, repo, txn = None): - name = str(package_info.name) - - def proc(txn): - self.d.add_item(name, package_info, repo, txn) - for dep in package_info.runtimeDependencies(): - dep_name = str(dep.package) - if self.dr.has_key(dep_name, repo, txn): - revdep = self.dr.get_item(dep_name, repo, txn) - revdep = filter(lambda (n,d):n!=name, revdep) - revdep.append( (name, dep) ) - self.dr.add_item(dep_name, revdep, repo, txn) - else: - self.dr.add_item(dep_name, [ (name, dep) ], repo, txn) - # add component - ctx.componentdb.add_package(package_info.partOf, package_info.name, repo, txn) - # index summary and description - search_keys = {} - for (lang, doc) in package_info.summary.iteritems(): - text = search_keys.get(lang, "") - text += " %s" % doc - search_keys[lang] = text - for (lang, doc) in package_info.description.iteritems(): - text = search_keys.get(lang, "") - text += " %s" % doc - search_keys[lang] = text - for lang in search_keys: - text = search_keys[lang] - # FIXME: other languages should be searchable too - if lang in ('en', 'tr'): - pisi.search.add_doc('terms', lang, package_info.name, doc, repo=repo, txn=txn) - ctx.txn_proc(proc, txn) - - def clear(self, txn = None): - self.d.clear() - self.dr.clear() - - def remove_package(self, name, repo = None, txn = None): - name = str(name) - def proc(txn): - package_info = self.d.get_item(name, repo, txn=txn) - self.d.remove_item(name, repo, txn=txn) - for dep in package_info.runtimeDependencies(): - dep_name = str(dep.package) - if self.dr.has_key(dep_name, repo, txn): - revdep = self.dr.get_item(dep_name, repo, txn) - revdep = filter(lambda (n,d):n!=name, revdep) - if revdep: - self.dr.add_item(dep_name, revdep, repo, txn) - else: - # Bug 3558: removal of revdep list of a package from revdepdb - # should only be done by the list members (dep. packages), not - # the package itself. So if a package is removed, it is removed - # from packagedb but its revdepdb part may still exist, until - # all the list members are removed. - self.dr.remove_item(dep_name, repo, txn=txn) - - ctx.componentdb.remove_package(package_info.partOf, package_info.name, repo, txn) - search_keys = {} - for (lang, doc) in package_info.summary.iteritems(): - text = search_keys.get(lang, "") - text += " %s" % doc - search_keys[lang] = text - for (lang, doc) in package_info.description.iteritems(): - text = search_keys.get(lang, "") - text += " %s" % doc - search_keys[lang] = text - for lang in search_keys: - text = search_keys[lang] - # FIXME: other languages should be searchable too - if lang in ('en', 'tr'): - pisi.search.remove_doc('terms', lang, package_info.name, doc, repo=repo, txn=txn) - self.d.txn_proc(proc, txn) - - def remove_repo(self, repo, txn = None): - def proc(txn): - self.d.remove_repo(repo, txn=txn) - self.dr.remove_repo(repo, txn=txn) - self.d.txn_proc(proc, txn) - -pkgdb = None - -def remove_tracking_package(name, txn = None): - # remove the guy from the tracking databases - if pkgdb.has_package(name, itembyrepodb.installed, txn=txn): - pkgdb.remove_package(name, itembyrepodb.installed, txn=txn) - if pkgdb.has_package(name, itembyrepodb.thirdparty, txn=txn): - pkgdb.remove_package(name, itembyrepodb.thirdparty, txn=txn) - -def init_db(): - global pkgdb - pkgdb = PackageDB() - return pkgdb - -def finalize_db(): - global pkgdb - if pkgdb: - pkgdb.close() diff --git a/tags/pisi-1.1_rc10/pisi/pgraph.py b/tags/pisi-1.1_rc10/pisi/pgraph.py deleted file mode 100644 index 5c7d444b..00000000 --- a/tags/pisi-1.1_rc10/pisi/pgraph.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""PiSi package relation graph that represents the state of packagedb""" - -import string - -from graph import * - -# Cache the results from packagedb queries in a graph - -class PGraph(Digraph): - - def __init__(self, packagedb, repo = pisi.itembyrepodb.repos): - super(PGraph, self).__init__() - self.packagedb = packagedb - self.repo = repo - - def add_package(self, pkg): - pkg1 = self.packagedb.get_package(pkg, self.repo) - self.add_vertex(str(pkg), (pkg1.version, pkg1.release)) - - def add_plain_dep(self, pkg1name, pkg2name): - pkg1data = None - if not pkg1name in self.vertices(): - pkg1 = self.packagedb.get_package(pkg1name, self.repo) - pkg1data = (pkg1.version, pkg1.release) - pkg2data = None - if not pkg2name in self.vertices(): - pkg2 = self.packagedb.get_package(pkg2name, self.repo) - pkg2data = (pkg2.version, pkg2.release) - self.add_edge(str(pkg1name), str(pkg2name), ('d', None), - pkg1data, pkg2data ) - - def add_dep(self, pkg, depinfo): - pkg1data = None - if not pkg in self.vertices(): - pkg1 = self.packagedb.get_package(pkg, self.repo) - pkg1data = (pkg1.version, pkg1.release) - pkg2data = None - if not depinfo.package in self.vertices(): - pkg2 = self.packagedb.get_package(depinfo.package, self.repo) - pkg2data = (pkg2.version, pkg2.release) - self.add_edge(str(pkg), str(depinfo.package), ('d', depinfo), - pkg1data, pkg2data ) - - def add_rev_dep(self, depinfo, pkg): - pkg1data = None - if not pkg in self.vertices(): - pkg1 = self.packagedb.get_package(depinfo.package, self.repo) - pkg1data = (pkg1.version, pkg1.release) - pkg2data = None - if not depinfo.package in self.vertices(): - pkg2 = self.packagedb.get_package(pkg, self.repo) - pkg2data = (pkg2.version, pkg2.release) - self.add_edge(str(depinfo.package), str(pkg), ('d', depinfo), - pkg1data, pkg2data ) - - def add_conflict(self, pkg, conflinfo): - pkg1data = None - if not pkg in self.vertices(): - pkg1 = self.packagedb.get_package(pkg, self.repo) - pkg1data = (pkg1.version, pkg1.release) - pkg2data = None - if not pkg in self.vertices(): - pkg2 = self.packagedb.get_package(conflinfo.package, self.repo) - pkg2data = (pkg2.version, pkg2.release) - - self.add_biedge(str(pkg), str(conflinfo.package), ('c', conflinfo) - , pkg1data, pkg2data ) - - def write_graphviz_vlabel(self, f, u): - (v, r) = self.vertex_data(u) - f.write('[ label = \"' + str(u) + '(' + str(v) + ',' + str(r) + ')\" ]') - diff --git a/tags/pisi-1.1_rc10/pisi/pxml/__init__.py b/tags/pisi-1.1_rc10/pisi/pxml/__init__.py deleted file mode 100644 index 67d1fd25..00000000 --- a/tags/pisi-1.1_rc10/pisi/pxml/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import sys -import locale - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi - -class Error(pisi.Error): - pass diff --git a/tags/pisi-1.1_rc10/pisi/pxml/autoxml.py b/tags/pisi-1.1_rc10/pisi/pxml/autoxml.py deleted file mode 100644 index 30291fcb..00000000 --- a/tags/pisi-1.1_rc10/pisi/pxml/autoxml.py +++ /dev/null @@ -1,849 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" - autoxml is a metaclass for automatic XML translation, using - a miniature type system. (w00t!) This is based on an excellent - high-level XML processing prototype that Gurer prepared. - - Method names are mixedCase for compatibility with minidom, - an old library. -""" - -# System -import locale -import codecs -import types -import formatter -import sys -from StringIO import StringIO - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# PiSi -import pisi -from pisi.pxml.xmlext import * -from pisi.pxml.xmlfile import XmlFile -import pisi.context as ctx -import pisi.util as util -import pisi.oo as oo - -class Error(pisi.Error): - pass - -# requirement specs - -mandatory, optional = range(2) # poor man's enum - -# basic types - -String = types.StringType -Text = types.UnicodeType -Integer = types.IntType -Long = types.LongType -Float = types.FloatType - -#class datatype(type): -# def __init__(cls, name, bases, dict): -# """entry point for metaclass code""" -# # standard initialization -# super(autoxml, cls).__init__(name, bases, dict) - -class LocalText(dict): - """Handles XML tags with localized text""" - - def __init__(self, tag = "", req = optional): - self.tag = tag - self.req = req - dict.__init__(self) - - def decode(self, node, errs, where = ""): - # flags, tag name, instance attribute - assert self.tag != '' - nodes = getAllNodes(node, self.tag) - if not nodes: - if self.req == mandatory: - errs.append(where + ': ' + _("At least one '%s' tag should have local text") % - self.tag ) - else: - for node in nodes: - lang = getNodeAttribute(node, 'xml:lang') - c = getNodeText(node) - if not c: - errs.append(where + ': ' + _("'%s' language of tag '%s' is empty") % - (lang, self.tag)) - # FIXME: check for dups and 'en' - if not lang: - lang = 'en' - self[lang] = c - - def encode(self, node, errs): - assert self.tag != '' - for key in self.iterkeys(): - newnode = addNode(node, self.tag) - setNodeAttribute(newnode, 'xml:lang', key) - addText(newnode, '', self[key]) - - #FIXME: maybe more appropriate for pisi.util - @staticmethod - def get_lang(): - try: - (lang, encoding) = locale.getlocale() - if not lang: - (lang, encoding) = locale.getdefaultlocale() - if lang==None: # stupid python means it is C locale - return 'en' - else: - return lang[0:2] - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - raise Error(_('LocalText: unable to get either current or default locale')) - - def errors(self, where = unicode()): - errs = [] - langs = [ LocalText.get_lang(), 'en', 'tr', ] - if self.keys() and not util.any(lambda x : self.has_key(x), langs): - errs.append( where + ': ' + _("Tag should have at least the current locale, or failing that an English or Turkish version")) - #FIXME: check if all entries are unicode - return errs - - def format(self, f, errs): - L = LocalText.get_lang() - if self.has_key(L): - f.add_flowing_data(self[L]) - elif self.has_key('en'): - # fallback to English, blah - f.add_flowing_data(self['en']) - elif self.has_key('tr'): - # fallback to Turkish - f.add_flowing_data(self['tr']) - else: - errs.append(_("Tag should have at least the current locale, or failing that an English or Turkish version")) - - #FIXME: factor out these common routines - def print_text(self, file = sys.stdout): - w = Writer(file) # plain text - f = formatter.AbstractFormatter(w) - errs = [] - self.format(f, errs) - if errs: - for x in errs: - ctx.ui.warning(x) - - def __str__(self): - L = LocalText.get_lang() - if self.has_key(L): - return unicode(self[L]) - elif self.has_key('en'): - # fallback to English, blah - return unicode(self['en']) - elif self.has_key('tr'): - # fallback to Turkish - return unicode(self['tr']) - else: - return unicode() - -class Writer(formatter.DumbWriter): - """adds unicode support""" - - def __init__(self, file=None, maxcol=78): - formatter.DumbWriter.__init__(self, file, maxcol) - - def send_literal_data(self, data): - self.file.write(data.encode("utf-8")) - i = data.rfind('\n') - if i >= 0: - self.col = 0 - data = data[i+1:] - data = data.expandtabs() - self.col = self.col + len(data) - self.atbreak = 0 - -class autoxml(oo.autosuper, oo.autoprop): - """High-level automatic XML transformation interface for xmlfile. - The idea is to declare a class for each XML tag. Inside the - class the tags and attributes nested in the tag are further - elaborated. A simple example follows: - - class Employee: - __metaclass__ = autoxml - t_Name = [xmlfile.Text, xmlfile.mandatory] - a_Type = [xmlfile.Integer, xmlfile.optional] - - This class defines a tag and an attribute nested in Employee - class. Name is a string and type is an integer, called basic - types. - While the tag is mandatory, the attribute may be left out. - - Other basic types supported are: xmlfile.Float, xmlfile.Double - and (not implemented yet): xmlfile.Binary - - By default, the class name is taken as the corresponding tag, - which may be overridden by defining a tag attribute. Thus, - the same tag may also be written as: - - class EmployeeXML: - ... - tag = 'Employee' - ... - - In addition to basic types, we allow for two kinds of complex - types: class types and list types. - - A declared class can be nested in another class as follows - - class Position: - __metaclass__ = autoxml - t_Name = [xmlfile.Text, xmlfile.mandatory] - t_Description = [xmlfile.Text, xmlfile.optional] - - which we can add to our Employee class. - - class Employee: - __metaclass__ = autoxml - t_Name = [xmlfile.Text, xmlfile.mandatory] - a_Type = [xmlfile.Integer, xmlfile.optional] - t_Position = [Position, xmlfile.mandatory] - - Note some unfortunate redundancy here with Position; this is - justified by the implementation (kidding). Still, you might - want to assign a different name than the class name that - goes in there, which may be fully qualified. - - There is more! Suppose we want to define a company, with - of course many employees. - - class Company: - __metaclass__ = autoxml - t_Employees = [ [Employee], xmlfile.mandatory, 'Employees/Employee'] - - Logically, inside the Company/Employees tag, we will have several - Employee tags, which are inserted to the Employees instance variable of - Company in order of appearance. We can define lists of any other valid - type. Here we used a list of an autoxml class defined above. - - The mandatory flag here asserts that at least one such record - is to be found. - - You see, it works like magic, when it works of course. All of it - done without a single brain exploding. - - """ - - def __init__(cls, name, bases, dict): - """entry point for metaclass code""" - #print 'generating class', name - - # standard initialization - super(autoxml, cls).__init__(name, bases, dict) - - xmlfile_support = XmlFile in bases - - cls.autoxml_bases = filter(lambda base: isinstance(base, autoxml), bases) - - #TODO: initialize class attribute __xml_tags - #setattr(cls, 'xml_variables', []) - - # default class tag is class name - if not dict.has_key('tag'): - cls.tag = name - - # generate helper routines, for each XML component - names = [] - inits = [] - decoders = [] - encoders = [] - errorss = [] - formatters = [] - - # read declaration order from source - # code contributed by bahadir kandemir - from inspect import getsourcelines - from itertools import ifilter - import re - - fn = re.compile('\s*([tas]_[a-zA-Z]+).*').findall - - lines = filter(fn, getsourcelines(cls)[0]) - decl_order = map(lambda x:x.split()[0], lines) - - # there should be at most one str member, and it should be - # the first to process - - order = filter(lambda x: not x.startswith('s_'), decl_order) - - # find string member - str_members = filter(lambda x:x.startswith('s_'), decl_order) - if len(str_members)>1: - raise Error('Only one str member can be defined') - elif len(str_members)==1: - order.insert(0, str_members[0]) - - for var in order: - if var.startswith('t_') or var.startswith('a_') or var.startswith('s_'): - name = var[2:] - if var.startswith('a_'): - x = autoxml.gen_attr_member(cls, name) - elif var.startswith('t_'): - x = autoxml.gen_tag_member(cls, name) - elif var.startswith('s_'): - x = autoxml.gen_str_member(cls, name) - (name, init, decoder, encoder, errors, format_x) = x - names.append(name) - inits.append(init) - decoders.append(decoder) - encoders.append(encoder) - errorss.append(errors) - formatters.append(format_x) - - # generate top-level helper functions - cls.initializers = inits - def initialize(self, uri = None, keepDoc = False, tmpDir = '/tmp', - **args): - if xmlfile_support: - if args.has_key('tag'): - XmlFile.__init__(self, tag = args['tag']) - else: - XmlFile.__init__(self, tag = cls.tag) - for base in cls.autoxml_bases: - base.__init__(self) - for init in inits: - init(self) - for x in args.iterkeys(): - setattr(self, x, args[x]) - # init hook - if hasattr(self, 'init'): - self.init(tag) - if xmlfile_support and uri: - self.read(uri, keepDoc, tmpDir) - - cls.__init__ = initialize - - cls.decoders = decoders - def decode(self, node, errs, where = unicode(cls.tag)): - for base in cls.autoxml_bases: - base.decode(self, node, errs, where) - for decode_member in decoders:#self.__class__.decoders: - decode_member(self, node, errs, where) - if hasattr(self, 'decode_hook'): - self.decode_hook(node, errs, where) - cls.decode = decode - - cls.encoders = encoders - def encode(self, node, errs): - for base in cls.autoxml_bases: - base.encode(self, node, errs) - for encode_member in encoders:#self.__class__.encoders: - encode_member(self, node, errs) - if hasattr(self, 'encode_hook'): - self.encode_hook(node, errs) - cls.encode = encode - - cls.errorss = errorss - def errors(self, where = unicode(name)): - errs = [] - for base in cls.autoxml_bases: - errs.extend(base.errors(self, where)) - for errors in errorss:#self.__class__.errorss: - errs.extend(errors(self, where)) - if hasattr(self, 'errors_hook'): - errs.extend(self.errors_hook(where)) - return errs - cls.errors = errors - def check(self): - errs = self.errors() - if errs: - errs.append(_("autoxml.check: '%s' errors") % len(errs)) - raise Error(*errs) - cls.check = check - - cls.formatters = formatters - def format(self, f, errs): - for base in cls.autoxml_bases: - base.format(self, f, errs) - for formatter in formatters:#self.__class__.formatters: - formatter(self, f, errs) - cls.format = format - def print_text(self, file = sys.stdout): - w = Writer(file) # plain text - f = formatter.AbstractFormatter(w) - errs = [] - self.format(f, errs) - if errs: - for x in errs: - ctx.ui.warning(x) - cls.print_text = print_text - if not dict.has_key('__str__'): - def str(self): - strfile = StringIO() - self.print_text(strfile) - str = strfile.getvalue() - strfile.close() - return str - cls.__str__ = str - - if not dict.has_key('__eq__'): - def equal(self, other): - # handle None - if other ==None: - return False # well, must be False at this point :) - for name in names: - try: - if getattr(self, name) != getattr(other, name): - return False - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - return False - return True - def notequal(self, other): - return not self.__eq__(other) - cls.__eq__ = equal - cls.__ne__ = notequal - - if xmlfile_support: - def parse(self, xml, keepDoc = False): - "parse XML string and decode it into a python object" - self.parsexml(xml) - errs = [] - self.decode(self.rootNode(), errs) - if errs: - errs.append(_("autoxml.parse: String '%s' has errors") % xml) - raise Error(*errs) - if hasattr(self, 'read_hook'): - self.read_hook(errs) - - if not keepDoc: - self.unlink() # get rid of the tree - - errs = self.errors() - if errs: - errs.append(_("autoxml.parse: String '%s' has errors") % xml) - - def read(self, uri, keepDoc = False, tmpDir = '/tmp', - sha1sum = False, compress = None, sign = None, copylocal = False): - "read XML file and decode it into a python object" - self.readxml(uri, tmpDir, sha1sum=sha1sum, - compress=compress, sign=sign, copylocal=copylocal) - errs = [] - self.decode(self.rootNode(), errs) - if errs: - errs.append(_("autoxml.read: File '%s' has errors") % uri) - raise Error(*errs) - if hasattr(self, 'read_hook'): - self.read_hook(errs) - - if not keepDoc: - self.unlink() # get rid of the tree - - errs = self.errors() - if errs: - errs.append(_("autoxml.read: File '%s' has errors") % uri) - raise Error(*errs) - - def write(self, uri, keepDoc = False, tmpDir = '/tmp', - sha1sum = False, compress = None, sign = None): - "encode the contents of the python object into an XML file" - errs = self.errors() - if errs: - errs.append(_("autoxml.write: object validation has failed")) - raise Error(*errs) - errs = [] - self.newDocument() - self.encode(self.rootNode(), errs) - if hasattr(self, 'write_hook'): - self.write_hook(errs) - if errs: - errs.append(_("autoxml.write: File encoding '%s' has errors") % uri) - raise Error(*errs) - self.writexml(uri, tmpDir, sha1sum=sha1sum, compress=compress, sign=sign) - if not keepDoc: - self.unlink() # get rid of the tree - - cls.read = read - cls.write = write - cls.parse = parse - - def gen_attr_member(cls, attr): - """generate readers and writers for an attribute member""" - #print 'attr:', attr - spec = getattr(cls, 'a_' + attr) - tag_type = spec[0] - assert type(tag_type) == type(type) - def readtext(node, attr): - return getNodeAttribute(node, attr) - def writetext(node, attr, text): - #print 'write attr', attr, text - setNodeAttribute(node, attr, text) - anonfuns = cls.gen_anon_basic(attr, spec, readtext, writetext) - return cls.gen_named_comp(attr, spec, anonfuns) - - def gen_tag_member(cls, tag): - """generate helper funs for tag member of class""" - #print 'tag:', tag - spec = getattr(cls, 't_' + tag) - anonfuns = cls.gen_tag(tag, spec) - return cls.gen_named_comp(tag, spec, anonfuns) - - def gen_tag(cls, tag, spec): - """generate readers and writers for the tag""" - tag_type = spec[0] - if type(tag_type) is types.TypeType and \ - autoxml.basic_cons_map.has_key(tag_type): - def readtext(node, tagpath): - #print 'read tag', node, tagpath - return getNodeText(node, tagpath) - def writetext(node, tagpath, text): - #print 'write tag', node, tagpath, text - addText(node, tagpath, text) - return cls.gen_anon_basic(tag, spec, readtext, writetext) - elif type(tag_type) is types.ListType: - return cls.gen_list_tag(tag, spec) - elif tag_type is LocalText: - return cls.gen_insetclass_tag(tag, spec) - elif type(tag_type) is autoxml or type(tag_type) is types.TypeType: - return cls.gen_class_tag(tag, spec) - else: - raise Error(_('gen_tag: unrecognized tag type %s in spec') % - str(tag_type)) - - def gen_str_member(cls, token): - """generate readers and writers for a string member""" - spec = getattr(cls, 's_' + token) - tag_type = spec[0] - assert type(tag_type) == type(type) - def readtext(node, blah): - #node.normalize() # piksemel doesn't have this - return getNodeText(node) - def writetext(node, blah, text): - addText(node, "", text) - anonfuns = cls.gen_anon_basic(token, spec, readtext, writetext) - return cls.gen_named_comp(token, spec, anonfuns) - - def gen_named_comp(cls, token, spec, anonfuns): - """generate a named component tag/attr. a decoration of - anonymous functions that do not bind to variable names""" - name = cls.mixed_case(token) - token_type = spec[0] - req = spec[1] - (init_a, decode_a, encode_a, errors_a, format_a) = anonfuns - - def init(self): - """initialize component""" - setattr(self, name, init_a()) - - def decode(self, node, errs, where): - """decode component from DOM node""" - setattr(self, name, decode_a(node, errs, where + '.' + unicode(name))) - - def encode(self, node, errs): - """encode self inside, possibly new, DOM node using xml""" - if hasattr(self, name): - value = getattr(self, name) - else: - value = None - encode_a(node, value, errs) - - def errors(self, where): - """return errors in the object""" - errs = [] - if hasattr(self, name) and getattr(self, name) != None: - value = getattr(self,name) - errs.extend(errors_a(value, where + '.' + name)) - else: - if req == mandatory: - errs.append(where + ': ' + _('Mandatory variable %s not available') % name) - return errs - - def format(self, f, errs): - if hasattr(self, name): - value = getattr(self,name) - f.add_literal_data(token + ': ') - format_a(value, f, errs) - f.add_line_break() - else: - if req == mandatory: - errs.append(_('Mandatory variable %s not available') % name) - - return (name, init, decode, encode, errors, format) - - def mixed_case(cls, identifier): - """helper function to turn token name into mixed case""" - if identifier is "": - return "" - else: - if identifier[0]=='I': - lowly = 'i' # because of pythonic idiots we can't choose locale in lower - else: - lowly = identifier[0].lower() - return lowly + identifier[1:] - - def tagpath_head_last(cls, tagpath): - "returns split of the tag path into last tag and the rest" - try: - lastsep = tagpath.rindex('/') - except ValueError, e: - return ('', tagpath) - return (tagpath[:lastsep], tagpath[lastsep+1:]) - - def parse_spec(cls, token, spec): - """decompose member specification""" - name = cls.mixed_case(token) - token_type = spec[0] - req = spec[1] - - if len(spec)>=3: - path = spec[2] # an alternative path specified - elif type(token_type) is type([]): - if type(token_type[0]) is autoxml: - # if list of class, by default nested like in most PSPEC - path = token + '/' + token_type[0].tag - else: - # if list of ordinary type, just take the name for - path = token - elif type(token_type) is autoxml: - # if a class, by default its tag - path = token_type.tag - else: - path = token # otherwise it's the same name as - # the token - return name, token_type, req, path - - def gen_anon_basic(cls, token, spec, readtext, writetext): - """Generate a tag or attribute with one of the basic - types like integer. This has got to be pretty generic - so that we can invoke it from the complex types such as Class - and List. The readtext and writetext arguments achieve - the DOM text access for this datatype.""" - - name, token_type, req, tagpath = cls.parse_spec(token, spec) - - def initialize(): - """default value for all basic types is None""" - return None - - def decode(node, errs, where): - """decode from DOM node, the value, watching the spec""" - text = readtext(node, token) - #print 'read text ', text - if text: - try: - value = autoxml.basic_cons_map[token_type](text) - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - value = None - errs.append(where + ': ' + _('Type mismatch: read text cannot be decoded')) - return value - else: - if req == mandatory: - errs.append(where + ': ' + _('Mandatory token %s not available') % token) - return None - - def encode(node, value, errs): - """encode given value inside DOM node""" - if value: - writetext(node, token, unicode(value)) - else: - if req == mandatory: - errs.append(_('Mandatory token %s not available') % token) - - def errors(value, where): - errs = [] - if value and not isinstance(value, token_type): - errs.append(where + ': ' + _('Type mismatch. Expected %s, got %s') % - (token_type, type(value)) ) - return errs - - def format(value, f, errs): - """format value for pretty printing""" - f.add_literal_data(unicode(value)) - - return initialize, decode, encode, errors, format - - def gen_class_tag(cls, tag, spec): - """generate a class datatype""" - name, tag_type, req, path = cls.parse_spec(tag, spec) - - def make_object(): - obj = tag_type.__new__(tag_type) - obj.__init__(tag=tag, req=req) - return obj - - def init(): - return make_object() - - def decode(node, errs, where): - node = getNode(node, tag) - if node: - try: - obj = make_object() - obj.decode(node, errs, where) - return obj - except Error: - errs.append(where + ': '+ _('Type mismatch: DOM cannot be decoded')) - else: - if req == mandatory: - errs.append(where + ': ' + _('Mandatory argument not available')) - return None - - def encode(node, obj, errs): - if node and obj: - try: - #FIXME: this doesn't look pretty - classnode = newNode(node, tag) - obj.encode(classnode, errs) - addNode(node, '', classnode) - except Error: - if req == mandatory: - # note: we can receive an error if obj has no content - errs.append(_('Object cannot be encoded')) - else: - if req == mandatory: - errs.append(_('Mandatory argument not available')) - - def errors(obj, where): - return obj.errors(where) - - def format(obj, f, errs): - try: - obj.format(f, errs) - except Error: - if req == mandatory: - errs.append(_('Mandatory argument not available')) - return (init, decode, encode, errors, format) - - def gen_list_tag(cls, tag, spec): - """generate a list datatype. stores comps in tag/comp_tag""" - name, tag_type, req, path = cls.parse_spec(tag, spec) - - pathcomps = path.split('/') - comp_tag = pathcomps.pop() - list_tagpath = util.makepath(pathcomps, sep='/', relative=True) - - if len(tag_type) != 1: - raise Error(_('List type must contain only one element')) - - x = cls.gen_tag(comp_tag, [tag_type[0], mandatory]) - (init_item, decode_item, encode_item, errors_item, format_item) = x - - def init(): - return [] - - def decode(node, errs, where): - l = [] - nodes = getAllNodes(node, path) - #print node, tag + '/' + comp_tag, nodes - if len(nodes)==0 and req==mandatory: - errs.append(where + ': ' + _('Mandatory list "%s" under "%s" node is empty.') % (path, node.name())) - ix = 1 - for node in nodes: - dummy = newNode(node, "Dummy") - addNode(dummy, '', node) - l.append(decode_item(dummy, errs, where + unicode("[%s]" % ix))) - #l.append(decode_item(node, errs, where + unicode("[%s]" % ix))) - ix += 1 - return l - - def encode(node, l, errs): - if l and len(l) > 0: - for item in l: - if list_tagpath: - listnode = addNode(node, list_tagpath, branch = False) - else: - listnode = node - encode_item(listnode, item, errs) - #encode_item(node, item, errs) - else: - if req is mandatory: - errs.append(_('Mandatory list "%s" under "%s" node is empty.') % (path, node.name())) - - def errors(l, where): - errs = [] - ix = 1 - for node in l: - errs.extend(errors_item(node, where + '[%s]' % ix)) - ix += 1 - return errs - - def format(l, f, errs): - l.sort() - for node in l: - format_item(node, f, errs) - f.add_literal_data(' ') - - return (init, decode, encode, errors, format) - - def gen_insetclass_tag(cls, tag, spec): - """generate a class datatype that is highly integrated - don't worry if that means nothing to you. this is a silly - hack to implement local text quickly. it's not the most - elegant thing in the world. it's basically a copy of - class tag""" - name, tag_type, req, path = cls.parse_spec(tag, spec) - - def make_object(): - obj = tag_type.__new__(tag_type) - obj.__init__(tag=tag, req=req) - return obj - - def init(): - return make_object() - - def decode(node, errs, where): - if node: - try: - obj = make_object() - obj.decode(node, errs, where) - return obj - except Error: - errs.append(where + ': ' + _('Type mismatch: DOM cannot be decoded')) - else: - if req == mandatory: - errs.append(where + ': ' + _('Mandatory argument not available')) - return None - - def encode(node, obj, errs): - if node and obj: - try: - #FIXME: this doesn't look pretty - obj.encode(node, errs) - except Error: - if req == mandatory: - # note: we can receive an error if obj has no content - errs.append(_('Object cannot be encoded')) - else: - if req == mandatory: - errs.append(_('Mandatory argument not available')) - - def errors(obj, where): - return obj.errors(where) - - def format(obj, f, errs): - try: - obj.format(f, errs) - except Error: - if req == mandatory: - errs.append(_('Mandatory argument not available')) - - return (init, decode, encode, errors, format) - - basic_cons_map = { - types.StringType : str, - types.UnicodeType : unicode, - types.IntType : int, - types.FloatType : float, - types.LongType : long - } diff --git a/tags/pisi-1.1_rc10/pisi/pxml/xmlext.py b/tags/pisi-1.1_rc10/pisi/pxml/xmlext.py deleted file mode 100644 index 41293fa9..00000000 --- a/tags/pisi-1.1_rc10/pisi/pxml/xmlext.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" - xmlext is a helper module for accessing XML files using - xml.dom.minidom . It is a convenient wrapper for some - DOM functions, and provides path based get/add functions - as in KDE API. - - function names are mixedCase for compatibility with minidom, - an 'old library' - - this implementation uses piksemel -""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import piksemel as iks - -parse = iks.parse -newDocument = iks.newDocument - -def getAllNodes(node, tagPath): - """retrieve all nodes that match a given tag path.""" - tags = tagPath.split('/') - if len(tags) == 0: - return [] - nodeList = [node] # basis case - for tag in tags: - results = map(lambda x: getTagByName(x, tag), nodeList) - nodeList = [] - for x in results: - nodeList.extend(x) - pass # emacs indentation error, keep it here - if len(nodeList) == 0: - return [] - return nodeList - -def getNodeAttribute(node, attrname): - """get named attribute from DOM node""" - return node.getAttribute(attrname) - -def setNodeAttribute(node, attrname, value): - """get named attribute from DOM node""" - return node.setAttribute(attrname, value) - -def getChildElts(parent): - """get only child elements""" - return [x for x in parent.tags()] - -def getTagByName(parent, childName): - return [x for x in parent.tags(childName)] - -def getNodeText(node, tagpath = ""): - """get the first child and expect it to be text!""" - if tagpath!="": - node = getNode(node, tagpath) - if not node: - return None - child = node.firstChild() - if not child: - return None - if child.type() == iks.DATA: - # in any case, strip whitespaces... - return child.data().strip() - else: - raise XmlError(_("getNodeText: Expected text node, got something else!")) - -def getChildText(node_s, tagpath): - """get the text of a child at the end of a tag path""" - node = getNode(node_s, tagpath) - if not node: - return None - return getNodeText(node) - -def getNode(node, tagpath): - """returns the *first* matching node for given tag path.""" - - if tagpath == "": - return node - - assert type(tagpath)==str - tags = tagpath.split('/') - assert len(tags)>0 - - # iterative code to search for the path - for tag in tags: - currentNode = None - for child in node.tags(): - if child.name() == tag: - currentNode = child - break - if not currentNode: - return None - else: - node = currentNode - return currentNode - -def createTagPath(node, tags): - """create new child at the end of a tag chain starting from node - no matter what""" - if len(tags)==0: - return node - for tag in tags: - node = node.insertTag(tag) - return node - -def addTagPath(node, tags, newnode=None): - """add newnode at the end of a tag chain, smart one""" - node = createTagPath(node, tags) - if newnode: # node to add specified - node.insertNode(newnode) - return node - -def addNode(node, tagpath, newnode = None, branch=True): - """add a new node at the end of the tree and returns it - if newnode is given adds that node, too.""" - - assert type(tagpath)==str - tags = [] - if tagpath != "": - tags = tagpath.split('/') # tag chain - else: - addTagPath(node, [], newnode) - return node #FIXME: is this correct!?!? - - assert len(tags)>0 # we want a chain - - # iterative code to search for the path - - if branch: - rem = 1 - else: - rem = 0 - - while len(tags) > rem: - tag = tags.pop(0) - nodeList = getTagByName(node, tag) - if len(nodeList) == 0: # couldn't find - tags.insert(0, tag) # put it back in - return addTagPath(node, tags, newnode) - else: - node = nodeList[len(nodeList)-1] # discard other matches - else: - # had only one tag.. - return addTagPath(node, tags, newnode) - - return node - -def addText(node, tagpath, text): - node = addNode(node, tagpath) - node.insertData(text) - -def newNode(node, tag): - return iks.newDocument(tag) diff --git a/tags/pisi-1.1_rc10/pisi/pxml/xmlfile.py b/tags/pisi-1.1_rc10/pisi/pxml/xmlfile.py deleted file mode 100644 index 263624a4..00000000 --- a/tags/pisi-1.1_rc10/pisi/pxml/xmlfile.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" - XmlFile class further abstracts a dom object using the - high-level dom functions provided in xmlext module (and sorely lacking - in xml.dom :( ) - - function names are mixedCase for compatibility with minidom, - an 'old library' - - this implementation uses piksemel -""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import codecs -import exceptions - -import piksemel as iks - -import pisi -from pisi.file import File -from pisi.util import join_path as join - -class Error(pisi.Error): - pass - -class XmlFile(object): - """A class to help reading and writing an XML file""" - - def __init__(self, tag): - self.rootTag = tag - - def newDocument(self): - """clear DOM""" - self.doc = iks.newDocument(self.rootTag) - - def unlink(self): - """deallocate DOM structure""" - del self.doc - - def rootNode(self): - """returns root document element""" - return self.doc - - def parsexml(self, xml): - """parses xml string and returns DOM""" - try: - self.doc = iks.parseString(xml) - return self.doc - except Exception, e: - raise Error(_("String '%s' has invalid XML") % (xml)) - - def readxmlfile(self, f): - raise Exception("not implemented") - try: - self.doc = iks.parse(f) - return self.doc - except Exception, e: - raise Error(_("File '%s' has invalid XML") % (f) ) - - - def readxml(self, uri, tmpDir='/tmp', sha1sum=False, - compress=None, sign=None, copylocal = False): - uri = File.make_uri(uri) - #try: - localpath = File.download(uri, tmpDir, sha1sum=sha1sum, - compress=compress,sign=sign, copylocal=copylocal) - #except IOError, e: - # raise Error(_("Cannot read URI %s: %s") % (uri, unicode(e)) ) - try: - self.doc = iks.parse(localpath) - return self.doc - except Exception, e: - raise Error(_("File '%s' has invalid XML") % (localpath) ) - - def writexml(self, uri, tmpDir = '/tmp', sha1sum=False, compress=None, sign=None): - f = File(uri, File.write, sha1sum=sha1sum, compress=compress, sign=sign) - f.write(self.doc.toPrettyString()) - f.close() - - def writexmlfile(self, f): - f.write(self.doc.toPrettyString()) diff --git a/tags/pisi-1.1_rc10/pisi/repodb.py b/tags/pisi-1.1_rc10/pisi/repodb.py deleted file mode 100644 index 039cb6dc..00000000 --- a/tags/pisi-1.1_rc10/pisi/repodb.py +++ /dev/null @@ -1,129 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os, fcntl - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi -import pisi.lockeddbshelve as shelve -import pisi.context as ctx -import pisi.packagedb as packagedb -import pisi.util as util -from pisi.uri import URI - -class Error(pisi.Error): - pass - -class Repo: - def __init__(self, indexuri): - self.indexuri = indexuri - -#class HttpRepo - -#class FtpRepo - -#class RemovableRepo - - -class RepoDB(object): - """RepoDB maps repo ids to repository information""" - - def __init__(self, txn = None): - self.d = shelve.LockedDBShelf("repo") - def proc(txn): - if not self.d.has_key("order", txn): - self.d.put("order", [], txn) - self.d.txn_proc(proc, txn) - - def close(self): - self.d.close() - - def repo_name(self, ix): - l = self.list() - return l[ix] - - def has_repo(self, name): - name = str(name) - return self.d.has_key("repo-" + name) - - def get_repo(self, name): - name = str(name) - return self.d["repo-" + name] - - def set_default_repo(self, name, txn = None): - name = str(name) - def proc(txn): - order = self.d.get("order", txn) - try: - index = order.index(name) - order[0], order[index] = order[index], order[0] - self.d.put("order", order, txn) - except ValueError: - raise Error(_('No repository named %s exists') % name) - self.d.txn_proc(proc, txn) - - def add_repo(self, name, repo_info, txn = None, at = None): - """add repository with name and repo_info at a given optional position""" - name = str(name) - assert (isinstance(repo_info,Repo)) - def proc(txn): - if self.d.has_key("repo-" + name, txn): - raise Error(_('Repository %s already exists') % name) - self.d.put("repo-" + name, repo_info, txn) - order = self.d.get("order", txn) - if at == None: - order.append(name) - else: - if at<0 or at>len(order): - raise Error(_("Cannot add repository at position %s") % at) - order.insert(at, name) - self.d.put("order", order, txn) - self.d.txn_proc(proc, txn) - - def list(self): - return self.d["order"] - - def clear(self): - self.d.clear() - - def remove_repo(self, name, txn = None): - name = str(name) - def proc(txn): - self.d.delete("repo-" + name, txn) - list = self.d.get("order", txn) - list.remove(name) - self.d.put("order", list, txn) - ctx.packagedb.remove_repo(name, txn=txn) - ctx.sourcedb.remove_repo(name, txn=txn) - ctx.componentdb.remove_repo(name, txn=txn) - self.d.txn_proc(proc, txn) - -db = None - -def init(): - global db - - if db: - return db - - db = RepoDB() - return db - -def finalize(): - global db - - if db: - db.close() - db = None diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/__init__.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/__init__.py deleted file mode 100644 index cd339e0f..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import pisi - -class Error(pisi.Error): - pass - -class Exception(pisi.Exception): - pass - -import pisi.context as ctx - -def error(msg): - if ctx.config.get_option('ignore_action_errors'): - ctx.ui.error(msg) - else: - raise Error(msg) diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/actions.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/actions.py deleted file mode 100644 index 2e2e0c20..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/actions.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -class Actions: - - template = """ -from pisi.actionsapi import pisitools - -WorkDir = "skeleton" - -def install(): - pisitools.dobin("skeleton.py") - pisitools.rename("/usr/bin/skeleton.py", "%s") -""" - - def __init__(self, name, filepath): - self.name = name - self.filepath = filepath - - def write(self): - open(self.filepath, "w").write(self.template % self.name) diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/constants.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/constants.py deleted file mode 100644 index 7ab2aa82..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/constants.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import locale -from os.path import join - -class _constant: - "Constant members implementation" - class ConstError(TypeError): - pass - - def __setattr__(self, name, value): - if self.__dict__.has_key(name): - raise self.ConstError, "Can't rebind constant: %s" % name - # Binding an attribute once to a const is available - self.__dict__[name] = value - - def __delattr__(self, name): - if self.__dict__.has_key(name): - raise self.ConstError, "Can't unbind constant: %s" % name - # we don't have an attribute by this name - raise NameError, name - -class Constants: - - __c = _constant() - - def __getattr__(self, attr): - return getattr(self.__c, attr) - - def __setattr__(self, attr, value): - setattr(self.__c, attr, value) - - def __delattr__(self, attr): - delattr(self.__c, attr) - -consts = Constants() - -consts.scenarios_path = "scenarios/" -consts.pisi_db = "db/" -consts.repo_name = "scenario-db" -consts.repo_path = "repo/" -consts.repo_url = consts.repo_path + "pisi-index.xml.bz2" - -consts.glob_pisis = "*.pisi" -consts.pisi_suffix = ".pisi" - -consts.pspec_path = "/tmp/pspec.xml" -consts.actionspy_path = "/tmp/actions.py" - -consts.packager_name = "Faik Uygur" -consts.packager_email = "faik@pardus.org.tr" - -consts.homepage = "http://cekirdek.uludag.org.tr/~faik/pisi" -consts.summary = "%s is a good application" -consts.description = "%s is a free software that can do anything it wants" -consts.license = ["GPL-2"] - -consts.skel_sha1sum = "cc64dfa6e068fe1f6fb68a635878b1ea21acfac7" -consts.skel_type = "targz" -consts.skel_uri = "http://cekirdek.uludag.org.tr/~faik/pisi/skeleton.tar.gz" -consts.skel_bindir = "/usr/bin" -consts.skel_dirtype = "executable" diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/package.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/package.py deleted file mode 100644 index 770709ef..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/package.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import glob - -from pisi.scenarioapi.pspec import Pspec -from pisi.scenarioapi.actions import Actions -from pisi.scenarioapi.constants import * -from pisi.scenarioapi.withops import * - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -class Package: - def __init__(self, name, deps = [], cons = [], date = "2006-18-18", ver = "1.0", partOf="None"): - self.name = name - self.dependencies = deps - self.conflicts = cons - self.version = ver - self.date = date - self.partOf = partOf - self.pspec = None - self.actions = None - self.create_package() - - def create_pisi(self): - os.system("pisi build %s -O %s > /dev/null 2>&1" % (consts.pspec_path, consts.repo_path)) - - def create_package(self): - pspec = Pspec(self.name, consts.pspec_path) - pspec.set_source(consts.homepage, consts.summary % self.name, - consts.description % self.name, consts.license, self.partOf) - pspec.set_packager(consts.packager_name, consts.packager_email) - pspec.set_archive(consts.skel_sha1sum, consts.skel_type, consts.skel_uri) - pspec.set_package(self.dependencies, self.conflicts) - pspec.add_file_path(consts.skel_bindir, consts.skel_dirtype) - pspec.set_history(self.date, self.version) - - actions = Actions(self.name, consts.actionspy_path) - - self.pspec = pspec - self.actions = actions - self.pspec.write() - self.actions.write() - - self.create_pisi() - - def get_file_name(self): - # use glob. there may be buildnos at the end of the package name - pkg = consts.repo_path + self.name + "-" + \ - self.version + "-" + self.pspec.pspec.history[0].release - - found = glob.glob(pkg + consts.glob_pisis) - if not found: - raise Exception(_("No pisi package: %s* found.") % pkg) - - return os.path.basename(found[0]) - - def version_bump(self, *args): - for with in args: - if with.types == CONFLICT and with.action == ADDED: - self.pspec.add_conflicts(with.data) - - if with.types == CONFLICT and with.action == REMOVED: - self.pspec.remove_conflicts(with.data) - - if with.types == DEPENDENCY and with.action == ADDED: - self.pspec.add_dependencies(with.data) - - if with.types == DEPENDENCY and with.action == REMOVED: - self.pspec.remove_dependencies(with.data) - - if with.types == VERSION and with.action == INIT: - self.version = with.data - - self.pspec.update_history(self.date, self.version) - self.actions.name = self.name - self.actions.write() - self.create_pisi() - -if __name__ == "__main__": - p = Package("w0rmux", [], [], "0.7") - p.version_bump() diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/pisiops.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/pisiops.py deleted file mode 100644 index f1f7f817..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/pisiops.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import pisi.util as util -from pisi.scenarioapi.constants import * - -def pisi_upgraded(*args): - packages = util.strlist(args).rstrip() - os.system("pisi -D%s upgrade %s" % (consts.pisi_db, packages)) - -def pisi_info(package): - os.system("pisi -D%s info %s" % (consts.pisi_db, package)) - -def pisi_removed(*args): - packages = util.strlist(args).rstrip() - os.system("pisi -D%s remove %s" % (consts.pisi_db, packages)) - -def pisi_added_repo(name, url): - os.system("pisi -D%s add-repo -y %s %s" % (consts.pisi_db, name, url)) - -def pisi_updated_repo(): - os.system("pisi -D%s update-repo" % consts.pisi_db) - -def pisi_installed(*args): - packages = util.strlist(args).rstrip() - os.system("pisi -D%s install %s" % (consts.pisi_db, packages)) - -def pisi_reinstalled(package): - os.system("pisi -D%s install --reinstall %s" % (consts.pisi_db, package)) - diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/pspec.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/pspec.py deleted file mode 100644 index 092a213b..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/pspec.py +++ /dev/null @@ -1,153 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -from pisi.specfile import SpecFile, Package, Update, Path -from pisi.dependency import Dependency -from pisi.conflict import Conflict -from pisi.pxml.autoxml import LocalText - -class Pspec: - def __init__(self, pkgname, filepath): - self.pspec = SpecFile() - self.package = Package() - self.update = Update() - self.filepath = filepath - self.name = pkgname - - @staticmethod - def read(filepath): - spec = SpecFile() - spec.read(filepath) - tmp = Pspec(spec.source.name, filepath) - - tmp.pspec.source.packager = spec.source.packager - tmp.pspec.source.homepage = spec.source.homepage - tmp.pspec.source.archive = spec.source.archive - tmp.pspec.source.name = spec.source.name - tmp.pspec.source.license = spec.source.license - tmp.pspec.source.partOf = spec.source.partOf - tmp.pspec.source.summary = spec.source.summary - tmp.pspec.source.description = spec.source.description - - for pkg in spec.packages: - p = Package() - p.name = pkg.name - p.files = pkg.files - p.conflicts = pkg.conflicts - p.packageDependencies = pkg.packageDependencies - tmp.pspec.packages.append(p) - - tmp.pspec.history = spec.history - return tmp - - def add_dependencies(self, dependencies): - # special case of given one dependency package - # with depedency versioning info [**kw, name] - # [{"versionFrom":"0.4.2"}, "udev"] - if type(dependencies[0]) == dict: - dep = Dependency() - (kw, dep.package) = dependencies - dep.__dict__[kw.keys()[0]] = kw.values()[0] - self.package.packageDependencies.append(dep) - return - - for depname in dependencies: - dep = Dependency() - dep.package = depname - self.package.packageDependencies.append(dep) - - def remove_dependencies(self, dependencies): - for depname in dependencies: - for dep in self.package.packageDependencies: - if dep.package == depname: - self.package.packageDependencies.remove(dep) - - def add_conflicts(self, conflicts): - # special case of given one conflict package - # with conflict versioning info [**kw, name] - # [{"versionFrom":"0.4.2"}, "udev"] - if type(conflicts[0]) == dict: - conf = Conflict() - (kw, conf.package) = conflicts - conf.__dict__[kw.keys()[0]] = kw.values()[0] - self.package.conflicts.append(conf) - return - - for con in conflicts: - conflict = Conflict() - conflict.package = con - self.package.conflicts.append(conflict) - - def remove_conflicts(self, conflicts): - for con in conflicts: - self.package.conflicts.remove(con) - - def update_history(self, date, version): - new = Update() - new.name = self.update.name - new.email = self.update.email - new.date = date - new.version = version - new.release = str(int(self.update.release) + 1) - self.update = new - self.pspec.history.append(self.update) - self.pspec.history.reverse() - self.write() - - def set_source(self, homepage, summary, description, license, partOf): - self.pspec.source.name = self.name - self.pspec.source.homepage = homepage - self.pspec.source.license = license - self.pspec.source.partOf = partOf - self.pspec.source.summary = LocalText("Summary") - self.pspec.source.description = LocalText("Description") - self.pspec.source.summary["en"] = summary - self.pspec.source.description["en"] = description - - def set_packager(self, name, email): - self.pspec.source.packager.name = unicode(name) - self.pspec.source.packager.email = email - self.update.name = unicode(name) - self.update.email = email - - def set_archive(self, sha1sum, type, uri): - self.pspec.source.archive.sha1sum = sha1sum - self.pspec.source.archive.type = type - self.pspec.source.archive.uri = uri - - def add_file_path(self, path, type): - p = Path() - p.path = path - p.fileType = type - self.pspec.packages[0].files.append(p) - - def set_package(self, dependencies, conflicts): - self.package.name = self.name - self.package.conflicts = conflicts - - if dependencies: - for depname in dependencies: - dep = Dependency() - dep.package = depname - self.package.packageDependencies.append(dep) - - self.pspec.packages.append(self.package) - - def set_history(self, date, version, comment = "No Comment", release = "1"): - self.update.date = date - self.update.version = version - self.update.comment = comment - self.update.release = release - self.pspec.history.append(self.update) - - def write(self): - self.pspec.write(self.filepath) diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/repoops.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/repoops.py deleted file mode 100644 index 8f1541a0..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/repoops.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os - -from pisi.scenarioapi.package import Package -from pisi.scenarioapi.withops import * -from pisi.scenarioapi.constants import * - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -repodb = {} - -def repo_added_package(package, *args): - if repodb.has_key(package): - raise Exception(_("Repo already has package named %s.") % package) - - version = "1.0" - partOf = "None" - dependencies = [] - conflicts = [] - - for with in args: - if with.types == CONFLICT and with.action == INIT: - conflicts = with.data - - if with.types == DEPENDENCY and with.action == INIT: - dependencies = with.data - - if with.types == VERSION and with.action == INIT: - version = with.data - - if with.types == PARTOF and with.action == INIT: - partOf = with.data - - repodb[package] = Package(package, dependencies, conflicts, ver=version, partOf=partOf) - -def repo_removed_package(package): - if not repodb.has_key(package): - raise Exception(_("Repo does not have package named %s.") % package) - - os.unlink(os.path.join(consts.repo_path, repodb[package].get_file_name())) - del repodb[package] - -def repo_version_bumped(package, *args): - if not repodb.has_key(package): - raise Exception(_("Repo does not have package named %s.") % package) - - old_file = repodb[package].get_file_name() - repodb[package].version_bump(*args) - os.unlink(os.path.join(consts.repo_path, old_file)) - -def repo_updated_index(): - cur = os.getcwd() - path = os.path.join(cur, consts.repo_path) - os.chdir(consts.repo_path) - os.system("pisi index --skip-signing %s >/dev/null 2>&1" % path) - os.chdir(cur) - -def repo_get_url(): - return "." diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/scenario.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/scenario.py deleted file mode 100644 index f6527aae..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/scenario.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os - -from pisi.scenarioapi.repoops import * -from pisi.scenarioapi.pisiops import * -from pisi.scenarioapi.constants import * - -def let_repo_had(package, *args): - repo_added_package(package, *args) - repo_updated_index() - -def let_pisi_had(*args): - url = os.path.join(os.getcwd(), consts.repo_url) - pisi_added_repo(consts.repo_name, url) - packages = util.strlist(args).rstrip() - os.system("pisi -D%s install --ignore-dependency %s" % (consts.pisi_db, packages)) diff --git a/tags/pisi-1.1_rc10/pisi/scenarioapi/withops.py b/tags/pisi-1.1_rc10/pisi/scenarioapi/withops.py deleted file mode 100644 index 56fe5fca..00000000 --- a/tags/pisi-1.1_rc10/pisi/scenarioapi/withops.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -ADDED, REMOVED, INIT = range(3) -PARTOF, VERSION, CONFLICT, DEPENDENCY = range(4) - -class with: - def __init__(self): - pass - -def with_action(types, action, data): - w = with() - w.types = types - w.action = action - w.data = data - return w - -def with_partof(partof): - return with_action(PARTOF, INIT, partof) - -def with_version(version): - return with_action(VERSION, INIT, version) - -def with_conflicts(*cons): - return with_action(CONFLICT, INIT, cons) - -def with_dependencies(*deps): - return with_action(DEPENDENCY, INIT, deps) - -def with_added_conflicts(*cons): - return with_action(CONFLICT, ADDED, cons) - -def with_removed_conflicts(*cons): - return with_action(CONFLICT, REMOVED, cons) - -def with_added_dependencies(*deps): - return with_action(DEPENDENCY, ADDED, deps) - -def with_removed_dependencies(*deps): - return with_action(DEPENDENCY, REMOVED, deps) - -def with_added_conflict(package, **kw): - assert len(kw) <= 1 - - if not len(kw): - return with_action(CONFLICT, ADDED, [package]) - - if (kw.has_key("versionFrom") or - kw.has_key("versionTo") or - kw.has_key("version") or - kw.has_key("releaseFrom") or - kw.has_key("releaseTo") or - kw.has_key("release")): - return with_action(CONFLICT, ADDED, [kw, package]) - - # pass other keywords. - return with_action(CONFLICT, ADDED, [package]) - -def with_added_dependency(package, **kw): - assert len(kw) <= 1 - - if not len(kw): - return with_action(DEPENDENCY, ADDED, [package]) - - if (kw.has_key("versionFrom") or - kw.has_key("versionTo") or - kw.has_key("version") or - kw.has_key("releaseFrom") or - kw.has_key("releaseTo") or - kw.has_key("release")): - return with_action(DEPENDENCY, ADDED, [kw, package]) - - # pass other keywords. - return with_action(DEPENDENCY, ADDED, [package]) diff --git a/tags/pisi-1.1_rc10/pisi/search/__init__.py b/tags/pisi-1.1_rc10/pisi/search/__init__.py deleted file mode 100644 index cf5a099b..00000000 --- a/tags/pisi-1.1_rc10/pisi/search/__init__.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005-2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import pisi -import pisi.context as ctx - -class Error(pisi.Error): - pass - -class Exception(pisi.Exception): - pass - -# API - -from invertedindex import InvertedIndex -import preprocess as p - -def init(ids, langs): - "initialize databases" - - assert type(ids)==type([]) - assert type(langs)==type([]) - - ctx.invidx = {} - for id in ids: - ctx.invidx[id] = {} - for lang in langs: - ctx.invidx[id][lang] = InvertedIndex(id, lang) - -def finalize(): - import pisi.context as ctx - - if ctx.invidx: - for id in ctx.invidx.iterkeys(): - for lang in ctx.invidx[id].iterkeys(): - ctx.invidx[id][lang].close() - ctx.invidx = {} - -def add_doc(id, lang, docid, str, repo = None, txn = None): - terms = p.preprocess(lang, str) - ctx.invidx[id][lang].add_doc(docid, terms, repo=repo, txn=txn) - -def remove_doc(id, lang, docid, str, repo = None, txn = None): - terms = p.preprocess(lang, str) - ctx.invidx[id][lang].remove_doc(docid, terms, repo = repo, txn = txn) - -def query_terms(id, lang, terms, repo = None, txn = None): - terms = p.normalize(lang, terms) - return ctx.invidx[id][lang].query(terms, repo = repo, txn = txn) - -def query(id, lang, str, repo = None, txn = None): - terms = p.preprocess(lang, str) - return query_terms(id, lang, terms, repo = repo, txn = txn) diff --git a/tags/pisi-1.1_rc10/pisi/search/invertedindex.py b/tags/pisi-1.1_rc10/pisi/search/invertedindex.py deleted file mode 100644 index b98158ec..00000000 --- a/tags/pisi-1.1_rc10/pisi/search/invertedindex.py +++ /dev/null @@ -1,83 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import types - -import pisi.lockeddbshelve as shelve -from pisi.itembyrepodb import ItemByRepoDB -import pisi.itembyrepodb as itembyrepodb - -class InvertedIndex(object): - """a database of term -> set of documents""" - - def __init__(self, id, lang): - self.d = ItemByRepoDB('ii-%s-%s' % (id, lang)) - - def close(self): - self.d.close() - - def has_term(self, term, repo = None, txn = None): - return self.d.has_key(shelve.LockedDBShelf.encodekey(term), repo=repo,txn=txn) - - def get_term(self, term, repo = None, txn = None): - """get set of doc ids given term""" - term = shelve.LockedDBShelf.encodekey(term) - def proc(txn): - if not self.has_term(term, repo=repo, txn=txn): - return set() - return self.d.get_item(term, repo=repo, txn=txn) - return self.d.txn_proc(proc, txn) - - def get_union_term(self, name, txn = None, repo = itembyrepodb.repos ): - """get a union of all repository terms, not just the first repo in order. - get only basic repo info from the first repo""" - name = shelve.LockedDBShelf.encodekey(name) - def proc(txn): - terms= set() - if self.d.d.has_key(name): - s = self.d.d.get(name, txn=txn) - for repostr in self.d.order(repo = repo): - if s.has_key(repostr): - terms |= s[repostr] - return terms - return self.d.txn_proc(proc, txn) - - def query(self, terms, repo = None, txn = None): - def proc(txn): - docs = [ self.get_union_term(x, repo=repo, txn=txn) for x in terms ] - if docs: - return reduce(lambda x,y: x.intersection(y), docs) - else: - return set() - return self.d.txn_proc(proc, txn) - - def list_terms(self, repo = None, txn= None): - return self.d.list(f, repo=repo, txn=txn) - - def add_doc(self, doc, terms, repo = None, txn = None): - def f(txn): - for term_i in terms: - term_i = shelve.LockedDBShelf.encodekey(term_i) - term_i_docs = self.get_term(term_i, repo=repo, txn=txn) - term_i_docs.add(doc) - self.d.add_item(term_i, term_i_docs, repo=repo, txn=txn) # update - return self.d.txn_proc(f, txn) - - def remove_doc(self, doc, terms,repo=None, txn=None): - def f(txn): - for term_i in terms: - term_i = shelve.LockedDBShelf.encodekey(term_i) - term_i_docs = self.get_term(term_i,repo=repo, txn=txn) - if doc in term_i_docs: - term_i_docs.remove(doc) - self.d.add_item(term_i, term_i_docs, repo=repo, txn=txn) # update - return self.d.txn_proc(f, txn) diff --git a/tags/pisi-1.1_rc10/pisi/search/preprocess.py b/tags/pisi-1.1_rc10/pisi/search/preprocess.py deleted file mode 100644 index 97964091..00000000 --- a/tags/pisi-1.1_rc10/pisi/search/preprocess.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005-2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import tokenize -import locale - -def normalize(lang, terms): - if lang == "tr": - old_locale = locale.setlocale(locale.LC_CTYPE) - locale.setlocale(locale.LC_CTYPE, "tr_TR.UTF-8") - terms = map(lambda x: unicode(x).lower(), terms) - if lang == "tr": - locale.setlocale(locale.LC_CTYPE, old_locale) - unique_terms = set() - for term in terms: - unique_terms.add(unicode(term)) - return list(unique_terms) - -def preprocess(lang, str): - terms = tokenize.tokenize(lang, str) - return normalize(lang, terms) diff --git a/tags/pisi-1.1_rc10/pisi/search/tokenize.py b/tags/pisi-1.1_rc10/pisi/search/tokenize.py deleted file mode 100644 index 0023e45a..00000000 --- a/tags/pisi-1.1_rc10/pisi/search/tokenize.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005-2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import string - -def tokenize(lang, str): - if type(str) != type(unicode()): - str = unicode(str) - sepchars = string.whitespace + string.punctuation - tokens = [] - token = unicode() - for x in str: - if x in sepchars: - if len(token) > 0: - tokens.append(token) - token = unicode() - else: - token += x - - if token: - tokens.append(token) - - return tokens diff --git a/tags/pisi-1.1_rc10/pisi/signalhandler.py b/tags/pisi-1.1_rc10/pisi/signalhandler.py deleted file mode 100644 index 9b0faf42..00000000 --- a/tags/pisi-1.1_rc10/pisi/signalhandler.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import signal - -exception = { - signal.SIGINT:KeyboardInterrupt - } - -class Signal: - def __init__(self, sig): - self.signal = sig - self.oldhandler = signal.getsignal(sig) - self.pending = False - -class SignalHandler: - - def __init__(self): - self.signals = {} - - def signal_handler(self, sig, frame): - signal.signal(sig, signal.SIG_IGN) - self.signals[sig].pending = True - - def disable_signal(self, sig): - if sig not in self.signals.keys(): - self.signals[sig] = Signal(sig) - signal.signal(sig, self.signal_handler) - - def enable_signal(self, sig): - if sig in self.signals.keys(): - oldhandler = self.signals[sig].oldhandler - pending = self.signals[sig].pending - del self.signals[sig] - signal.signal(sig, oldhandler) - if pending: - raise exception[sig] - - def signal_disabled(self, sig): - return sig in self.signals.keys() - - def signal_pending(self, sig): - return self.signal_disabled(sig) and self.signals[sig].pending diff --git a/tags/pisi-1.1_rc10/pisi/sourcearchive.py b/tags/pisi-1.1_rc10/pisi/sourcearchive.py deleted file mode 100644 index dede49cb..00000000 --- a/tags/pisi-1.1_rc10/pisi/sourcearchive.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# python standard library - -from os.path import join, basename -from os import access, R_OK - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# pisi modules -import pisi -import pisi.util as util -import pisi.context as ctx -from pisi.archive import Archive -from pisi.uri import URI -from pisi.fetcher import fetch_url -from pisi.mirrors import Mirrors - -class Error(pisi.Error): - pass - -class SourceArchive: - """source archive. this is a class responsible for fetching - and unpacking a source archive""" - def __init__(self, spec, pkg_work_dir): - self.url = URI(spec.source.archive.uri) - self.pkg_work_dir = pkg_work_dir - self.archiveFile = join(ctx.config.archives_dir(), self.url.filename()) - self.archive = spec.source.archive - - def fetch(self, interactive=True): - if not self.is_cached(interactive): - if interactive: - self.progress = ctx.ui.Progress - else: - self.progress = None - - try: - if self.url.get_uri().startswith("mirrors://"): - self.fetch_from_mirror() - else: - fetch_url(self.url, ctx.config.archives_dir(), self.progress) - except pisi.fetcher.FetchError: - if ctx.config.values.build.fallback: - self.fetch_from_fallback() - else: - raise - - def fetch_from_fallback(self): - archive = basename(self.url.get_uri()) - src = join(ctx.config.values.build.fallback, archive) - ctx.ui.warning(_('Trying fallback address: %s') % src) - fetch_url(src, ctx.config.archives_dir(), self.progress) - - def fetch_from_mirror(self): - uri = self.url.get_uri() - sep = uri[len("mirrors://"):].split("/") - name = sep.pop(0) - archive = "/".join(sep) - - mirrors = Mirrors().get_mirrors(name) - if not mirrors: - raise Error(_("%s mirrors are not defined.") % name) - - for mirror in mirrors: - try: - url = join(mirror, archive) - ctx.ui.warning(_('Fetching source from mirror: %s') % url) - fetch_url(url, ctx.config.archives_dir(), self.progress) - return - except pisi.fetcher.FetchError: - pass - - raise pisi.fetcher.FetchError(_('Could not fetch source from %s mirrors.') % name); - - def is_cached(self, interactive=True): - if not access(self.archiveFile, R_OK): - return False - - # check hash - if util.check_file_hash(self.archiveFile, self.archive.sha1sum): - if interactive: - ctx.ui.info(_('%s [cached]') % self.archive.name) - return True - - return False - - def unpack(self, clean_dir=True): - - # check archive file's integrity - if not util.check_file_hash(self.archiveFile, self.archive.sha1sum): - raise Error, _("unpack: check_file_hash failed") - - archive = Archive(self.archiveFile, self.archive.type) - archive.unpack(self.pkg_work_dir, clean_dir) diff --git a/tags/pisi-1.1_rc10/pisi/sourcedb.py b/tags/pisi-1.1_rc10/pisi/sourcedb.py deleted file mode 100644 index ba1770e6..00000000 --- a/tags/pisi-1.1_rc10/pisi/sourcedb.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" -package source database -interface for update/query to local package repository -we basically store everything in sourceinfo class -yes, we are cheap -to handle multiple repositories, for sources, we -store a set of repositories in which the source appears. -the actual guy to take is determined from the repo order. -""" - -import os -import fcntl - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi.util as util -import pisi.context as ctx -import pisi.lockeddbshelve as shelve -import pisi.repodb -from pisi.itembyrepodb import ItemByRepoDB - -class NotfoundError(pisi.Error): - pass - -class SourceDB(object): - - def __init__(self): - self.d = ItemByRepoDB('source') - self.dpkgtosrc = ItemByRepoDB('pkgtosrc') - - def close(self): - self.d.close() - self.dpkgtosrc.close() - - def list(self): - return self.d.list() - - def has_spec(self, name, repo=None, txn=None): - return self.d.has_key(name, repo, txn) - - def get_spec(self, name, repo=None, txn = None): - try: - return self.d.get_item(name, repo, txn) - except pisi.itembyrepodb.NotfoundError, e: - raise NotfoundError(_("Source package %s not found") % name) - - def get_spec_repo(self, name, repo=None, txn = None): - try: - return self.d.get_item_repo(name, repo, txn) - except pisi.itembyrepodb.NotfoundError, e: - raise NotfoundError(_("Source package %s not found") % name) - - def pkgtosrc(self, name, txn = None): - return self.dpkgtosrc.get_item(name, txn=txn) - - def add_spec(self, spec, repo, txn = None): - assert not spec.errors() - name = str(spec.source.name) - def proc(txn): - self.d.add_item(name, spec, repo, txn) - for pkg in spec.packages: - self.dpkgtosrc.add_item(pkg.name, name, repo, txn) - ctx.componentdb.add_spec(spec.source.partOf, spec.source.name, repo, txn) - self.d.txn_proc(proc, txn) - - def remove_spec(self, name, repo, txn = None): - name = str(name) - def proc(txn): - assert self.has_spec(name, txn=txn) - spec = self.d.get_item(name, repo, txn) - self.d.remove_item(name, txn=txn) - for pkg in spec.packages: - self.dpkgtosrc.remove_item_repo(pkg.name, repo, txn) - ctx.componentdb.remove_spec(spec.source.partOf, spec.source.name, repo, txn) - - self.d.txn_proc(proc, txn) - - def remove_repo(self, repo, txn = None): - def proc(txn): - self.d.remove_repo(repo, txn=txn) - self.dpkgtosrc.remove_repo(repo, txn=txn) - self.d.txn_proc(proc, txn) - -sourcedb = None - -def init(): - global sourcedb - if sourcedb: - return sourcedb - - sourcedb = SourceDB() - return sourcedb - -def finalize(): - global sourcedb - if sourcedb: - sourcedb.close() - sourcedb = None diff --git a/tags/pisi-1.1_rc10/pisi/specfile.py b/tags/pisi-1.1_rc10/pisi/specfile.py deleted file mode 100644 index 636d8a34..00000000 --- a/tags/pisi-1.1_rc10/pisi/specfile.py +++ /dev/null @@ -1,245 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -""" - Specfile module is our handler for PSPEC files. PSPEC (PiSi SPEC) - files are specification files for PiSi source packages. This module - provides read and write routines for PSPEC files. -""" - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# standard python modules -from os.path import basename - -# pisi modules -from pisi.pxml.xmlfile import XmlFile -import pisi.pxml.autoxml as autoxml -import pisi.context as ctx -from pisi.dependency import Dependency -from pisi.conflict import Conflict -import pisi.dependency -import pisi.component as component -import pisi.util as util - - -class Error(pisi.Error): - pass - -__metaclass__ = autoxml.autoxml - -class Packager: - - t_Name = [autoxml.Text, autoxml.mandatory] - t_Email = [autoxml.String, autoxml.mandatory] - - def __str__(self): - s = "%s <%s>" % (self.name, self.email) - return s - - -class AdditionalFile: - - s_Filename = [autoxml.String, autoxml.mandatory] - a_target = [autoxml.String, autoxml.mandatory] - a_permission = [autoxml.String, autoxml.optional] - a_owner = [autoxml.String, autoxml.optional] - a_group = [autoxml.String, autoxml.optional] - - def __str__(self): - s = "%s -> %s " % (self.filename, self.target) - if self.permission: - s += '(%s)' % self.permission - return s - -class Patch: - - s_Filename = [autoxml.String, autoxml.mandatory] - a_compressionType = [autoxml.String, autoxml.optional] - a_level = [autoxml.Integer, autoxml.optional] - a_target = [autoxml.String, autoxml.optional] - - #FIXME: what's the cleanest way to give a default value for reading level? - #def decode_hook(self, node, errs, where): - # if self.level == None: - # self.level = 0 - - def __str__(self): - s = self.filename - if self.compressionType: - s += ' (' + self.compressionType + ')' - if self.level: - s += ' level:' + self.level - if self.target: - s += ' target:' + self.target - return s - - -class Update: - - a_release = [autoxml.String, autoxml.mandatory] - a_type = [autoxml.String, autoxml.optional] - t_Date = [autoxml.String, autoxml.mandatory] - t_Version = [autoxml.String, autoxml.mandatory] - t_Comment = [autoxml.String, autoxml.optional] - t_Name = [autoxml.Text, autoxml.optional] - t_Email = [autoxml.String, autoxml.optional] - - def __str__(self): - s = self.date - s += ", ver=" + self.version - s += ", rel=" + self.release - if self.type: - s += ", type=" + self.type - return s - - -class Path: - - s_Path = [autoxml.String, autoxml.mandatory] - a_fileType = [autoxml.String, autoxml.optional] - a_permanent = [autoxml.String, autoxml.optional] - - def __str__(self): - s = self.path - s += ", type=" + self.fileType - return s - - -class ComarProvide: - - s_om = [autoxml.String, autoxml.mandatory] - a_script = [autoxml.String, autoxml.mandatory] - - def __str__(self): - # FIXME: descriptive enough? - s = self.script - s += ' (' + self.om + ')' - return s - -class Archive: - - s_uri = [ autoxml.String, autoxml.mandatory ] - a_type =[ autoxml.String, autoxml.mandatory ] - a_sha1sum =[ autoxml.String, autoxml.mandatory ] - - def decode_hook(self, node, errs, where): - self.name = basename(self.uri) - - def __str__(self): - s = _('URI: %s, type: %s, sha1sum: %s') % (self.uri, self.type, self.sha1sum) - return s - - -class Source: - - t_Name = [autoxml.String, autoxml.mandatory] - t_Homepage = [autoxml.String, autoxml.optional] - t_Packager = [Packager, autoxml.mandatory] - t_License = [ [autoxml.String], autoxml.mandatory] - t_IsA = [ [autoxml.String], autoxml.optional] - t_PartOf = [autoxml.String, autoxml.optional] - t_Summary = [autoxml.LocalText, autoxml.mandatory] - t_Description = [autoxml.LocalText, autoxml.optional] - t_Icon = [ autoxml.String, autoxml.optional] - t_Archive = [Archive, autoxml.mandatory ] - t_BuildDependencies = [ [Dependency], autoxml.optional] - t_Patches = [ [Patch], autoxml.optional] - t_Version = [ autoxml.String, autoxml.optional] - t_Release = [ autoxml.String, autoxml.optional] - t_SourceURI = [ autoxml.String, autoxml.optional ] # used in index - - -class Package: - - t_Name = [ autoxml.String, autoxml.mandatory ] - t_Summary = [ autoxml.LocalText, autoxml.optional ] - t_Description = [ autoxml.LocalText, autoxml.optional ] - t_IsA = [ [autoxml.String], autoxml.optional] - t_PartOf = [autoxml.String, autoxml.optional] - t_License = [ [autoxml.String], autoxml.optional] - t_Icon = [ autoxml.String, autoxml.optional] - t_PackageDependencies = [ [Dependency], autoxml.optional, "RuntimeDependencies/Dependency"] - t_ComponentDependencies = [ [autoxml.String], autoxml.optional, "RuntimeDependencies/Component"] - t_Files = [ [Path], autoxml.optional] - t_Conflicts = [ [Conflict], autoxml.optional, "Conflicts/Package"] - t_ProvidesComar = [ [ComarProvide], autoxml.optional, "Provides/COMAR"] - #t_RequiresComar = [ [autoxml.String], autoxml.mandatory, "Requires/COMAR"] - t_AdditionalFiles = [ [AdditionalFile], autoxml.optional] - t_History = [ [Update], autoxml.optional] - - # FIXME: needed in build process, to distinguish dynamically generated debug packages. - # find a better way to do this. - debug_package = False - - def runtimeDependencies(self): - deps = self.packageDependencies - deps += [ ctx.componentdb.get_component[x].packages for x in self.componentDependencies ] - return deps - - def pkg_dir(self): - packageDir = self.name + '-' \ - + self.version + '-' \ - + self.release - - return util.join_path( ctx.config.lib_dir(), 'package', packageDir) - - def installable(self): - """calculate if pkg is installable currently""" - deps = self.runtimeDependencies() - return pisi.dependency.satisfies_dependencies(self.name, deps) - - def __str__(self): - if self.build: - build = self.build - else: - build = '--' - s = _('Name: %s, version: %s, release: %s, build %s\n') % ( - self.name, self.version, self.release, build) - s += _('Summary: %s\n') % unicode(self.summary) - s += _('Description: %s\n') % unicode(self.description) - s += _('Component: %s\n') % unicode(self.partOf) - s += _('Provides: ') - for x in self.providesComar: - s += x.om + ' ' - s += '\n' - s += _('Dependencies: ') - for x in self.componentDependencies: - s += x.package + ' ' - for x in self.packageDependencies: - s += x.package + ' ' - return s + '\n' - - -class SpecFile(XmlFile): - __metaclass__ = autoxml.autoxml #needed when we specify a superclass - - tag = "PISI" - - t_Source = [ Source, autoxml.mandatory] - t_Packages = [ [Package], autoxml.mandatory, "Package"] - t_History = [ [Update], autoxml.mandatory] - t_Components = [ [component.Component], autoxml.optional, "Component"] - - def getSourceVersion(self): - return self.history[0].version - - def getSourceRelease(self): - return self.history[0].release - - def dirtyWorkAround(self): - #TODO: Description should be mandatory. Remove this code when repo is ready. - #http://liste.pardus.org.tr/gelistirici/2006-September/002332.html - self.source.description = autoxml.LocalText("Description") - self.source.description["en"] = self.source.summary["en"] diff --git a/tags/pisi-1.1_rc10/pisi/ui.py b/tags/pisi-1.1_rc10/pisi/ui.py deleted file mode 100644 index 63fed5d1..00000000 --- a/tags/pisi-1.1_rc10/pisi/ui.py +++ /dev/null @@ -1,101 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# -# generic user interface -# - -import sys - -import pisi -import pisi.context as ctx - -(installed, upgraded, removed, installing, removing, configuring, configured, extracting, - downloading, packagestogo, updatingrepo, cached) = range(12) - -class UI(object): - "Abstract class for UI operations, derive from this." - - class Progress: - def __init__(self, totalsize, existsize = 0): - self.totalsize = totalsize - try: - self.percent = (existsize * 100) / totalsize - except ArithmeticError: - self.percent = 0 - - def update(self, size): - if not self.totalsize: - return 100 - try: - self.percent = (size * 100) / self.totalsize - except ArithmeticError: - self.percent = 0 - return self.percent - - def __init__(self, debuggy = False, verbose = False): - self.show_debug = debuggy - self.show_verbose = verbose - - def close(self): - "cleanup stuff here" - pass - - def set_verbose(self, flag): - self.show_verbose = flag - - def set_debug(self, flag): - self.show_debug = flag - - def info(self, msg, verbose = False, noln = False): - "give an informative message" - pass - - def ack(self, msg): - "inform the user of an important event and wait for acknowledgement" - pass - - def debug(self, msg): - "show debugging info" - if self.show_debug: - self.info('DEBUG: ' + msg) - - def warning(self,msg): - "warn the user" - pass - - def error(self,msg): - "inform a (possibly fatal) error" - pass - - #FIXME: merge this with info, this just means "important message" - def action(self,msg): - "uh?" - pass - - def choose(self, msg, list): - "ask the user to choose from a list of alternatives" - pass - - def confirm(self, msg): - "ask a yes/no question" - pass - - def display_progress(self, pd): - "display progress" - pass - - def status(self, msg = None): - "set status, if not given clear it" - pass - - def notify(self, event, **keywords): - "notify UI of a significant event" - pass diff --git a/tags/pisi-1.1_rc10/pisi/uri.py b/tags/pisi-1.1_rc10/pisi/uri.py deleted file mode 100644 index 08b04226..00000000 --- a/tags/pisi-1.1_rc10/pisi/uri.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""Simplifies working with URLs, purl module provides common URL -parsing and processing""" - -from urlparse import urlparse -from os.path import basename - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -import pisi.util as util - -class URI(object): - """URI class provides a URL parser and simplifies working with - URLs.""" - - def __init__(self, uri=None): - if uri: - self.set_uri(str(uri)) - else: - self.__scheme = None - self.__location = None - self.__path = None - self.__filename = None - self.__params = None - self.__query = None - self.__fragment = None - self.__uri = None - - self.__authinfo = None - - def get_uri(self): - if self.__uri: - return self.__uri - return None - - def set_uri(self, uri): - # (scheme, location, path, params, query, fragment) - uri = str(uri) - u = urlparse(uri, "file") - self.__scheme = u[0] - self.__location = u[1] - self.__path = u[2] - self.__filename = basename(self.__path) - self.__params = u[3] - self.__query = u[4] - self.__fragment = u[5] - - self.__uri = uri - - def is_local_file(self): - if self.scheme() == "file": - return True - else: - return False - - def is_remote_file(self): - return not self.is_local_file() - - def is_absolute_path(self): - return util.absolute_path(self.__path) - - def is_relative_path(self): - return not self.is_absolute_path() - - def set_auth_info(self, authTuple): - if not isinstance(authTuple, tuple): - raise Exception, _("setAuthInfo needs a tuple (user, pass)") - self.__authinfo = authTuple - - def auth_info(self): - return self.__authinfo - - def scheme(self): - return self.__scheme - - def location(self): - return self.__location - - def path(self): - return self.__path - - def filename(self): - return self.__filename - - def params(self): - return self.__params - - def query(self): - return self.__query - - def fragment(self): - return self.__fragment - - def __str__(self): - return self.get_uri() - - uri = property(get_uri, set_uri) diff --git a/tags/pisi-1.1_rc10/pisi/util.py b/tags/pisi-1.1_rc10/pisi/util.py deleted file mode 100644 index 941a67c5..00000000 --- a/tags/pisi-1.1_rc10/pisi/util.py +++ /dev/null @@ -1,634 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""misc. utility functions, including process and file utils""" - -# standard python modules -import os -import re -import sys -import sha -import shutil -import string -import statvfs -import operator -import subprocess - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -# pisi modules -import pisi -import pisi.context as ctx - -class Error(pisi.Error): - pass - -class FileError(Error): - pass - - -######################### -# spec validation utility # -######################### - -def print_errors(errlist): - for err in errlist: - ctx.ui.error(err) - - -######################### -# string/list/functional# -######################### - -def every(pred, seq): - return reduce(operator.and_, map(pred, seq), True) - -def any(pred, seq): - return reduce(operator.or_, map(pred, seq), False) - -def unzip(seq): - return zip(*seq) - -def concat(l): - """Concatenate a list of lists.""" - return reduce( operator.concat, l ) - -def strlist(l): - """Concatenate string reps of l's elements.""" - return "".join(map(lambda x: str(x) + ' ', l)) - -def multisplit(str, chars): - """Split str with any of the chars.""" - l = [str] - for c in chars: - l = concat(map(lambda x:x.split(c), l)) - return l - -def same(l): - """Check if all elements of a sequence are equal.""" - if len(l)==0: - return True - else: - last = l.pop() - for x in l: - if x!=last: - return False - return True - -def prefix(a, b): - """Check if sequence a is a prefix of sequence b.""" - if len(a)>len(b): - return False - for i in range(0,len(a)): - if a[i]!=b[i]: - return False - return True - -def remove_prefix(a,b): - """Remove prefix a from sequence b.""" - assert prefix(a,b) - return b[len(a):] - -def human_readable_size(size = 0): - symbols, depth = [' B', 'KB', 'MB', 'GB'], 0 - - while size > 1000 and depth < 3: - size = float(size / 1024) - depth += 1 - - return size, symbols[depth] - -def human_readable_rate(size = 0): - x = human_readable_size(size) - return x[0], x[1] + '/s' - -############################## -# Process Releated Functions # -############################## - -def run_batch(cmd): - """Run command and report return value and output.""" - ctx.ui.info(_('Running ') + cmd, verbose=True) - p = subprocess.Popen(cmd, shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = p.communicate() - ctx.ui.debug(_('return value for "%s" is %s') % (cmd, p.returncode)) - return (p.returncode, out, err) - -# you can't use the following for Popen, oops -class TeeOutFile: - def __init__(self, file): - self.file = file - - def write(self, str): - self.write(str) - ctx.ui.debug(str) - -# TODO: it might be worthwhile to try to remove the -# use of ctx.stdout, and use run_batch()'s return -# values instead. but this is good enough :) -def run_logged(cmd): - """Run command and get the return value.""" - ctx.ui.info(_('Running ') + cmd, verbose=True) - if ctx.stdout: - stdout = ctx.stdout - else: - if ctx.get_option('debug'): - stdout = None - else: - stdout = subprocess.PIPE - if ctx.stderr: - stderr = ctx.stderr - else: - if ctx.get_option('debug'): - stderr = None - else: - stderr = subprocess.STDOUT - - p = subprocess.Popen(cmd, shell=True, stdout=stdout, stderr=stderr) - out, err = p.communicate() - ctx.ui.debug(_('return value for "%s" is %s') % (cmd, p.returncode)) - - return p.returncode - -###################### -# Terminal functions # -###################### - -def xterm_title(message): - """Set message as console window title.""" - if os.environ.has_key("TERM") and sys.stderr.isatty(): - terminalType = os.environ["TERM"] - for term in ["xterm", "Eterm", "aterm", "rxvt", "screen", "kterm", "rxvt-unicode"]: - if terminalType.startswith(term): - sys.stderr.write("\x1b]2;"+str(message)+"\x07") - sys.stderr.flush() - break - -def xterm_title_reset(): - """Reset console window title.""" - if os.environ.has_key("TERM"): - xterm_title("") - -############################# -# Path Processing Functions # -############################# - -def splitpath(a): - """split path into components and return as a list - os.path.split doesn't do what I want like removing trailing /""" - comps = a.split(os.path.sep) - if comps[len(comps)-1]=='': - comps.pop() - return comps - -def makepath(comps, relative = False, sep = os.path.sep): - """Reconstruct a path from components.""" - path = reduce(lambda x,y: x + sep + y, comps, '') - if relative: - return path[len(sep):] - else: - return path - -def parentpath(a, sep = os.path.sep): - # remove trailing '/' - a = a.rstrip(sep) - return a[:a.rfind(sep)] - -def parenturi(a): - return parentpath(a, '/') - -# I'm not sure how necessary this is. Ahem. -def commonprefix(l): - """an improved version of os.path.commonprefix, - returns a list of path components""" - common = [] - comps = map(splitpath, l) - for i in range(0, min(len,l)): - compi = map(lambda x: x[i], comps) # get ith slice - if same(compi): - common.append(compi[0]) - return common - -# but this one is necessary -def subpath(a, b): - """Find if path a is before b in the directory tree.""" - return prefix(splitpath(a), splitpath(b)) - -def removepathprefix(prefix, path): - """Remove path prefix a from b, finding the pathname rooted at a.""" - comps = remove_prefix(splitpath(prefix), splitpath(path)) - if len(comps) > 0: - return join_path(*tuple(comps)) - else: - return "" - -def absolute_path(path): - """Determine if given path is absolute.""" - comps = splitpath(path) - return comps[0] == '' - -def join_path(a, *p): - """Join two or more pathname components. - - Python os.path.join cannot handle '/' at the start of latter components. - - """ - path = a - for b in p: - b = b.lstrip('/') - if path == '' or path.endswith('/'): - path += b - else: - path += '/' + b - return path - -#################################### -# File/Directory Related Functions # -#################################### - -def check_file(file, mode = os.F_OK): - """Shorthand to check if a file exists.""" - if not os.access(file, mode): - raise FileError("File " + file + " not found") - return True - -# FIXME: check_dir is not a good name considering it can also create the dir -def check_dir(dir): - """Make sure given directory path exists.""" - # FIXME: What is first strip doing there? - dir = dir.strip().rstrip("/") - if not os.access(dir, os.F_OK): - os.makedirs(dir) - -def clean_dir(path): - """Remove all content of a directory.""" - if os.path.exists(path): - shutil.rmtree(path) - -def creation_time(file): - """Return the creation time of the given file.""" - if check_file(file): - import time - st = os.stat(file) - return time.localtime(st.st_ctime) - -def dir_size(dir): - """Calculate the size of files under a directory.""" - # It's really hard to give an approximate value for package's - # installed size. Gettin a sum of all files' sizes if far from - # being true. Using 'du' command (like Debian does) can be a - # better solution :(. - # Not really, du calculates size on disk, this is much better -- exa - from os.path import getsize, islink, isdir, exists - join = join_path - - if exists(dir) and (not isdir(dir) and not islink(dir)): - #so, this is not a directory but file.. - return getsize(dir) - - if islink(dir): - return long(len(os.readlink(dir))) - - def sizes(): - for root, dirs, files in os.walk(dir): - yield sum([getsize(join(root, name)) for name in files if not islink(join(root,name))]) - yield sum([long(len(os.readlink((join(root, name))))) for name in files if islink(join(root,name))]) - return sum( sizes() ) - -def copy_file(src,dest): - """Copy source file to the destination file.""" - check_file(src) - check_dir(os.path.dirname(dest)) - shutil.copyfile(src, dest) - -def is_ar_file(file_path): - return open(file_path).readline().strip() == '!' - -def clean_ar_timestamps(ar_file): - """Zero all timestamps in the ar files.""" - if not is_ar_file(ar_file): - return - content = open(ar_file).readlines() - fp = open(ar_file, 'w') - for line in content: - pos = line.rfind(chr(32) + chr(96)) - if pos > -1 and line[pos - 57:pos + 2].find(chr(47)) > -1: - line = line[:pos - 41] + '0000000000' + line[pos - 31:] - fp.write(line) - fp.close() - -# FIXME: this should be done in a much much simpler way -# as it stands, it seems to be a kludge to solve -# an unrelated problem -def get_file_hashes(top, excludePrefix=None, removePrefix=None): - """Iterate over given path and return a list of file hashes. - - Generator function iterates over a toplevel path and returns the - (filePath, sha1Hash) tuples for all files. If excludePrefixes list - is given as a parameter, function will exclude the filePaths - matching those prefixes. The removePrefix string parameter will be - used to remove prefix from filePath while matching excludes, if - given. - """ - - def sha1_sum(f, data=False): - if not data and f.endswith('.a'): - #workaround for .a issue.. - #don't skip .a files, - #but pad their timestamps with '0'.. - clean_ar_timestamps(f) - - func = None - - if data: - func = sha1_data - else: - func = sha1_file - - try: - return func(f) - except FileError, e: - if os.path.islink(f): - ctx.ui.info(_("Including external link '%s'") % f) - elif os.path.isdir(f): - ctx.ui.info(_("Including directory '%s'") % f) - else: - raise e - return None - - def has_excluded_prefix(filename): - if excludePrefix and removePrefix: - tempfnam = remove_prefix(removePrefix, filename) - for p in excludePrefix: - if tempfnam.startswith(p): - return 1 - return 0 - - # handle single file - if os.path.isfile(top): - yield (top, sha1_sum(top)) - return - - # handle single symlink declaration here. - if os.path.islink(top): - yield (top, sha1_sum(os.readlink(top), True)) - return - - for root, dirs, files in os.walk(top, topdown=False): - #bug 339 - if os.path.islink(root) and not has_excluded_prefix(root): - #yield the symlink.. - #bug 373 - yield (root, sha1_sum(os.readlink(root), True)) - excludePrefix.append(remove_prefix(removePrefix, root) + "/") - continue - - #bug 397 - for dir in dirs: - d = join_path(root, dir) - if os.path.islink(d) and not has_excluded_prefix(d): - yield (d, sha1_sum(os.readlink(d), True)) - excludePrefix.append(remove_prefix(removePrefix, d) + "/") - - #bug 340 - if os.path.isdir(root) and not has_excluded_prefix(root): - parent, r, d, f = root, '', '', '' - for r, d, f in os.walk(parent, topdown=False): pass - if not f and not d: - yield (parent, sha1_sum(parent)) - - for fname in files: - f = join_path(root, fname) - if has_excluded_prefix(f): - continue - #bug 373 - elif os.path.islink(f): - yield (f, sha1_sum(os.readlink(f), True)) - else: - yield (f, sha1_sum(f)) - -def copy_dir(src, dest): - """Copy source dir to destination dir recursively.""" - shutil.copytree(src, dest) - -def check_file_hash(filename, hash): - """Check the file's integrity with a given hash.""" - return sha1_file(filename) == hash - -def sha1_file(filename): - """Calculate sha1 hash of file.""" - # Broken links can cause problem! - try: - m = sha.new() - f = file(filename, 'rb') - for line in f: - m.update(line) - return m.hexdigest() - except IOError: - raise FileError(_("I/O Error: Cannot calculate SHA1 hash of %s") % filename) - -def sha1_data(data): - """Calculate sha1 hash of given data.""" - try: - m = sha.new() - m.update(data) - return m.hexdigest() - except KeyboardInterrupt: - raise - except Exception, e: #FIXME: what exception could we catch here, replace with that. - raise Error(_("Cannot calculate SHA1 hash of given data")) - -def uncompress(patchFile, compressType="gz", targetDir=None): - """Uncompress the file and return the new path.""" - if targetDir: - filePath = join_path(targetDir, - os.path.basename(patchFile)) - else: - filePath = os.path.basename(patchFile) - - if compressType == "gz": - from gzip import GzipFile - obj = GzipFile(patchFile) - elif compressType == "bz2": - from bz2 import BZ2File - obj = BZ2File(patchFile) - - open(filePath, "w").write(obj.read()) - return filePath - - -def do_patch(sourceDir, patchFile, level = 0, target = ''): - """Apply given patch to the sourceDir.""" - cwd = os.getcwd() - os.chdir(sourceDir) - - if level == None: - level = 0 - if target == None: - target = '' - - check_file(patchFile) - (ret, out, err) = run_batch("patch -p%d %s < %s" % - (level, target, patchFile)) - if ret: - if out is None and err is None: - # Which means stderr and stdout directed so they are None - raise Error(_("ERROR: patch (%s) failed") % (patchFile)) - else: - raise Error(_("ERROR: patch (%s) failed: %s") % (patchFile, out)) - - os.chdir(cwd) - - -def strip_directory(top, excludelist=[]): - for root, dirs, files in os.walk(top): - for fn in files: - frpath = join_path(root, fn) - drpath = join_path(os.path.dirname(top), - ctx.const.debug_dir_suffix, - remove_prefix(top, frpath)) - - # Some upstream sources have buggy libtool and ltmain.sh with them, - # which causes wrong path entries in *.la files. And these wrong path - # entries sometimes triggers compile-time errors or linkage problems. - # Instead of patching all these buggy sources and maintain these patches, - # PiSi removes wrong paths... - if frpath.endswith(".la"): - ladata = file(frpath).read() - new_ladata = re.sub("-L%s/\S*" % ctx.config.tmp_dir(), "", ladata) - new_ladata = re.sub("%s/\S*/install/" % ctx.config.tmp_dir(), "/", new_ladata) - if new_ladata != ladata: - file(frpath, "w").write(new_ladata) - # real path in .pisi package - p = '/' + removepathprefix(top, frpath) - strip = True - for exclude in excludelist: - if p.startswith(exclude): - strip = False - ctx.ui.debug("%s [%s]" %(p, "NoStrip")) - - if strip: - if strip_file(frpath, drpath): - ctx.ui.debug("%s [%s]" %(p, "stripped")) - - -def strip_file(filepath, outpath): - """Strip an elf file from debug symbols.""" - p = os.popen("file \"%s\"" % filepath) - o = p.read() - - def run_strip(f, flags=""): - p = os.popen("strip %s %s" %(flags, f)) - ret = p.close() - if ret: - ctx.ui.warning(_("strip command failed for file '%s'!") % f) - - def save_elf_debug(f, o): - """copy debug info into file.debug file""" - p = os.popen("objcopy --only-keep-debug %s %s%s" % (f, o, ctx.const.debug_file_suffix)) - ret = p.close() - if ret: - ctx.ui.warning(_("objcopy (keep-debug) command failed for file '%s'!") % f) - - """mark binary/shared objects to use file.debug""" - p = os.popen("objcopy --add-gnu-debuglink=%s%s %s" % (o, ctx.const.debug_file_suffix, f)) - ret = p.close() - if ret: - ctx.ui.warning(_("objcopy (add-debuglink) command failed for file '%s'!") % f) - - if "current ar archive" in o: - run_strip(filepath, "-g") - return True - - elif "SB executable" in o: - if ctx.config.values.build.generatedebug: - check_dir(os.path.dirname(outpath)) - save_elf_debug(filepath, outpath) - run_strip(filepath) - return True - - elif "SB shared object" in o: - if ctx.config.values.build.generatedebug: - check_dir(os.path.dirname(outpath)) - save_elf_debug(filepath, outpath) - run_strip(filepath, "--strip-unneeded") - # FIXME: warn for TEXTREL - return True - - return False - -def partition_freespace(directory): - """Return free space of given directory's partition.""" - st = os.statvfs(directory) - return st[statvfs.F_BSIZE] * st[statvfs.F_BFREE] - -######################################## -# Package/Repository Related Functions # -######################################## - -def package_name(name, version, release, build, prependSuffix=True): - fn = name + '-' + version + '-' + release - if build: - fn += '-' + str(build) - if prependSuffix: - fn += ctx.const.package_suffix - return fn - -def is_package_name(fn, package_name = None): - """Check if fn is a valid filename for given package_name. - - If not given a package name, see if fn fits the package name rules - - """ - if (package_name==None) or fn.startswith(package_name + '-'): - if fn.endswith(ctx.const.package_suffix): - # get version string, skip separator '-' - verstr = fn[len(package_name) + 1: - len(fn)-len(ctx.const.package_suffix)] - import string - for x in verstr.split('-'): - # weak rule: version components after '-' start with a digit - if x is '' or (not x[0] in string.digits): - return False - return True - return False - -def env_update(): - import pisi.environment - ctx.ui.info(_('Updating environment...')) - - env_dir = join_path(ctx.config.dest_dir(), "/etc/env.d") - if not os.path.exists(env_dir): - os.makedirs(env_dir, 0755) - - pisi.environment.update_environment(ctx.config.dest_dir()) - -def parse_package_name(package_name): - """Separate package name and version string. - - example: tasma-1.0.3-5-2 -> (tasma, 1.0.3-5-2) - - """ - # We should handle package names like 855resolution - name = [] - for part in package_name.split("-"): - if name != [] and part[0] in string.digits: - break - else: - name.append(part) - name = "-".join(name) - version = package_name[len(name) + 1:] - - return (name, version) diff --git a/tags/pisi-1.1_rc10/pisi/version.py b/tags/pisi-1.1_rc10/pisi/version.py deleted file mode 100644 index 88fd97c0..00000000 --- a/tags/pisi-1.1_rc10/pisi/version.py +++ /dev/null @@ -1,215 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -"""version structure""" - -import re -import string -import exceptions - -import pisi -import pisi.util as util - -maxdashes = 2 - -# Basic rule is: -# p > (no suffix) > m > rc > pre > beta > alpha -# m: milestone. this was added for OO.o -# p: patch-level -keywords = {"alpha": 0, - "beta" : 1, - "pre" : 2, - "rc" : 3, - "m" : 4, - "NOKEY" : 5, - "p" : 6} - -# helper functions -def has_keyword(versionitem): - if versionitem._keyword != "NOKEY": - return True - - return False - -class VersionException(pisi.Exception): - def __init__(self, str): - pisi.Exception.__init__(self, str) - -class VersionItem: - _keyword = "NOKEY" - _value = 0 - - def __init__(self, itemstring): - - # special-case: 1.5p - # here "p" comes as a separate itemstring and conflicts with - # keyword "p". But keyword should allways contain an integer prefix. - # So, skipping looking for keywords if the length() is 1 makes the - # trick. - if len(itemstring) > 1: - - for keyword in keywords.keys(): - if itemstring.startswith(keyword): - - if self._keyword == "NOKEY": - self._keyword = keyword - else: - # longer match is correct - if len(keyword) > len(self._keyword): - self._keyword = keyword - - if self._keyword == "NOKEY": - if len(itemstring) == 1 and itemstring in string.ascii_letters: - # single letter version item ('a' to 'Z') - self._value = itemstring - else: - self._value = int(itemstring) - else: - # rest is the version item's value. And each must have - # one! - self._value = int(itemstring[len(self._keyword):]) - - def __str__(self): - return str(self._value) - - def __lt__(self,rhs): - l = keywords[self._keyword] - r = keywords[rhs._keyword] - if l < r: - return True - elif l == r: - return self._value < rhs._value - else: # l > r - return False - - def __le__(self,rhs): - l = keywords[self._keyword] - r = keywords[rhs._keyword] - if l < r: - return True - elif l == r: - return self._value <= rhs._value - else: # l > r - return False - - def __gt__(self,rhs): - l = keywords[self._keyword] - r = keywords[rhs._keyword] - if l > r: - return True - elif l == r: - return self._value > rhs._value - else: # l < r - return False - - def __ge__(self,rhs): - l = keywords[self._keyword] - r = keywords[rhs._keyword] - if l > r: - return True - elif l == r: - return self._value >= rhs._value - else: # l < r - return False - - def __eq__(self,rhs): - l = keywords[self._keyword] - r = keywords[rhs._keyword] - if l == r and self._value == rhs._value: - return True - return False - - - -class Version: - - def __init__(self, verstring): - # PiSi version policy does not allow "-" in version strings. - # They are special and used for build and release no separation. - if verstring.count("-") > maxdashes: - raise VersionException("%s is not a valid PiSi version format" % verstring) - - verchunks = verstring.split("-") - verchunks.extend("0" * (maxdashes - verstring.count("-"))) - (version, release, build) = verchunks - - self.comps = [] - for i in util.multisplit(version,'._'): - # some version strings can contain ascii chars at the - # back. As an example: 2.11a - # We split '11a' as two items like '11' and 'a' - s = re.compile("[a-z-A-Z]$").search(i) - if s: - head = i[:s.start()] - tail = s.group() - self.comps.append(VersionItem(head)) - self.comps.append(VersionItem(tail)) - else: - self.comps.append(VersionItem(i)) - - self.verstring = verstring - self.release = VersionItem(release) - self.build = VersionItem(build) - - def string(self): - return self.verstring - - def compare(self, ver): - """this comparison routine is essentially a comparison routine - for two rationals in (0,1) interval. we compare two sequences - of digits one by one. We start with the leftmost digit - in the expansion. If they are equal, we proceed to the next. If - not we use the comparison operator. And we iterate to the left. - The result is, 0 if two are equal, -1 if self < rhs, and +1 - if self>rhs""" - lhs = self.comps - rhs = ver.comps - # pad the short version string with zeros - if len(lhs) < len(rhs): - lhs.extend( [VersionItem('0')] * (len(rhs) - len(lhs)) ) - elif len(lhs) > len(rhs): - rhs.extend( [VersionItem('0')] * (len(lhs) - len(rhs)) ) - # now let's iterate from left to right in version items - for (litem, ritem) in zip(lhs, rhs): - if litem < ritem: - return -1 - elif litem > ritem: - return +1 - # now let's compare release and build - lhs = (self.release, self.build) - rhs = (ver.release, ver.build) - for (litem, ritem) in zip(lhs, rhs): - if litem < ritem: - return -1 - elif litem > ritem: - return +1 - return 0 - - # premature optimization is the root of all evil - - def __lt__(self,rhs): - return self.compare(rhs) < 0 - - def __le__(self,rhs): - return self.compare(rhs) <= 0 - - def __gt__(self,rhs): - return self.compare(rhs) > 0 - - def __ge__(self,rhs): - return self.compare(rhs) >= 0 - - def __eq__(self,rhs): - return self.compare(rhs) == 0 - - def __str__(self): - return self.verstring diff --git a/tags/pisi-1.1_rc10/po/de.po b/tags/pisi-1.1_rc10/po/de.po deleted file mode 100644 index d46c3194..00000000 --- a/tags/pisi-1.1_rc10/po/de.po +++ /dev/null @@ -1,2600 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: pisi\n" -"POT-Creation-Date: 2006-12-08 21:29+EET\n" -"PO-Revision-Date: 2006-11-10 15:20+EET\n" -"Last-Translator: de \n" -"Language-Team: de \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: /usr/lib/python2.4/optparse.py:1 -msgid "" -"optparse - a powerful, extensible, and easy-to-use option parser.\n" -"\n" -"By Greg Ward \n" -"\n" -"Originally distributed as Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"If you have problems with this module, please do not file bugs,\n" -"patches, or feature requests with Python; instead, use Optik's\n" -"SourceForge project page:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"For support, use the optik-users@lists.sourceforge.net mailing list\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:93 -msgid "" -"\n" -" Raised if an Option instance is created with invalid or\n" -" inconsistent arguments.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:109 -msgid "" -"\n" -" Raised if conflicting options are added to an OptionParser.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:114 -msgid "" -"\n" -" Raised if an invalid option value is encountered on the command\n" -" line.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:120 -msgid "" -"\n" -" Raised if an invalid or ambiguous option is seen on the command-line.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:298 pisi/cli/commands.py:50 -msgid "Return a comma-separated list of option strings & metavariables." -msgstr "" - -#: /usr/lib/python2.4/optparse.py:317 -msgid "" -"Format help with indented section bodies.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:329 pisi/cli/commands.py:44 -msgid "usage: %s\n" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:336 -msgid "" -"Format help with underlined section headers.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:348 -msgid "Usage" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:354 -msgid "integer" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:355 -msgid "long integer" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:356 -msgid "floating-point" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:357 -msgid "complex" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:365 -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:373 -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:382 -msgid "" -"\n" -" Instance attributes:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:781 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary, but only\n" -" use keys from dict that already have a corresponding attribute\n" -" in self. Any keys in dict without a corresponding attribute\n" -" are silently ignored.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:794 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary,\n" -" using all keys from the dictionary regardless of whether\n" -" they have a corresponding attribute in self or not.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:926 -msgid "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1138 -msgid "show this help message and exit" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1143 -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1166 -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1246 -msgid "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse the command-line options found in 'args' (default:\n" -" sys.argv[1:]). Any errors result in a call to 'error()', which\n" -" by default prints the usage message to stderr and calls\n" -" sys.exit() with an error message. On success returns a pair\n" -" (values, args) where 'values' is an Values instance (with all\n" -" your option values) and 'args' is the list of arguments left\n" -" over after parsing options.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1285 -msgid "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Check that the supplied option values and leftover arguments are\n" -" valid. Returns the option values and leftover arguments\n" -" (possibly adjusted, possibly completely new -- whatever you\n" -" like). Default implementation just returns the passed-in\n" -" values; subclasses may override as desired.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1298 -msgid "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Process command-line arguments and populate 'values', consuming\n" -" options and arguments from 'rargs'. If 'allow_interspersed_args' " -"is\n" -" false, stop at the first non-option argument. If true, accumulate " -"any\n" -" interspersed non-option arguments in 'largs'.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1349 -msgid "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determine which long option string 'opt' matches, ie. which one\n" -" it is an unambiguous abbrevation for. Raises BadOptionError if\n" -" 'opt' doesn't unambiguously match any long option string.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1376 /usr/lib/python2.4/optparse.py:1415 -msgid "%s option requires an argument" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1378 /usr/lib/python2.4/optparse.py:1417 -msgid "%s option requires %d arguments" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1387 -msgid "%s option does not take a value" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1404 /usr/lib/python2.4/optparse.py:1558 -msgid "no such option: %s" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1454 -msgid "" -"error(msg : string)\n" -"\n" -" Print a usage message incorporating 'msg' to stderr and exit.\n" -" If you override this in a subclass, it should not return -- it\n" -" should either exit or raise an exception.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1471 -msgid "" -"print_usage(file : file = stdout)\n" -"\n" -" Print the usage message for the current program (self.usage) to\n" -" 'file' (default stdout). Any occurence of the string \"%prog\" in\n" -" self.usage is replaced with the name of the current program\n" -" (basename of sys.argv[0]). Does nothing if self.usage is empty\n" -" or not defined.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1489 -msgid "" -"print_version(file : file = stdout)\n" -"\n" -" Print the version message for this program (self.version) to\n" -" 'file' (default stdout). As with print_usage(), any occurence\n" -" of \"%prog\" in self.version is replaced by the current program's\n" -" name. Does nothing if self.version is empty or undefined.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1504 -msgid "options" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1528 -msgid "" -"print_help(file : file = stdout)\n" -"\n" -" Print an extended help message, listing all options and any\n" -" help text provided with them, to 'file' (default stdout).\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1541 -msgid "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Return the string key in 'wordmap' for which 's' is an unambiguous\n" -" abbreviation. If 's' is found to be ambiguous or doesn't match any of\n" -" 'words', raise BadOptionError.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1562 -msgid "ambiguous option: %s (%s?)" -msgstr "" - -#: pisi-cli:46 -msgid "Keyboard Interrupt: Exiting..." -msgstr "" - -#: pisi-cli:49 -msgid "Program Terminated." -msgstr "" - -#: pisi-cli:52 -msgid "" -"A database operation has been aborted. You should run pisi\n" -"again for normal DB recovery procedure. Make sure you have free disk " -"space. \n" -"You have to run rebuild-db only when there is file corruption and database " -"upgrades." -msgstr "" - -#: pisi-cli:57 -msgid "" -"Unhandled internal exception.\n" -"Please file a bug report. (http://bugs.uludag.org.tr)" -msgstr "" - -#: pisi-cli:63 -msgid "System Error. Program Terminated." -msgstr "" - -#: pisi-cli:70 -msgid "Please use 'pisi help' for general help." -msgstr "" - -#: pisi-cli:73 -msgid "Traceback:" -msgstr "" - -#: pisi-cli:77 -msgid "Use --debug to see a traceback." -msgstr "" - -#: pisi/actionsapi/autotools.py:36 -msgid "" -"Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" - -#: pisi/actionsapi/autotools.py:75 pisi/actionsapi/autotools.py:85 -#: pisi/actionsapi/kde.py:65 pisi/actionsapi/perlmodules.py:54 -#: pisi/actionsapi/perlmodules.py:57 -msgid "Configure failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:77 pisi/actionsapi/autotools.py:87 -#: pisi/actionsapi/kde.py:67 -msgid "No configure script found." -msgstr "" - -#: pisi/actionsapi/autotools.py:96 pisi/actionsapi/kde.py:72 -#: pisi/actionsapi/perlmodules.py:63 pisi/actionsapi/perlmodules.py:72 -#: pisi/actionsapi/pythonmodules.py:49 pisi/actionsapi/scons.py:39 -msgid "Make failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:124 pisi/actionsapi/autotools.py:134 -#: pisi/actionsapi/kde.py:79 pisi/actionsapi/pythonmodules.py:54 -#: pisi/actionsapi/scons.py:43 -msgid "Install failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:126 pisi/actionsapi/autotools.py:136 -#: pisi/actionsapi/kde.py:81 -msgid "No Makefile found." -msgstr "" - -#: pisi/actionsapi/autotools.py:143 -msgid "Running aclocal failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:148 -msgid "Running autoconf failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:153 -msgid "Running autoreconf failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:158 -msgid "Running automake failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:163 -msgid "Running autoheader failed." -msgstr "" - -#: pisi/actionsapi/get.py:163 -msgid "Util %s cannot be found" -msgstr "" - -#: pisi/actionsapi/get.py:165 -msgid "Warning: %s does not exist, using plain name %s" -msgstr "" - -#: pisi/actionsapi/kde.py:34 -msgid "" -"\n" -"!!! Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" - -#: pisi/actionsapi/libtools.py:38 -msgid "Running ldconfig failed." -msgstr "" - -#: pisi/actionsapi/libtools.py:49 -msgid "GNU Config Update Finished." -msgstr "" - -#: pisi/actionsapi/libtools.py:53 -msgid "Running libtoolize failed." -msgstr "" - -#: pisi/actionsapi/perlmodules.py:66 -msgid "perl build failed." -msgstr "" - -#: pisi/actionsapi/perlmodules.py:75 -msgid "perl install failed." -msgstr "" - -#: pisi/actionsapi/pisitools.py:126 -msgid "ActionsAPI [doman]: Wrong man page file: %s" -msgstr "" - -#: pisi/actionsapi/pisitools.py:164 -msgid "ActionsAPI [rename]: No such file or directory: %s" -msgstr "" - -#: pisi/actionsapi/pisitools.py:181 -msgid "File does not exist or permission denied: %s" -msgstr "" - -#: pisi/actionsapi/pisitools.py:198 -msgid "ActionsAPI [dosym]: File exists: %s" -msgstr "" - -#: pisi/actionsapi/pisitoolsfunctions.py:45 -#: pisi/actionsapi/pisitoolsfunctions.py:59 -#: pisi/actionsapi/pisitoolsfunctions.py:72 -msgid "Insufficient arguments." -msgstr "" - -#: pisi/actionsapi/pythonmodules.py:66 -msgid "Running %s failed." -msgstr "" - -#: pisi/actionsapi/shelltools.py:49 -msgid "Cannot create directory %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:57 -msgid "ActionsAPI [echo]: Can't append to file %s." -msgstr "" - -#: pisi/actionsapi/shelltools.py:66 -msgid "ActionsAPI [chmod]: Operation not permitted: %s (mode: %s)" -msgstr "" - -#: pisi/actionsapi/shelltools.py:69 -msgid "ActionsAPI [chmod]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:77 -msgid "ActionsAPI [chown]: Operation not permitted: %s (uid: %s, gid: %s)" -msgstr "" - -#: pisi/actionsapi/shelltools.py:80 -msgid "ActionsAPI [chown]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:87 -msgid "ActionsAPI [sym]: Permission denied: %s to %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:95 -msgid "ActionsAPI [unlink]: Permission denied: %s." -msgstr "" - -#: pisi/actionsapi/shelltools.py:99 -msgid "ActionsAPI [unlink]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:107 -msgid "ActionsAPI [unlinkDir]: Operation not permitted: %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:111 -msgid "ActionsAPI [unlinkDir]: Directory %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:120 -msgid "ActionsAPI [move]: Permission denied: %s to %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:122 -msgid "ActionsAPI [move]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:132 -msgid "ActionsAPI [copy]: Permission denied: %s to %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:148 -msgid "ActionsAPI [copy]: File %s does not exist." -msgstr "" - -#: pisi/actionsapi/shelltools.py:163 -msgid "ActionsAPI [copytree] %s to %s: %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:165 -msgid "ActionsAPI [copytree]: Directory %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:177 -msgid "ActionsAPI [touch]: Permission denied: %s" -msgstr "" - -#: pisi/api.py:302 pisi/comariface.py:30 -msgid "comar package is not fully installed" -msgstr "" - -#: pisi/api.py:314 -msgid "File %s not found" -msgstr "" - -#: pisi/api.py:375 -msgid "Checking /%s " -msgstr "" - -#: pisi/api.py:379 -msgid "" -"\n" -"Corrupt file: %s" -msgstr "" - -#: pisi/api.py:381 pisi/cli/commands.py:966 -msgid "OK" -msgstr "" - -#: pisi/api.py:394 -msgid "* Building index of PiSi files under %s" -msgstr "" - -#: pisi/api.py:401 -msgid "* Index file written" -msgstr "" - -#: pisi/api.py:405 -msgid "Repo %s already present." -msgstr "" - -#: pisi/api.py:409 -msgid "Repo %s added to system." -msgstr "" - -#: pisi/api.py:415 -msgid "Repo %s removed from system." -msgstr "" - -#: pisi/api.py:417 -msgid "Repository %s does not exist. Cannot remove." -msgstr "" - -#: pisi/api.py:424 -msgid "* Updating repository: %s" -msgstr "" - -#: pisi/api.py:432 -msgid "No updates available for repository %s." -msgstr "" - -#: pisi/api.py:434 -msgid "Updating database at any rate as requested" -msgstr "" - -#: pisi/api.py:445 -msgid "* Package database updated." -msgstr "" - -#: pisi/api.py:447 pisi/api.py:472 -msgid "No repository named %s found." -msgstr "" - -#: pisi/api.py:455 -msgid "* Rebuilding '%s' named repo... " -msgstr "" - -#: pisi/api.py:468 -msgid "Input/Output error while reading %s: %s" -msgstr "" - -#: pisi/api.py:525 -msgid "Rebuilding package database" -msgstr "" - -#: pisi/archive.py:36 -msgid "" -"An error has occured while running LZMA:\n" -"%s" -msgstr "" - -#: pisi/archive.py:101 pisi/archive.py:161 -msgid "Archive type not recognized" -msgstr "" - -#: pisi/atomicoperations.py:66 -msgid "Package %s found in repository %s" -msgstr "" - -#: pisi/atomicoperations.py:78 -msgid "Package URI: %s" -msgstr "" - -#: pisi/atomicoperations.py:82 -msgid "Package %s not found in any active repository." -msgstr "" - -#: pisi/atomicoperations.py:101 -msgid "Installing %s, version %s, release %s, build %s" -msgstr "" - -#: pisi/atomicoperations.py:146 -msgid "Dependencies for %s not satisfied" -msgstr "" - -#: pisi/atomicoperations.py:148 -msgid "Package not installable" -msgstr "" - -#: pisi/atomicoperations.py:166 -msgid "/%s from %s package\n" -msgstr "" - -#: pisi/atomicoperations.py:167 -msgid "" -"File conflicts:\n" -"%s" -msgstr "" - -#: pisi/atomicoperations.py:202 -msgid "Re-install same version package?" -msgstr "" - -#: pisi/atomicoperations.py:203 -msgid "Package re-install declined" -msgstr "" - -#: pisi/atomicoperations.py:209 -msgid "Upgrading to new upstream version" -msgstr "" - -#: pisi/atomicoperations.py:212 -msgid "Upgrading to new distribution release" -msgstr "" - -#: pisi/atomicoperations.py:216 -msgid "Upgrading to new distribution build" -msgstr "" - -#: pisi/atomicoperations.py:226 -msgid "Downgrade to old distribution release?" -msgstr "" - -#: pisi/atomicoperations.py:228 -msgid "Downgrade to old distribution build?" -msgstr "" - -#: pisi/atomicoperations.py:230 -msgid "Package downgrade declined" -msgstr "" - -#: pisi/atomicoperations.py:254 -msgid "%s configuration failed." -msgstr "" - -#: pisi/atomicoperations.py:341 -msgid "Storing %s, " -msgstr "" - -#: pisi/atomicoperations.py:344 -msgid "Storing %s." -msgstr "" - -#: pisi/atomicoperations.py:351 -msgid "Storing %s" -msgstr "" - -#: pisi/atomicoperations.py:407 -msgid "File list could not be read for package %s, continuing removal." -msgstr "" - -#: pisi/atomicoperations.py:413 -msgid "Removing package %s" -msgstr "" - -#: pisi/atomicoperations.py:416 -msgid "Trying to remove nonexistent package " -msgstr "" - -#: pisi/atomicoperations.py:455 -msgid "Not removing conflicted file : %s" -msgstr "" - -#: pisi/atomicoperations.py:475 -msgid "" -"Installed file %s is not exists on system [Probably you manually deleted]" -msgstr "" - -#: pisi/atomicoperations.py:536 -msgid "Metadata XML '%s' cannot be found" -msgstr "" - -#: pisi/atomicoperations.py:544 -msgid "MetaData format wrong (%s)" -msgstr "" - -#: pisi/atomicoperations.py:546 -msgid "* Adding '%s' to db... " -msgstr "" - -#: pisi/atomicoperations.py:552 -msgid "Files XML '%s' cannot be found" -msgstr "" - -#: pisi/atomicoperations.py:557 pisi/package.py:136 -msgid "Invalid %s" -msgstr "" - -#: pisi/atomicoperations.py:566 -msgid "OK." -msgstr "" - -#: pisi/build.py:88 -msgid "Path %s belongs in multiple packages" -msgstr "" - -#: pisi/build.py:114 -msgid "Source URI: %s" -msgstr "" - -#: pisi/build.py:118 -msgid "Source %s not found in any active repository." -msgstr "" - -#: pisi/build.py:183 -msgid "Building PiSi source package: %s" -msgstr "" - -#: pisi/build.py:229 -msgid "IceCream detected. Make sure your daemon is up and running..." -msgstr "" - -#: pisi/build.py:234 -msgid "CCache detected..." -msgstr "" - -#: pisi/build.py:287 -msgid "PartOf tag not defined, looking for component" -msgstr "" - -#: pisi/build.py:297 -msgid "Cannot find component.xml in upper directory" -msgstr "" - -#: pisi/build.py:301 -msgid "Source is part of %s component" -msgstr "" - -#: pisi/build.py:305 -msgid "Fetching source from: %s" -msgstr "" - -#: pisi/build.py:307 -msgid "Source archive is stored: %s/%s" -msgstr "" - -#: pisi/build.py:311 -msgid "Unpacking archive..." -msgstr "" - -#: pisi/build.py:313 -msgid " unpacked (%s)" -msgstr "" - -#: pisi/build.py:318 -msgid "Setting up source..." -msgstr "" - -#: pisi/build.py:323 -msgid "Building source..." -msgstr "" - -#: pisi/build.py:328 -msgid "Installing..." -msgstr "" - -#: pisi/build.py:370 -msgid "Unable to read Actions Script (%s): %s" -msgstr "" - -#: pisi/build.py:372 -msgid "SyntaxError in Actions Script (%s): %s" -msgstr "" - -#: pisi/build.py:389 -msgid "Unable to read COMAR script (%s): %s" -msgstr "" - -#: pisi/build.py:391 -msgid "SyntaxError in COMAR file (%s): %s" -msgstr "" - -#: pisi/build.py:417 -msgid "unable to call function from actions: %s" -msgstr "" - -#: pisi/build.py:433 -msgid "" -"Safety switch: following extra packages in system.devel will be installed: " -msgstr "" - -#: pisi/build.py:438 -msgid "Safety switch: system.devel is already installed" -msgstr "" - -#: pisi/build.py:440 -msgid "Safety switch: the component system.devel cannot be found" -msgstr "" - -#: pisi/build.py:449 -msgid "Unsatisfied Build Dependencies:" -msgstr "" - -#: pisi/build.py:453 -msgid "Cannot build package due to unsatisfied build dependencies" -msgstr "" - -#: pisi/build.py:461 -msgid "Build dependency %s cannot be satisfied" -msgstr "" - -#: pisi/build.py:463 -msgid "Do you want to install the unsatisfied build dependencies" -msgstr "" - -#: pisi/build.py:464 -msgid "Installing build dependencies." -msgstr "" - -#: pisi/build.py:469 -msgid "Ignoring build dependencies." -msgstr "" - -#: pisi/build.py:479 -msgid "Patch file is missing: %s\n" -msgstr "" - -#: pisi/build.py:492 -msgid "* Applying patch: %s" -msgstr "" - -#: pisi/build.py:550 -msgid "Stripping files.." -msgstr "" - -#: pisi/build.py:656 -msgid "(found old version %s)" -msgstr "" - -#: pisi/build.py:658 -msgid "Skipping %s with wrong pkg name " -msgstr "" - -#: pisi/build.py:679 -msgid "(no previous build found, setting build no to 1.)" -msgstr "" - -#: pisi/build.py:724 -msgid "(old package lacks a build no, setting build no to 1.)" -msgstr "" - -#: pisi/build.py:727 -msgid "There are changes, incrementing build no to %d" -msgstr "" - -#: pisi/build.py:730 -msgid "There is no change from previous build %d" -msgstr "" - -#: pisi/build.py:795 -msgid "No user named '%s' found on the system" -msgstr "" - -#: pisi/build.py:800 -msgid "No group named '%s' found on the system" -msgstr "" - -#: pisi/build.py:803 -msgid "** Building package %s" -msgstr "" - -#: pisi/build.py:805 pisi/build.py:808 -msgid "Generating %s," -msgstr "" - -#: pisi/build.py:814 -msgid "" -"Build number is not available. For repo builds you must enable buildno in " -"pisi.conf." -msgstr "" - -#: pisi/build.py:832 -msgid "Creating PiSi package %s." -msgstr "" - -#: pisi/build.py:877 -msgid "Done." -msgstr "" - -#: pisi/build.py:883 -msgid "Abandoned files under the install dir (%s):" -msgstr "" - -#: pisi/build.py:887 -msgid "" -"All of the files under the install dir (%s) has been collected by package(s)" -msgstr "" - -#: pisi/build.py:891 -msgid "Cleaning Build Directory..." -msgstr "" - -#: pisi/build.py:894 -msgid "Keeping Build Directory" -msgstr "" - -#: pisi/cli/__init__.py:79 -msgid "Warning: " -msgstr "" - -#: pisi/cli/__init__.py:88 -msgid "Error: " -msgstr "" - -#: pisi/cli/__init__.py:120 -msgid " (yes/no)" -msgstr "" - -#: pisi/cli/__init__.py:141 -msgid " [complete]\n" -msgstr "" - -#: pisi/cli/__init__.py:151 -msgid "Installed %s" -msgstr "" - -#: pisi/cli/__init__.py:153 -msgid "Removed %s" -msgstr "" - -#: pisi/cli/__init__.py:155 -msgid "Upgraded %s" -msgstr "" - -#: pisi/cli/__init__.py:157 -msgid "Configured %s" -msgstr "" - -#: pisi/cli/__init__.py:159 -msgid "Extracting the files of %s" -msgstr "" - -#: pisi/cli/commands.py:94 -msgid "generic help string for any command" -msgstr "" - -#: pisi/cli/commands.py:123 pisi/cli/pisicli.py:104 -msgid "Unrecognized command: %s" -msgstr "" - -#: pisi/cli/commands.py:145 -msgid "common options" -msgstr "" - -#: pisi/cli/commands.py:148 -msgid "general options" -msgstr "" - -#: pisi/cli/commands.py:151 -msgid "Change the system root for PiSi commands" -msgstr "" - -#: pisi/cli/commands.py:153 -msgid "Assume yes in all yes/no queries" -msgstr "" - -#: pisi/cli/commands.py:158 -msgid "Detailed output" -msgstr "" - -#: pisi/cli/commands.py:160 -msgid "Show debugging information" -msgstr "" - -#: pisi/cli/commands.py:162 -msgid "Suppresses all coloring of PiSi's output" -msgstr "" - -#: pisi/cli/commands.py:169 -msgid "" -"This is a fall back function. If the implementer module provides an\n" -" options function it will be called" -msgstr "" - -#: pisi/cli/commands.py:181 -msgid "Destination directory %s does not exist. Creating directory.\n" -msgstr "" - -#: pisi/cli/commands.py:203 -msgid "Password: " -msgstr "" - -#: pisi/cli/commands.py:209 -msgid "initialize PiSi components" -msgstr "" - -#: pisi/cli/commands.py:217 -msgid "do cleanup work for PiSi components" -msgstr "" - -#: pisi/cli/commands.py:231 -msgid "print help for the command" -msgstr "" - -#: pisi/cli/commands.py:237 -msgid "exit program" -msgstr "" - -#: pisi/cli/commands.py:239 -msgid "Command terminated abnormally." -msgstr "" - -#: pisi/cli/commands.py:249 -msgid "Command lacks name" -msgstr "" - -#: pisi/cli/commands.py:253 -msgid "Duplicate command %s" -msgstr "" - -#: pisi/cli/commands.py:262 -msgid "" -"Prints help for given commands\n" -"\n" -"Usage: help [ ... ]\n" -"\n" -"If run without parameters, it prints the general help." -msgstr "" - -#: pisi/cli/commands.py:296 -msgid "" -"Clean stale locks\n" -"\n" -"Usage: clean\n" -"\n" -"PiSi uses filesystem locks for managing database access.\n" -"This command deletes unused locks from the database directory." -msgstr "" - -#: pisi/cli/commands.py:315 -msgid "" -"Delete cache files\n" -"\n" -"Usage: delete-cache\n" -"\n" -"Sources, packages and temporary files are stored\n" -"under /var directory. Since these accumulate they can\n" -"consume a lot of disk space." -msgstr "" - -#: pisi/cli/commands.py:336 -msgid "" -"Graph package relations\n" -"\n" -"Usage: graph [ ...]\n" -"\n" -"Write a graph of package relations, tracking dependency and\n" -"conflicts relations starting from given packages. By default\n" -"shows the package relations among repository packages, and writes\n" -"the package in graphviz format to 'pgraph.dot'.\n" -msgstr "" - -#: pisi/cli/commands.py:353 -msgid "graph options" -msgstr "" - -#: pisi/cli/commands.py:357 -msgid "Specify a particular repository" -msgstr "" - -#: pisi/cli/commands.py:360 -msgid "Graph of installed packages" -msgstr "" - -#: pisi/cli/commands.py:363 -msgid "Do not show installed packages" -msgstr "" - -#: pisi/cli/commands.py:366 -msgid "Dot output file" -msgstr "" - -#: pisi/cli/commands.py:377 -msgid "Plotting packages in repository %s" -msgstr "" - -#: pisi/cli/commands.py:383 -msgid "Plotting a graph of relations among all repository packages" -msgstr "" - -#: pisi/cli/commands.py:390 -msgid "Plotting a graph of relations among all installed packages" -msgstr "" - -#: pisi/cli/commands.py:402 -msgid "Do not take build no into account." -msgstr "" - -#: pisi/cli/commands.py:407 -msgid "Do not take dependency information into account" -msgstr "" - -#: pisi/cli/commands.py:411 -msgid "" -"Build PiSi packages\n" -"\n" -"Usage: build [ | ] ...\n" -"\n" -"You can give a URI of the pspec.xml file. PiSi will\n" -"fetch all necessary files and build the package for you.\n" -"\n" -"Alternatively, you can give the name of a source package\n" -"to be downloaded from a repository containing sources.\n" -msgstr "" - -#: pisi/cli/commands.py:433 -msgid "build options" -msgstr "" - -#: pisi/cli/commands.py:441 -msgid "Output directory for produced packages" -msgstr "" - -#: pisi/cli/commands.py:444 -msgid "Bypass errors from ActionsAPI" -msgstr "" - -#: pisi/cli/commands.py:446 pisi/cli/commands.py:554 -msgid "Bypass safety switch" -msgstr "" - -#: pisi/cli/commands.py:448 -msgid "Create a static package with ar files" -msgstr "" - -#: pisi/cli/commands.py:450 -msgid "" -"Do not install build dependencies, fail if a build dependency is present" -msgstr "" - -#: pisi/cli/commands.py:452 -msgid "PiSi binary package formats: '1.0', '1.1' (default)" -msgstr "" - -#: pisi/cli/commands.py:455 -msgid "build steps" -msgstr "" - -#: pisi/cli/commands.py:457 -msgid "Break build after fetching the source archive" -msgstr "" - -#: pisi/cli/commands.py:459 -msgid "" -"Break build after unpacking the source archive, checking sha1sum and " -"applying patches" -msgstr "" - -#: pisi/cli/commands.py:461 -msgid "Break build after running configure step" -msgstr "" - -#: pisi/cli/commands.py:463 -msgid "Break build after running compile step" -msgstr "" - -#: pisi/cli/commands.py:465 -msgid "Break build after running install step" -msgstr "" - -#: pisi/cli/commands.py:467 -msgid "create PiSi package" -msgstr "" - -#: pisi/cli/commands.py:481 -msgid "package_format must be one of %s " -msgstr "" - -#: pisi/cli/commands.py:484 pisi/cli/commands.py:533 -msgid "Output directory: %s" -msgstr "" - -#: pisi/cli/commands.py:486 -msgid "Outputting packages in the working directory." -msgstr "" - -#: pisi/cli/commands.py:497 -msgid "" -"Build and install PiSi source packages from repository\n" -"\n" -"Usage: emerge ...\n" -"\n" -"You should give the name of a source package to be\n" -"downloaded from a repository containing sources.\n" -"\n" -"You can also give the name of a component.\n" -msgstr "" - -#: pisi/cli/commands.py:516 -msgid "emerge options" -msgstr "" - -#: pisi/cli/commands.py:519 pisi/cli/commands.py:592 pisi/cli/commands.py:656 -msgid "Ignore file conflicts" -msgstr "" - -#: pisi/cli/commands.py:521 pisi/cli/commands.py:594 pisi/cli/commands.py:658 -msgid "Ignore package conflicts" -msgstr "" - -#: pisi/cli/commands.py:523 pisi/cli/commands.py:552 -msgid "Bypass comar configuration agent" -msgstr "" - -#: pisi/cli/commands.py:535 -msgid "Outputting binary packages in the package cache." -msgstr "" - -#: pisi/cli/commands.py:543 -msgid "Abstract package operation command" -msgstr "" - -#: pisi/cli/commands.py:556 -msgid "Do not perform any action, just show what would be done" -msgstr "" - -#: pisi/cli/commands.py:567 -msgid "" -"Install PiSi packages\n" -"\n" -"Usage: install ... \n" -"\n" -"You may use filenames, URI's or package names for packages. If you have\n" -"specified a package name, it should exist in a specified repository.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" - -#: pisi/cli/commands.py:585 -msgid "install options" -msgstr "" - -#: pisi/cli/commands.py:590 -msgid "Reinstall already installed packages" -msgstr "" - -#: pisi/cli/commands.py:596 -msgid "Install component's and recursive components' packages" -msgstr "" - -#: pisi/cli/commands.py:598 pisi/cli/commands.py:662 -msgid "Fetch upgrades but do not install." -msgstr "" - -#: pisi/cli/commands.py:621 -msgid "" -"Upgrade PiSi packages\n" -"\n" -"Usage: Upgrade [ ... ]\n" -"\n" -": package name\n" -"\n" -"Upgrades the entire system if no package names are given\n" -"\n" -"You may use only package names to specify packages because\n" -"the package upgrade operation is defined only with respect\n" -"to repositories. If you have specified a package name, it\n" -"should exist in the package repositories. If you just want to\n" -"reinstall a package from a PiSi file, use the install command.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" - -#: pisi/cli/commands.py:647 -msgid "upgrade options" -msgstr "" - -#: pisi/cli/commands.py:652 -msgid "Security related package upgrades only" -msgstr "" - -#: pisi/cli/commands.py:654 -msgid "Do not update repositories" -msgstr "" - -#: pisi/cli/commands.py:660 -msgid "Upgrade component's and recursive components' packages" -msgstr "" - -#: pisi/cli/commands.py:664 -msgid "" -"When upgrading system, ignore packages and components whose basenames match " -"pattern." -msgstr "" - -#: pisi/cli/commands.py:666 -msgid "" -"When upgrading system, ignore packages and components whose " -"basenames match any pattern contained in file." -msgstr "" - -#: pisi/cli/commands.py:706 -msgid "Updating repositories" -msgstr "" - -#: pisi/cli/commands.py:711 -msgid "Will not update repositories" -msgstr "" - -#: pisi/cli/commands.py:733 -msgid "" -"Remove PiSi packages\n" -"\n" -"Usage: remove ... \n" -"\n" -"Remove package(s) from your system. Just give the package names to remove.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" - -#: pisi/cli/commands.py:750 -msgid "remove options" -msgstr "" - -#: pisi/cli/commands.py:753 -msgid "Remove component's and recursive components' packages" -msgstr "" - -#: pisi/cli/commands.py:775 -msgid "" -"Configure pending packages\n" -"\n" -"If COMAR configuration of some packages were not\n" -"done at installation time, they are added to a list\n" -"of packages waiting to be configured. This command\n" -"configures those packages.\n" -msgstr "" - -#: pisi/cli/commands.py:791 -msgid "configure-pending options" -msgstr "" - -#: pisi/cli/commands.py:803 -msgid "" -"Display package information\n" -"\n" -"Usage: info ... \n" -"\n" -" is either a package name or a .pisi file,\n" -msgstr "" - -#: pisi/cli/commands.py:818 -msgid "info options" -msgstr "" - -#: pisi/cli/commands.py:825 -msgid "Show a list of package files." -msgstr "" - -#: pisi/cli/commands.py:827 -msgid "Info about the given component" -msgstr "" - -#: pisi/cli/commands.py:830 -msgid "Show only paths." -msgstr "" - -#: pisi/cli/commands.py:832 -msgid "Do not show details" -msgstr "" - -#: pisi/cli/commands.py:834 -msgid "Output in xml format" -msgstr "" - -#: pisi/cli/commands.py:880 -msgid "Package file: %s" -msgstr "" - -#: pisi/cli/commands.py:886 -msgid "[inst] " -msgstr "" - -#: pisi/cli/commands.py:888 -msgid "Installed package:" -msgstr "" - -#: pisi/cli/commands.py:894 -msgid "[repo] " -msgstr "" - -#: pisi/cli/commands.py:896 -msgid "Package found in repository:" -msgstr "" - -#: pisi/cli/commands.py:900 -msgid "%s is not found in repositories" -msgstr "" - -#: pisi/cli/commands.py:903 -msgid "%s is not installed" -msgstr "" - -#: pisi/cli/commands.py:916 -msgid "Reverse Dependencies:" -msgstr "" - -#: pisi/cli/commands.py:919 -msgid "" -"\n" -"Files:" -msgstr "" - -#: pisi/cli/commands.py:927 -msgid "File information not available" -msgstr "" - -#: pisi/cli/commands.py:933 -msgid "" -"Verify installation\n" -"\n" -"Usage: check [ ... ]\n" -"\n" -": package name\n" -"\n" -"A cryptographic checksum is stored for each installed\n" -"file. Check command uses the checksums to verify a package.\n" -"Just give the names of packages.\n" -"\n" -"If no packages are given, checks all installed packages.\n" -msgstr "" - -#: pisi/cli/commands.py:957 -msgid "Checking all installed packages" -msgstr "" - -#: pisi/cli/commands.py:960 -msgid "* Checking %s... " -msgstr "" - -#: pisi/cli/commands.py:964 -msgid "" -"\n" -"Package %s is corrupt." -msgstr "" - -#: pisi/cli/commands.py:968 -msgid "Package %s not installed" -msgstr "" - -#: pisi/cli/commands.py:973 -msgid "" -"Index PiSi files in a given directory\n" -"\n" -"Usage: index ...\n" -"\n" -"This command searches for all PiSi files in a directory, collects PiSi\n" -"tags from them and accumulates the information in an output XML file,\n" -"named by default 'pisi-index.xml'. In particular, it indexes both\n" -"source and binary packages.\n" -"\n" -"If you give multiple directories, the command still works, but puts\n" -"everything in a single index file.\n" -msgstr "" - -#: pisi/cli/commands.py:994 -msgid "index options" -msgstr "" - -#: pisi/cli/commands.py:998 -msgid "Store absolute links for indexed files." -msgstr "" - -#: pisi/cli/commands.py:1001 -msgid "Index output file" -msgstr "" - -#: pisi/cli/commands.py:1004 -msgid "Do not index PiSi spec files." -msgstr "" - -#: pisi/cli/commands.py:1007 -msgid "Do not sign index." -msgstr "" - -#: pisi/cli/commands.py:1020 -msgid "Indexing current directory." -msgstr "" - -#: pisi/cli/commands.py:1028 -msgid "" -"Print the list of all installed packages\n" -"\n" -"Usage: list-installed\n" -msgstr "" - -#: pisi/cli/commands.py:1042 -msgid "list-installed options" -msgstr "" - -#: pisi/cli/commands.py:1045 pisi/cli/commands.py:1278 -#: pisi/cli/commands.py:1342 pisi/cli/commands.py:1381 -#: pisi/cli/commands.py:1421 pisi/cli/commands.py:1555 -msgid "Show in long format" -msgstr "" - -#: pisi/cli/commands.py:1047 -msgid "List installed packages under given component" -msgstr "" - -#: pisi/cli/commands.py:1049 pisi/cli/commands.py:1425 -msgid "Show detailed install info" -msgstr "" - -#: pisi/cli/commands.py:1066 pisi/cli/commands.py:1444 -msgid "" -"Package Name |St| Version| Rel.| Build| Distro| Date" -msgstr "" - -#: pisi/cli/commands.py:1081 -msgid "" -"Rebuild Databases\n" -"\n" -"Usage: rebuilddb [ ... ]\n" -"\n" -"Rebuilds the PiSi databases\n" -"\n" -"If package specs are given, they should be the names of package\n" -"dirs under /var/lib/pisi\n" -msgstr "" - -#: pisi/cli/commands.py:1099 -msgid "rebuild-db options" -msgstr "" - -#: pisi/cli/commands.py:1102 -msgid "Rebuild files database" -msgstr "" - -#: pisi/cli/commands.py:1113 -msgid "Rebuild PiSi databases?" -msgstr "" - -#: pisi/cli/commands.py:1120 -msgid "" -"Update repository databases\n" -"\n" -"Usage: update-repo [ ... ]\n" -"\n" -": repository name\n" -"\n" -"Synchronizes the PiSi databases with the current repository.\n" -"If no repository is given, all repositories are updated.\n" -msgstr "" - -#: pisi/cli/commands.py:1138 -msgid "update-repo options" -msgstr "" - -#: pisi/cli/commands.py:1142 -msgid "Update database in any case" -msgstr "" - -#: pisi/cli/commands.py:1160 -msgid "" -"Add a repository\n" -"\n" -"Usage: add-repo \n" -"\n" -": name of repository to add\n" -": URI of index file\n" -"\n" -"If no repo is given, add-repo pardus-devel repo is added by default\n" -"\n" -"NB: We support only local files (e.g., /a/b/c) and http:// URIs at the " -"moment\n" -msgstr "" - -#: pisi/cli/commands.py:1180 -msgid "add-repo options" -msgstr "" - -#: pisi/cli/commands.py:1183 -msgid "Add repository at given position (0 is first)" -msgstr "" - -#: pisi/cli/commands.py:1197 -msgid "Update PiSi database for repository %s?" -msgstr "" - -#: pisi/cli/commands.py:1201 -msgid "%s repository could not be reached. Removing %s from system." -msgstr "" - -#: pisi/cli/commands.py:1210 -msgid "" -"Remove repositories\n" -"\n" -"Usage: remove-repo ... \n" -"\n" -"Remove all repository information from the system.\n" -msgstr "" - -#: pisi/cli/commands.py:1236 -msgid "" -"List repositories\n" -"\n" -"Usage: list-repo\n" -"\n" -"Lists currently tracked repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1259 -msgid "" -"List available packages in the repositories\n" -"\n" -"Usage: list-available [ ... repon ]\n" -"\n" -"Gives a brief list of PiSi packages published in the specified\n" -"repositories. If no repository is specified, we list packages in\n" -"all repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1276 -msgid "list-available options" -msgstr "" - -#: pisi/cli/commands.py:1280 -msgid "List available packages under given component" -msgstr "" - -#: pisi/cli/commands.py:1282 -msgid "Show uninstalled packages only" -msgstr "" - -#: pisi/cli/commands.py:1290 -msgid "Installed packages are shown in this color" -msgstr "" - -#: pisi/cli/commands.py:1298 -msgid "Repository : %s\n" -msgstr "" - -#: pisi/cli/commands.py:1325 -msgid "" -"List available components\n" -"\n" -"Usage: list-components\n" -"\n" -"Gives a brief list of PiSi components published in the\n" -"repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1340 -msgid "list-components options" -msgstr "" - -#: pisi/cli/commands.py:1365 -msgid "" -"List available sources\n" -"\n" -"Usage: list-sources\n" -"\n" -"Gives a brief list of sources published in the repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1379 -msgid "list-sources options" -msgstr "" - -#: pisi/cli/commands.py:1404 -msgid "" -"List packages to be upgraded\n" -"\n" -"Usage: list-upgrades\n" -"\n" -"Lists the packages that will be upgraded.\n" -msgstr "" - -#: pisi/cli/commands.py:1418 -msgid "list-upgrades options" -msgstr "" - -#: pisi/cli/commands.py:1423 -msgid "List upgradable packages under given component" -msgstr "" - -#: pisi/cli/commands.py:1440 pisi/operations.py:466 -msgid "No packages to upgrade." -msgstr "" - -#: pisi/cli/commands.py:1460 -msgid "" -"List pending packages\n" -"\n" -"Lists packages waiting to be configured.\n" -msgstr "" - -#: pisi/cli/commands.py:1482 -msgid "There are no packages waiting to be configured" -msgstr "" - -#: pisi/cli/commands.py:1487 -msgid "" -"Search packages\n" -"\n" -"Usage: search ... \n" -"\n" -"Finds a package containing specified search terms\n" -"in summary, description, and package name fields.\n" -msgstr "" - -#: pisi/cli/commands.py:1502 -msgid "search options" -msgstr "" - -#: pisi/cli/commands.py:1505 -msgid "Set search language" -msgstr "" - -#: pisi/cli/commands.py:1510 -msgid "Show details" -msgstr "" - -#: pisi/cli/commands.py:1530 -msgid "%s packages found" -msgstr "" - -#: pisi/cli/commands.py:1539 -msgid "" -"Search for a file\n" -"\n" -"Usage: search-file ... \n" -"\n" -"Finds the installed package which contains the specified file.\n" -msgstr "" - -#: pisi/cli/commands.py:1553 -msgid "search-file options" -msgstr "" - -#: pisi/cli/commands.py:1557 -msgid "Fuzzy search" -msgstr "" - -#: pisi/cli/commands.py:1559 -msgid "Show only package name" -msgstr "" - -#: pisi/cli/commands.py:1580 -msgid "Package %s has file %s" -msgstr "" - -#: pisi/cli/commands.py:1582 -msgid "Type: %s, Hash: %s" -msgstr "" - -#: pisi/cli/commands.py:1585 -msgid "Path '%s' does not belong to an installed package" -msgstr "" - -#: pisi/cli/commands.py:1598 -msgid "Searching for %s" -msgstr "" - -#: pisi/cli/commands.py:1608 -msgid "" -"%prog [options] [arguments]\n" -"\n" -"where is one of:\n" -"\n" -msgstr "" - -#: pisi/cli/commands.py:1614 -msgid "" -"\n" -"Use \"%prog help \" for help on a specific command.\n" -msgstr "" - -#: pisi/cli/pisicli.py:56 -msgid "Options must precede non-option arguments" -msgstr "" - -#: pisi/cli/pisicli.py:97 -msgid "No command given" -msgstr "" - -#: pisi/cli/pisicli.py:100 -msgid "Command line parsing error" -msgstr "" - -#: pisi/comariface.py:54 -msgid "cannot connect to comar" -msgstr "" - -#: pisi/comariface.py:72 -msgid "Could not restart comar" -msgstr "" - -#: pisi/comariface.py:77 -msgid "connection with comar unexpectedly closed" -msgstr "" - -#: pisi/comariface.py:90 -msgid "Configuration error: %s" -msgstr "" - -#: pisi/comariface.py:92 -msgid "Script error: %s" -msgstr "" - -#: pisi/comariface.py:94 -msgid "comar denied our access" -msgstr "" - -#: pisi/comariface.py:99 -msgid "Configuring %s package" -msgstr "" - -#: pisi/comariface.py:104 -msgid "Registering %s comar script" -msgstr "" - -#: pisi/comariface.py:110 -msgid "Calling post install handlers" -msgstr "" - -#: pisi/comariface.py:115 -msgid "Running package's post install script" -msgstr "" - -#: pisi/comariface.py:122 -msgid "Configuring %s package for removal" -msgstr "" - -#: pisi/comariface.py:125 -msgid "Running package's pre remove script" -msgstr "" - -#: pisi/comariface.py:129 -msgid "Calling pre remove handlers" -msgstr "" - -#: pisi/comariface.py:133 -msgid "Unregistering comar scripts" -msgstr "" - -#: pisi/component.py:97 pisi/component.py:103 -msgid "Component %s not found" -msgstr "" - -#: pisi/component.py:199 pisi/component.py:225 -msgid "Information for component %s not available" -msgstr "" - -#: pisi/config.py:61 -msgid "Destination directory %s does not exist. Creating it." -msgstr "" - -#: pisi/configfile.py:105 -msgid "No section by name '%s'" -msgstr "" - -#: pisi/conflict.py:39 pisi/dependency.py:40 -msgid " version >= " -msgstr "" - -#: pisi/conflict.py:41 pisi/dependency.py:42 -msgid " version <= " -msgstr "" - -#: pisi/conflict.py:43 pisi/dependency.py:44 -msgid " release >= " -msgstr "" - -#: pisi/conflict.py:45 pisi/dependency.py:46 -msgid " release <= " -msgstr "" - -#: pisi/constants.py:30 -msgid "Can't rebind constant: %s" -msgstr "" - -#: pisi/constants.py:36 -msgid "Can't unbind constant: %s" -msgstr "" - -#: pisi/dependency.py:103 -msgid "Package %s does not satisfy dependency %s" -msgstr "" - -#: pisi/dependency.py:116 -msgid "Package %s is not present in the package database" -msgstr "" - -#: pisi/fetcher.py:81 -msgid "Filename error" -msgstr "" - -#: pisi/fetcher.py:84 -msgid "Access denied to write to destination directory: \"%s\"" -msgstr "" - -#: pisi/fetcher.py:89 -msgid "Access denied to destination file: \"%s\"" -msgstr "" - -#: pisi/fetcher.py:100 -msgid "" -"A problem occured. Please check the archive address and/or permissions again." -msgstr "" - -#: pisi/fetcher.py:158 -msgid "No such file or no permission to read" -msgstr "" - -#: pisi/fetcher.py:183 -msgid "Requested range not satisfiable, starting again." -msgstr "" - -#: pisi/fetcher.py:190 -msgid "Cannot fetch %s; value error: %s" -msgstr "" - -#: pisi/fetcher.py:192 pisi/fetcher.py:194 pisi/fetcher.py:196 -msgid "Cannot fetch %s; %s" -msgstr "" - -#: pisi/fetcher.py:198 -msgid "Cannot fetch %s; (%s): %s" -msgstr "" - -#: pisi/fetcher.py:244 -msgid "Proxy configuration has been found for '%s' protocol" -msgstr "" - -#: pisi/fetcher.py:328 pisi/fetcher.py:349 pisi/fetcher.py:362 -msgid "ftp error" -msgstr "" - -#: pisi/file.py:66 -msgid "uri must have type either URI or string" -msgstr "" - -#: pisi/file.py:89 -msgid "zip compression not supported yet" -msgstr "" - -#: pisi/file.py:117 -msgid "Fetching %s" -msgstr "" - -#: pisi/file.py:122 -msgid "Copying %s to transfer dir" -msgstr "" - -#: pisi/file.py:127 -msgid "File '%s' not found." -msgstr "" - -#: pisi/file.py:135 -msgid "File integrity of %s compromised." -msgstr "" - -#: pisi/file.py:155 -msgid "File mode must be either File.read or File.write" -msgstr "" - -#: pisi/file.py:160 -msgid "Remote write not implemented" -msgstr "" - -#: pisi/file.py:187 -msgid "gzip compression not supported yet" -msgstr "" - -#: pisi/file.py:202 pisi/file.py:205 -msgid "ERROR: gpg --detach-sig %s failed" -msgstr "" - -#: pisi/graph.py:31 -msgid "Encountered cycle %s" -msgstr "" - -#: pisi/index.py:92 -msgid "Adding %s to package index" -msgstr "" - -#: pisi/index.py:95 -msgid "Adding %s to component index" -msgstr "" - -#: pisi/index.py:113 -msgid "Updating package database of %s" -msgstr "" - -#: pisi/index.py:141 -msgid "Package %s: metadata corrupt, skipping..." -msgstr "" - -#: pisi/index.py:169 -msgid "Adding %s to source index" -msgstr "" - -#: pisi/installdb.py:58 -msgid "installed" -msgstr "" - -#: pisi/installdb.py:58 -msgid "installed-pending" -msgstr "" - -#: pisi/installdb.py:59 -msgid "purged" -msgstr "" - -#: pisi/installdb.py:59 -msgid "removed" -msgstr "" - -#: pisi/installdb.py:62 -msgid "" -"State: %s\n" -"Version: %s, Release: %s, Build: %s\n" -msgstr "" - -#: pisi/installdb.py:67 -msgid "Distribution: %s, Install Time: %s\n" -msgstr "" - -#: pisi/installdb.py:154 -msgid "Already installed" -msgstr "" - -#: pisi/itembyrepodb.py:120 -msgid "Invalid repository string" -msgstr "" - -#: pisi/itembyrepodb.py:142 -msgid "Key %s not found" -msgstr "" - -#: pisi/itembyrepodb.py:152 -msgid "Key %s in repo %s not found" -msgstr "" - -#: pisi/lockeddbshelve.py:47 -msgid "Database version for %s insufficient. Please run rebuild-db command." -msgstr "" - -#: pisi/lockeddbshelve.py:51 -msgid "" -"Database version for %s greater than PiSi version. You need a newer PiSi." -msgstr "" - -#: pisi/lockeddbshelve.py:62 -msgid "Cannot attain write access to database environment" -msgstr "" - -#: pisi/lockeddbshelve.py:64 -msgid "Database version %s not present." -msgstr "" - -#: pisi/lockeddbshelve.py:71 pisi/lockeddbshelve.py:153 -msgid "" -"Another instance of PiSi is running. Only one instance is allowed to modify " -"the PiSi database at a time." -msgstr "" - -#: pisi/lockeddbshelve.py:81 -msgid "Cannot attain read access to database environment" -msgstr "" - -#: pisi/lockeddbshelve.py:95 -msgid "" -"Cannot attain write access to PiSi database. You have to be root for this " -"operation." -msgstr "" - -#: pisi/lockeddbshelve.py:113 -msgid "Cannot attain read or write access to database %s" -msgstr "" - -#: pisi/lockeddbshelve.py:139 -msgid "" -"Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" -msgstr "" - -#: pisi/metadata.py:58 -msgid "Distribution: %s, Dist. Release: %s\n" -msgstr "" - -#: pisi/metadata.py:60 -msgid "Architecture: %s, Installed Size: %s" -msgstr "" - -#: pisi/mirrors.py:46 -msgid "Mirrors file %s does not exist. Could not resolve mirrors://" -msgstr "" - -#: pisi/operations.py:114 -msgid "Mixing file names and package names not supported yet." -msgstr "" - -#: pisi/operations.py:156 -msgid "" -"The following packages will be installed\n" -"in the respective order to satisfy extra dependencies:\n" -msgstr "" - -#: pisi/operations.py:159 pisi/operations.py:621 -msgid "Do you want to continue?" -msgstr "" - -#: pisi/operations.py:160 -msgid "External dependencies not satisfied" -msgstr "" - -#: pisi/operations.py:172 pisi/operations.py:339 -msgid "No packages to install." -msgstr "" - -#: pisi/operations.py:203 -msgid "Installation order: " -msgstr "" - -#: pisi/operations.py:257 pisi/operations.py:279 -msgid "Conflicts remain" -msgstr "" - -#: pisi/operations.py:267 -msgid "Selected packages [%s] are in conflict with each other." -msgstr "" - -#: pisi/operations.py:273 -msgid "[%s conflicts with: %s]\n" -msgstr "" - -#: pisi/operations.py:275 -msgid "" -"The following packages have conflicts:\n" -"%s" -msgstr "" - -#: pisi/operations.py:278 -msgid "Remove the following conflicting packages?" -msgstr "" - -#: pisi/operations.py:305 -msgid "Safety switch: Following packages in system.base will be installed: " -msgstr "" - -#: pisi/operations.py:311 -msgid "Safety switch: Following packages in system.base will be upgraded: " -msgstr "" - -#: pisi/operations.py:317 pisi/operations.py:597 -msgid "Safety switch: the component system.base cannot be found" -msgstr "" - -#: pisi/operations.py:334 -msgid "" -"The following package(s) are already installed and are not going to be " -"installed again:\n" -msgstr "" - -#: pisi/operations.py:355 -msgid "" -"Following packages will be installed in the respective order to satisfy " -"dependencies:\n" -msgstr "" - -#: pisi/operations.py:360 pisi/operations.py:491 -msgid "Total size of package(s): %.2f %s" -msgstr "" - -#: pisi/operations.py:366 pisi/operations.py:497 pisi/operations.py:709 -msgid "There are extra packages due to dependencies. Do you want to continue?" -msgstr "" - -#: pisi/operations.py:432 -msgid "Warning: package *name* ends with '.pisi'" -msgstr "" - -#: pisi/operations.py:435 -msgid "Package %s is not installed." -msgstr "" - -#: pisi/operations.py:441 -msgid "Package %s is not available in repositories." -msgstr "" - -#: pisi/operations.py:453 -msgid "Package %s is already at the latest release %s." -msgstr "" - -#: pisi/operations.py:459 -msgid "Package %s is already at the latest build %s." -msgstr "" - -#: pisi/operations.py:486 -msgid "The following packages will be upgraded: " -msgstr "" - -#: pisi/operations.py:552 -msgid "Dependency %s of %s cannot be satisfied" -msgstr "" - -#: pisi/operations.py:553 -msgid "Upgrade is not possible." -msgstr "" - -#: pisi/operations.py:568 -msgid "Reverse dependency %s of %s cannot be satisfied" -msgstr "" - -#: pisi/operations.py:593 -msgid "Safety switch: cannot remove the following packages in system.base: " -msgstr "" - -#: pisi/operations.py:604 -msgid "Package %s does not exist. Cannot remove." -msgstr "" - -#: pisi/operations.py:608 -msgid "No packages to remove." -msgstr "" - -#: pisi/operations.py:617 -msgid "" -"The following minimal list of packages will be removed\n" -"in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:622 -msgid "Package removal declined" -msgstr "" - -#: pisi/operations.py:634 -msgid "Package %s is not installed. Cannot remove." -msgstr "" - -#: pisi/operations.py:683 -msgid "No packages to emerge." -msgstr "" - -#: pisi/operations.py:698 -msgid "" -"The following minimal list of packages will be installed\n" -"from repository in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:701 -msgid "" -"The following minimal list of packages will be built and\n" -"installed in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:743 -msgid "Cannot find source package: %s" -msgstr "" - -#: pisi/package.py:56 -msgid "" -"There was a problem while fetching '%s'.\n" -"The package may have been upgraded. Please try to upgrade the package." -msgstr "" - -#: pisi/package.py:60 pisi/sourcearchive.py:94 -msgid "%s [cached]" -msgstr "" - -#: pisi/package.py:131 -msgid "MetaData format wrong" -msgstr "" - -#: pisi/packagedb.py:66 -msgid "Package %s not found" -msgstr "" - -#: pisi/pxml/autoxml.py:77 -msgid "At least one '%s' tag should have local text" -msgstr "" - -#: pisi/pxml/autoxml.py:84 -msgid "'%s' language of tag '%s' is empty" -msgstr "" - -#: pisi/pxml/autoxml.py:112 -msgid "LocalText: unable to get either current or default locale" -msgstr "" - -#: pisi/pxml/autoxml.py:118 pisi/pxml/autoxml.py:133 -msgid "" -"Tag should have at least the current locale, or failing that an English or " -"Turkish version" -msgstr "" - -#: pisi/pxml/autoxml.py:368 -msgid "autoxml.check: '%s' errors" -msgstr "" - -#: pisi/pxml/autoxml.py:423 pisi/pxml/autoxml.py:433 -msgid "autoxml.parse: String '%s' has errors" -msgstr "" - -#: pisi/pxml/autoxml.py:443 pisi/pxml/autoxml.py:453 -msgid "autoxml.read: File '%s' has errors" -msgstr "" - -#: pisi/pxml/autoxml.py:461 -msgid "autoxml.write: object validation has failed" -msgstr "" - -#: pisi/pxml/autoxml.py:469 -msgid "autoxml.write: File encoding '%s' has errors" -msgstr "" - -#: pisi/pxml/autoxml.py:519 -msgid "gen_tag: unrecognized tag type %s in spec" -msgstr "" - -#: pisi/pxml/autoxml.py:567 pisi/pxml/autoxml.py:578 -msgid "Mandatory variable %s not available" -msgstr "" - -#: pisi/pxml/autoxml.py:648 -msgid "Type mismatch: read text cannot be decoded" -msgstr "" - -#: pisi/pxml/autoxml.py:652 pisi/pxml/autoxml.py:661 -msgid "Mandatory token %s not available" -msgstr "" - -#: pisi/pxml/autoxml.py:666 -msgid "Type mismatch. Expected %s, got %s" -msgstr "" - -#: pisi/pxml/autoxml.py:696 pisi/pxml/autoxml.py:812 -msgid "Type mismatch: DOM cannot be decoded" -msgstr "" - -#: pisi/pxml/autoxml.py:699 pisi/pxml/autoxml.py:715 pisi/pxml/autoxml.py:725 -#: pisi/pxml/autoxml.py:815 pisi/pxml/autoxml.py:829 pisi/pxml/autoxml.py:839 -msgid "Mandatory argument not available" -msgstr "" - -#: pisi/pxml/autoxml.py:712 pisi/pxml/autoxml.py:826 -msgid "Object cannot be encoded" -msgstr "" - -#: pisi/pxml/autoxml.py:737 -msgid "List type must contain only one element" -msgstr "" - -#: pisi/pxml/autoxml.py:750 pisi/pxml/autoxml.py:771 -msgid "Mandatory list \"%s\" under \"%s\" node is empty." -msgstr "" - -#: pisi/pxml/xmlext.py:79 -msgid "getNodeText: Expected text node, got something else!" -msgstr "" - -#: pisi/pxml/xmlfile.py:64 -msgid "String '%s' has invalid XML" -msgstr "" - -#: pisi/pxml/xmlfile.py:72 pisi/pxml/xmlfile.py:87 -msgid "File '%s' has invalid XML" -msgstr "" - -#: pisi/repodb.py:74 -msgid "No repository named %s exists" -msgstr "" - -#: pisi/repodb.py:83 -msgid "Repository %s already exists" -msgstr "" - -#: pisi/repodb.py:90 -msgid "Cannot add repository at position %s" -msgstr "" - -#: pisi/scenarioapi/package.py:67 -msgid "No pisi package: %s* found." -msgstr "" - -#: pisi/scenarioapi/repoops.py:28 -msgid "Repo already has package named %s." -msgstr "" - -#: pisi/scenarioapi/repoops.py:52 pisi/scenarioapi/repoops.py:59 -msgid "Repo does not have package named %s." -msgstr "" - -#: pisi/sourcearchive.py:63 -msgid "Trying fallback address: %s" -msgstr "" - -#: pisi/sourcearchive.py:74 -msgid "%s mirrors are not defined." -msgstr "" - -#: pisi/sourcearchive.py:79 -msgid "Fetching source from mirror: %s" -msgstr "" - -#: pisi/sourcearchive.py:85 -msgid "Could not fetch source from %s mirrors." -msgstr "" - -#: pisi/sourcearchive.py:103 -msgid "unpack: check_file_hash failed" -msgstr "" - -#: pisi/sourcedb.py:59 pisi/sourcedb.py:65 -msgid "Source package %s not found" -msgstr "" - -#: pisi/specfile.py:141 -msgid "URI: %s, type: %s, sha1sum: %s" -msgstr "" - -#: pisi/specfile.py:208 -msgid "Name: %s, version: %s, release: %s, build %s\n" -msgstr "" - -#: pisi/specfile.py:210 -msgid "Summary: %s\n" -msgstr "" - -#: pisi/specfile.py:211 -msgid "Description: %s\n" -msgstr "" - -#: pisi/specfile.py:212 -msgid "Component: %s\n" -msgstr "" - -#: pisi/specfile.py:213 -msgid "Provides: " -msgstr "" - -#: pisi/specfile.py:217 -msgid "Dependencies: " -msgstr "" - -#: pisi/uri.py:80 -msgid "setAuthInfo needs a tuple (user, pass)" -msgstr "" - -#: pisi/util.py:122 pisi/util.py:143 -msgid "Running " -msgstr "" - -#: pisi/util.py:126 pisi/util.py:161 -msgid "return value for \"%s\" is %s" -msgstr "" - -#: pisi/util.py:364 -msgid "Including external link '%s'" -msgstr "" - -#: pisi/util.py:366 -msgid "Including directory '%s'" -msgstr "" - -#: pisi/util.py:440 -msgid "I/O Error: Cannot calculate SHA1 hash of %s" -msgstr "" - -#: pisi/util.py:451 -msgid "Cannot calculate SHA1 hash of given data" -msgstr "" - -#: pisi/util.py:488 -msgid "ERROR: patch (%s) failed" -msgstr "" - -#: pisi/util.py:490 -msgid "ERROR: patch (%s) failed: %s" -msgstr "" - -#: pisi/util.py:536 -msgid "strip command failed for file '%s'!" -msgstr "" - -#: pisi/util.py:543 -msgid "objcopy (keep-debug) command failed for file '%s'!" -msgstr "" - -#: pisi/util.py:549 -msgid "objcopy (add-debuglink) command failed for file '%s'!" -msgstr "" - -#: pisi/util.py:610 -msgid "Updating environment..." -msgstr "" - -#: scripts/repostats.py:361 -msgid "" -"Duplicate binary packages:\n" -"%s\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:366 -msgid "Unknown file type '%s' in package '%s'" -msgstr "" - -#: scripts/repostats.py:422 -msgid "" -"Duplicate source packages:\n" -"%s\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:442 -msgid "Source package '%s' has wrong date format '%s'" -msgstr "" - -#: scripts/repostats.py:481 -msgid "" -"Developer '%s <%s>' has another mail address '%s' in source package '%s'" -msgstr "" - -#: scripts/repostats.py:564 -msgid "" -"Cannot parse '%s':\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:642 -msgid "Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n" -msgstr "" - -#: scripts/repostats.py:643 -msgid "Dont generate the web site.\n" -msgstr "" - -#: scripts/repostats.py:664 -msgid "Scanning source repository...\n" -msgstr "" - -#: scripts/repostats.py:668 -msgid "Scanning binary packages...\n" -msgstr "" - -#: scripts/repostats.py:673 -msgid "Encountered %d errors! Fix them immediately!\n" -msgstr "" - -#: scripts/repostats.py:681 -msgid "These dependencies are not available in repository:\n" -msgstr "" diff --git a/tags/pisi-1.1_rc10/po/es.po b/tags/pisi-1.1_rc10/po/es.po deleted file mode 100644 index 643a3231..00000000 --- a/tags/pisi-1.1_rc10/po/es.po +++ /dev/null @@ -1,3088 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: pisi\n" -"POT-Creation-Date: 2006-12-08 21:29+EET\n" -"PO-Revision-Date: 2006-12-01 00:18-0400\n" -"Last-Translator: Klemens Häckel \n" -"Language-Team: es \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - -#: /usr/lib/python2.4/optparse.py:1 -msgid "" -"optparse - a powerful, extensible, and easy-to-use option parser.\n" -"\n" -"By Greg Ward \n" -"\n" -"Originally distributed as Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"If you have problems with this module, please do not file bugs,\n" -"patches, or feature requests with Python; instead, use Optik's\n" -"SourceForge project page:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"For support, use the optik-users@lists.sourceforge.net mailing list\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" -msgstr "" -"optparse - un parser de opciones, fácil de usar pero potente y ampliable.\n" -"\n" -"Por Greg Ward \n" -"\n" -"Distribuido originalmente como Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"Si tiene problemas con éste módulo, favor no envie reportes de fallas,\n" -"parches, o propuestas de mejora con Python; en su lugar use la página \n" -"del proyecto Optik en SourceForge:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"Para soporte use la lista de correo optik-users@lists.sourceforge.net\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" - -#: /usr/lib/python2.4/optparse.py:93 -msgid "" -"\n" -" Raised if an Option instance is created with invalid or\n" -" inconsistent arguments.\n" -" " -msgstr "" -"\n" -" Producido si una instancia de Option es creada con argumentos\n" -" inválidos o inconsistentes.\n" -" " - -#: /usr/lib/python2.4/optparse.py:109 -msgid "" -"\n" -" Raised if conflicting options are added to an OptionParser.\n" -" " -msgstr "" -"\n" -" Producido si al OptionParser se agregan opciones conflictivos.\n" -" " - -#: /usr/lib/python2.4/optparse.py:114 -msgid "" -"\n" -" Raised if an invalid option value is encountered on the command\n" -" line.\n" -" " -msgstr "" -"\n" -" Producido si se encuentra una opcón inválida en la línea\n" -" de comando.\n" -" " - -#: /usr/lib/python2.4/optparse.py:120 -msgid "" -"\n" -" Raised if an invalid or ambiguous option is seen on the command-line.\n" -" " -msgstr "" -"\n" -" Producido si se encuentra una opcón inválida o ambígua en \n" -" la línea de comando.\n" -" " - -#: /usr/lib/python2.4/optparse.py:298 pisi/cli/commands.py:50 -msgid "Return a comma-separated list of option strings & metavariables." -msgstr "" -"Devuelve una lista, separado por comas de cadenas de opción & variables meta." - -#: /usr/lib/python2.4/optparse.py:317 -msgid "" -"Format help with indented section bodies.\n" -" " -msgstr "" -"Ayuda de formato con indentación de secciones.\n" -" " - -#: /usr/lib/python2.4/optparse.py:329 pisi/cli/commands.py:44 -msgid "usage: %s\n" -msgstr "uso: %s\n" - -#: /usr/lib/python2.4/optparse.py:336 -msgid "" -"Format help with underlined section headers.\n" -" " -msgstr "" -"Ayuda de formato con cabeceras subrayadas de secciones.\n" -" " - -#: /usr/lib/python2.4/optparse.py:348 -msgid "Usage" -msgstr "Uso" - -#: /usr/lib/python2.4/optparse.py:354 -msgid "integer" -msgstr "integer" - -#: /usr/lib/python2.4/optparse.py:355 -msgid "long integer" -msgstr "long integer" - -#: /usr/lib/python2.4/optparse.py:356 -msgid "floating-point" -msgstr "punto-flotante" - -#: /usr/lib/python2.4/optparse.py:357 -msgid "complex" -msgstr "complejo" - -#: /usr/lib/python2.4/optparse.py:365 -msgid "option %s: invalid %s value: %r" -msgstr "opción %s: inválido %s valor: %r" - -#: /usr/lib/python2.4/optparse.py:373 -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "opción %s: elección inválida: %r (seleccione de %s)" - -#: /usr/lib/python2.4/optparse.py:382 -msgid "" -"\n" -" Instance attributes:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " -msgstr "" -"\n" -" Atributos de Instancias:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " - -# "keys" in which sense ? -#: /usr/lib/python2.4/optparse.py:781 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary, but only\n" -" use keys from dict that already have a corresponding attribute\n" -" in self. Any keys in dict without a corresponding attribute\n" -" are silently ignored.\n" -" " -msgstr "" -"\n" -" Actualize los valores de opciones de cualquier diccionario, pero " -"solamente\n" -" use teclas del dict que ya tienen un atributo correspondiente\n" -" en si mismo. Cualquier tecla en dict sin atributo correspondiente " -"se \n" -" va a ignorar silenciosamante.\n" -" " - -#: /usr/lib/python2.4/optparse.py:794 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary,\n" -" using all keys from the dictionary regardless of whether\n" -" they have a corresponding attribute in self or not.\n" -" " -msgstr "" -"\n" -" Actualize los valores de opciones de cualquier diccionario, \n" -" usando todas las teclas del diccionario sin importar si \n" -" tienen un atributo correspondiente en si mismo o no.\n" -" " - -#: /usr/lib/python2.4/optparse.py:926 -msgid "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " -msgstr "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " - -#: /usr/lib/python2.4/optparse.py:1138 -msgid "show this help message and exit" -msgstr "Mostrar este mensaje de ayuda y salir" - -#: /usr/lib/python2.4/optparse.py:1143 -msgid "show program's version number and exit" -msgstr "Mostrar número de versión del programa y salir" - -#: /usr/lib/python2.4/optparse.py:1166 -msgid "%prog [options]" -msgstr "%prog [opciones]" - -#: /usr/lib/python2.4/optparse.py:1246 -msgid "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse the command-line options found in 'args' (default:\n" -" sys.argv[1:]). Any errors result in a call to 'error()', which\n" -" by default prints the usage message to stderr and calls\n" -" sys.exit() with an error message. On success returns a pair\n" -" (values, args) where 'values' is an Values instance (with all\n" -" your option values) and 'args' is the list of arguments left\n" -" over after parsing options.\n" -" " -msgstr "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse las opciones de línea de comando encontrados en " -"'args' (default:\n" -" sys.argv[1:]). Cualquier error produce una llamada a 'error()', " -"que\n" -" por defecto imprime el mensaje de uso a la salida stderr y llama\n" -" sys.exit() con un mensaje de error. Si exitoso devuelve un par\n" -" (values, args) donde 'values' es una instalcia de Values (con todos\n" -" los valores de tus opciones) y 'args' es la lista de argumentos que " -"quedan\n" -" luego de parsear las opciones.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1285 -msgid "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Check that the supplied option values and leftover arguments are\n" -" valid. Returns the option values and leftover arguments\n" -" (possibly adjusted, possibly completely new -- whatever you\n" -" like). Default implementation just returns the passed-in\n" -" values; subclasses may override as desired.\n" -" " -msgstr "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Verifica la válidez de los valores de las opciones indicadas y de " -"los\n" -" argumentos sobrantes. Devuelve los valores de opcioines y argumentos " -"sobrantes\n" -" (posiblemente corregidos, posiblemente completamente nuevo -- como " -"te parezca\n" -" mejor). La implementación por defecto simplemente devuelve los " -"valores que se\n" -" le pasaron; subclases pueden sobreescribir como deseado.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1298 -msgid "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Process command-line arguments and populate 'values', consuming\n" -" options and arguments from 'rargs'. If 'allow_interspersed_args' " -"is\n" -" false, stop at the first non-option argument. If true, accumulate " -"any\n" -" interspersed non-option arguments in 'largs'.\n" -" " -msgstr "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Procesa argumentos de línea de comando y popula 'values', " -"consumando\n" -" opciones y argumentos dr 'rargs'. Si 'allow_interspersed_args' es\n" -" falso, para con el primer argumento que no es una opción. Si " -"verdadero, acumula los\n" -" argumentos entremedios que no son opciones en 'largs'.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1349 -msgid "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determine which long option string 'opt' matches, ie. which one\n" -" it is an unambiguous abbrevation for. Raises BadOptionError if\n" -" 'opt' doesn't unambiguously match any long option string.\n" -" " -msgstr "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determina con cual opción larga concuerda la cadena 'opt', o sea " -"que, para cual\n" -" de ellos es una abreviatura no ambigua. Produce BadOptionError si\n" -" 'opt' no coincide de manera no-ambigua con uno de las opciones de " -"long string.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1376 /usr/lib/python2.4/optparse.py:1415 -msgid "%s option requires an argument" -msgstr "%s opción requiere un argumento" - -#: /usr/lib/python2.4/optparse.py:1378 /usr/lib/python2.4/optparse.py:1417 -msgid "%s option requires %d arguments" -msgstr "%s opción require %d argumentos" - -#: /usr/lib/python2.4/optparse.py:1387 -msgid "%s option does not take a value" -msgstr "%s opción no toma un valor" - -#: /usr/lib/python2.4/optparse.py:1404 /usr/lib/python2.4/optparse.py:1558 -msgid "no such option: %s" -msgstr "no existe la opción: %s" - -#: /usr/lib/python2.4/optparse.py:1454 -msgid "" -"error(msg : string)\n" -"\n" -" Print a usage message incorporating 'msg' to stderr and exit.\n" -" If you override this in a subclass, it should not return -- it\n" -" should either exit or raise an exception.\n" -" " -msgstr "" -"error(msg : string)\n" -"\n" -" Imprime un mensaje de uso incluyendo 'msg' hacia la salida stderr y " -"salir.\n" -" Si lo sobreescribís en una subclase no debería retornar -- \n" -" debería o salir o producir una excepción.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1471 -msgid "" -"print_usage(file : file = stdout)\n" -"\n" -" Print the usage message for the current program (self.usage) to\n" -" 'file' (default stdout). Any occurence of the string \"%prog\" in\n" -" self.usage is replaced with the name of the current program\n" -" (basename of sys.argv[0]). Does nothing if self.usage is empty\n" -" or not defined.\n" -" " -msgstr "" -"print_usage(file : file = stdout)\n" -"\n" -" Imprime el mensaje de uso parra el programa actual (self.usage) a\n" -" 'file' (por defecto stdout). Cualquier ocurrencia de la cadena \"%" -"prog\" en\n" -" self.usage es reemplazado por el nombre del programa actual\n" -" (nombre de base de sys.argv[0]). No hace nada si self.usage es " -"vacío\n" -" o no definido.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1489 -msgid "" -"print_version(file : file = stdout)\n" -"\n" -" Print the version message for this program (self.version) to\n" -" 'file' (default stdout). As with print_usage(), any occurence\n" -" of \"%prog\" in self.version is replaced by the current program's\n" -" name. Does nothing if self.version is empty or undefined.\n" -" " -msgstr "" -"print_version(file : file = stdout)\n" -"\n" -" Imprime el mensaje de versión del programa actual (self.version) a\n" -" 'file' (por defecto a stdout). Como print_usage(), cualquier " -"occurencia\n" -" de \"%prog\" en self.version es reemplazado por el nombre del " -"programa\n" -" actual. No hace nada si self.version es vacío o no definido.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1504 -msgid "options" -msgstr "opciones" - -#: /usr/lib/python2.4/optparse.py:1528 -msgid "" -"print_help(file : file = stdout)\n" -"\n" -" Print an extended help message, listing all options and any\n" -" help text provided with them, to 'file' (default stdout).\n" -" " -msgstr "" -"print_help(file : file = stdout)\n" -"\n" -" Imprime un mensaje extendido de ayuda, listando todas las opciones " -"y\n" -" los textos de ayuda que viene juntos con ellos, a 'file' (por " -"defecto a stdout).\n" -" " - -#: /usr/lib/python2.4/optparse.py:1541 -msgid "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Return the string key in 'wordmap' for which 's' is an unambiguous\n" -" abbreviation. If 's' is found to be ambiguous or doesn't match any of\n" -" 'words', raise BadOptionError.\n" -" " -msgstr "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Devuelve la cadena clave en 'wordmap' para la cual 's' es una " -"abreviatura\n" -" no-ambigua. Si 's' resulta ser ambiguoo no concuerda con ninguno de " -"las\n" -" 'palabras', produce BadOptionError.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1562 -msgid "ambiguous option: %s (%s?)" -msgstr "opción ambigua: %s (%s?)" - -#: pisi-cli:46 -msgid "Keyboard Interrupt: Exiting..." -msgstr "Interrupción de teclado: Saliendo..." - -#: pisi-cli:49 -msgid "Program Terminated." -msgstr "Programa terminado." - -#: pisi-cli:52 -msgid "" -"A database operation has been aborted. You should run pisi\n" -"again for normal DB recovery procedure. Make sure you have free disk " -"space. \n" -"You have to run rebuild-db only when there is file corruption and database " -"upgrades." -msgstr "" -"Una operación de base de datos fue abortada. Deberías ejecutar pisi\n" -"de nuevo para el procedimiento de recuperación normal de DB. Aseguráte de \n" -"tener suficiente espacio libre en disco. Debes ejecutar rebuild-db " -"solemente\n" -"en caso de corripción de archivos y para actualización de base de datos" - -#: pisi-cli:57 -msgid "" -"Unhandled internal exception.\n" -"Please file a bug report. (http://bugs.uludag.org.tr)" -msgstr "" -"Excepción interna no previsto.\n" -"Favor envie un reporte de la falla. (http://bugs.uludag.org.tr)" - -#: pisi-cli:63 -msgid "System Error. Program Terminated." -msgstr "Error de sistema. Programa terminado." - -#: pisi-cli:70 -msgid "Please use 'pisi help' for general help." -msgstr "Favor use 'pisi help' para ayuda general." - -#: pisi-cli:73 -msgid "Traceback:" -msgstr "Traceback:" - -#: pisi-cli:77 -msgid "Use --debug to see a traceback." -msgstr "Use --debug para ver traceback." - -#: pisi/actionsapi/autotools.py:36 -msgid "" -"Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" -"Favor anexe config.log al reporte de falla:\n" -"%s/config.log" - -#: pisi/actionsapi/autotools.py:75 pisi/actionsapi/autotools.py:85 -#: pisi/actionsapi/kde.py:65 pisi/actionsapi/perlmodules.py:54 -#: pisi/actionsapi/perlmodules.py:57 -msgid "Configure failed." -msgstr "Falló Configure." - -#: pisi/actionsapi/autotools.py:77 pisi/actionsapi/autotools.py:87 -#: pisi/actionsapi/kde.py:67 -msgid "No configure script found." -msgstr "Script de configuración no encontrado." - -#: pisi/actionsapi/autotools.py:96 pisi/actionsapi/kde.py:72 -#: pisi/actionsapi/perlmodules.py:63 pisi/actionsapi/perlmodules.py:72 -#: pisi/actionsapi/pythonmodules.py:49 pisi/actionsapi/scons.py:39 -msgid "Make failed." -msgstr "Falló Make." - -#: pisi/actionsapi/autotools.py:124 pisi/actionsapi/autotools.py:134 -#: pisi/actionsapi/kde.py:79 pisi/actionsapi/pythonmodules.py:54 -#: pisi/actionsapi/scons.py:43 -msgid "Install failed." -msgstr "Falló Install" - -#: pisi/actionsapi/autotools.py:126 pisi/actionsapi/autotools.py:136 -#: pisi/actionsapi/kde.py:81 -msgid "No Makefile found." -msgstr "Archivo para 'make' no encontrado." - -#: pisi/actionsapi/autotools.py:143 -msgid "Running aclocal failed." -msgstr "Falló ejecución de aclocal." - -#: pisi/actionsapi/autotools.py:148 -msgid "Running autoconf failed." -msgstr "Falló ejecución de autoconfl." - -#: pisi/actionsapi/autotools.py:153 -msgid "Running autoreconf failed." -msgstr "Falló ejecución de autoreconf." - -#: pisi/actionsapi/autotools.py:158 -msgid "Running automake failed." -msgstr "Falló ejecución de automakel." - -#: pisi/actionsapi/autotools.py:163 -msgid "Running autoheader failed." -msgstr "Falló ejecución de autoheaderl." - -#: pisi/actionsapi/get.py:163 -msgid "Util %s cannot be found" -msgstr "Utilidad %s no se puede encontrar" - -# what is the context of this ? -#: pisi/actionsapi/get.py:165 -msgid "Warning: %s does not exist, using plain name %s" -msgstr "Alerta: %s no existe, usando nombre simple %s" - -#: pisi/actionsapi/kde.py:34 -msgid "" -"\n" -"!!! Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" -"\n" -"!!! Favor anexe config.log al reporte de falla:\n" -"%s/config.log" - -#: pisi/actionsapi/libtools.py:38 -msgid "Running ldconfig failed." -msgstr "Falló ejecución de ldconfig" - -#: pisi/actionsapi/libtools.py:49 -msgid "GNU Config Update Finished." -msgstr "Actualización de Configuración GNU terminado." - -#: pisi/actionsapi/libtools.py:53 -msgid "Running libtoolize failed." -msgstr "Falló ejecución de libtoolize " - -#: pisi/actionsapi/perlmodules.py:66 -msgid "perl build failed." -msgstr "falló perl build" - -#: pisi/actionsapi/perlmodules.py:75 -msgid "perl install failed." -msgstr "falló perl install" - -#: pisi/actionsapi/pisitools.py:126 -msgid "ActionsAPI [doman]: Wrong man page file: %s" -msgstr "ActionsAPI [doman]: Archivo página man equivocado: %s" - -#: pisi/actionsapi/pisitools.py:164 -msgid "ActionsAPI [rename]: No such file or directory: %s" -msgstr "ActionsAPI [rename]: No existe archivo o directorio: %s" - -#: pisi/actionsapi/pisitools.py:181 -msgid "File does not exist or permission denied: %s" -msgstr "Archivo no existe o permiso denegado: %s" - -#: pisi/actionsapi/pisitools.py:198 -msgid "ActionsAPI [dosym]: File exists: %s" -msgstr "ActionsAPI [dosym]: Archivo existe: %s" - -#: pisi/actionsapi/pisitoolsfunctions.py:45 -#: pisi/actionsapi/pisitoolsfunctions.py:59 -#: pisi/actionsapi/pisitoolsfunctions.py:72 -msgid "Insufficient arguments." -msgstr "Argumentos insuficientes." - -#: pisi/actionsapi/pythonmodules.py:66 -msgid "Running %s failed." -msgstr "Ejecución de %s falló." - -#: pisi/actionsapi/shelltools.py:49 -msgid "Cannot create directory %s" -msgstr "No posible crear carpeta %s" - -#: pisi/actionsapi/shelltools.py:57 -msgid "ActionsAPI [echo]: Can't append to file %s." -msgstr "ActionsAPI [echo]: No posible anexar a archivo %s." - -#: pisi/actionsapi/shelltools.py:66 -msgid "ActionsAPI [chmod]: Operation not permitted: %s (mode: %s)" -msgstr "ActionsAPI [chmod]: Operación no permitida: %s (mode: %s)" - -#: pisi/actionsapi/shelltools.py:69 -msgid "ActionsAPI [chmod]: File %s doesn't exists." -msgstr "ActionsAPI [chmod]: Archivo %s no existe." - -#: pisi/actionsapi/shelltools.py:77 -msgid "ActionsAPI [chown]: Operation not permitted: %s (uid: %s, gid: %s)" -msgstr "ActionsAPI [chown]: Operación no permitida: %s (uid: %s, gid: %s)" - -#: pisi/actionsapi/shelltools.py:80 -msgid "ActionsAPI [chown]: File %s doesn't exists." -msgstr "ActionsAPI [chown]: Archivo %s no existe." - -#: pisi/actionsapi/shelltools.py:87 -msgid "ActionsAPI [sym]: Permission denied: %s to %s" -msgstr "ActionsAPI [sym]: Permiso denegado: %s a %s" - -#: pisi/actionsapi/shelltools.py:95 -msgid "ActionsAPI [unlink]: Permission denied: %s." -msgstr "ActionsAPI [unlink]: Permiso denegado: %s." - -#: pisi/actionsapi/shelltools.py:99 -msgid "ActionsAPI [unlink]: File %s doesn't exists." -msgstr "ActionsAPI [unlink]: Archivo %s no existe." - -#: pisi/actionsapi/shelltools.py:107 -msgid "ActionsAPI [unlinkDir]: Operation not permitted: %s" -msgstr "ActionsAPI [unlinkDir]: Operación no permitida: %s" - -#: pisi/actionsapi/shelltools.py:111 -msgid "ActionsAPI [unlinkDir]: Directory %s doesn't exists." -msgstr "ActionsAPI [unlinkDir]: Carpeta %s no existe." - -#: pisi/actionsapi/shelltools.py:120 -msgid "ActionsAPI [move]: Permission denied: %s to %s" -msgstr "ActionsAPI [move]: Permiso denegado: %s to %s" - -#: pisi/actionsapi/shelltools.py:122 -msgid "ActionsAPI [move]: File %s doesn't exists." -msgstr "ActionsAPI [move]: Archivo %s no existe." - -#: pisi/actionsapi/shelltools.py:132 -msgid "ActionsAPI [copy]: Permission denied: %s to %s" -msgstr "ActionsAPI [copy]: Permiso denegado: %s a %s" - -#: pisi/actionsapi/shelltools.py:148 -msgid "ActionsAPI [copy]: File %s does not exist." -msgstr "ActionsAPI [copy]: Archivo %s no existe." - -#: pisi/actionsapi/shelltools.py:163 -msgid "ActionsAPI [copytree] %s to %s: %s" -msgstr "ActionsAPI [copytree] %s a %s: %s" - -#: pisi/actionsapi/shelltools.py:165 -msgid "ActionsAPI [copytree]: Directory %s doesn't exists." -msgstr "ActionsAPI [copytree]: Carpeta %s no existe." - -#: pisi/actionsapi/shelltools.py:177 -msgid "ActionsAPI [touch]: Permission denied: %s" -msgstr "ActionsAPI [touch]: Permiso denegado: %s" - -#: pisi/api.py:302 pisi/comariface.py:30 -msgid "comar package is not fully installed" -msgstr "paquete comar no está instalado completamente" - -#: pisi/api.py:314 -msgid "File %s not found" -msgstr "Archivo %s no encontrado" - -#: pisi/api.py:375 -msgid "Checking /%s " -msgstr "Verificando /%s " - -#: pisi/api.py:379 -msgid "" -"\n" -"Corrupt file: %s" -msgstr "" -"\n" -"Archivo corrupto: %s" - -#: pisi/api.py:381 pisi/cli/commands.py:966 -msgid "OK" -msgstr "OK" - -#: pisi/api.py:394 -msgid "* Building index of PiSi files under %s" -msgstr "* Generando índice de archivos de PiSi en %s" - -#: pisi/api.py:401 -msgid "* Index file written" -msgstr "* Archivo de índice grabado" - -#: pisi/api.py:405 -msgid "Repo %s already present." -msgstr "Repo %s ya presente." - -#: pisi/api.py:409 -msgid "Repo %s added to system." -msgstr "Repo %s agregado al sistema." - -#: pisi/api.py:415 -msgid "Repo %s removed from system." -msgstr "Repo %s removido del sistema." - -#: pisi/api.py:417 -msgid "Repository %s does not exist. Cannot remove." -msgstr "Repositorio %s no existe. No posible remover." - -#: pisi/api.py:424 -msgid "* Updating repository: %s" -msgstr "* Actualizando repositorio: %s" - -#: pisi/api.py:432 -msgid "No updates available for repository %s." -msgstr "No hay actualizaciones disponibles pararepositorio %s." - -# what do You mean here with "at any rate" ? -#: pisi/api.py:434 -msgid "Updating database at any rate as requested" -msgstr "Actualizando base de datos según solicitado" - -#: pisi/api.py:445 -msgid "* Package database updated." -msgstr "* Base de datos de paquetes actualizado." - -#: pisi/api.py:447 pisi/api.py:472 -msgid "No repository named %s found." -msgstr "No se encontró repositorio con nombre %s." - -#: pisi/api.py:455 -msgid "* Rebuilding '%s' named repo... " -msgstr "* Regenerando repo de nombre '%s' ... " - -#: pisi/api.py:468 -msgid "Input/Output error while reading %s: %s" -msgstr "Error de Input/Output al leer %s: %s" - -#: pisi/api.py:525 -msgid "Rebuilding package database" -msgstr "egenerando base de datos de paquetes" - -#: pisi/archive.py:36 -msgid "" -"An error has occured while running LZMA:\n" -"%s" -msgstr "" -"Ocurrió un error al ejecutar LZMA:\n" -"%s" - -#: pisi/archive.py:101 pisi/archive.py:161 -msgid "Archive type not recognized" -msgstr "Tipo de archivo desconocido" - -#: pisi/atomicoperations.py:66 -msgid "Package %s found in repository %s" -msgstr "Paquete %s encontrado en repositorio %s" - -#: pisi/atomicoperations.py:78 -msgid "Package URI: %s" -msgstr "URI de paquete: %s" - -#: pisi/atomicoperations.py:82 -msgid "Package %s not found in any active repository." -msgstr "Paquete %s no encontrado en ningun repositorio activo." - -#: pisi/atomicoperations.py:101 -msgid "Installing %s, version %s, release %s, build %s" -msgstr "Instando %s, versión %s, release %s, build %s" - -#: pisi/atomicoperations.py:146 -msgid "Dependencies for %s not satisfied" -msgstr "Dependencias para %s no se pueden cumplir" - -#: pisi/atomicoperations.py:148 -msgid "Package not installable" -msgstr "No posible instalar paquete" - -# check this ?? - probably ok, but see the context -#: pisi/atomicoperations.py:166 -msgid "/%s from %s package\n" -msgstr "/%s de paquete %s\n" - -#: pisi/atomicoperations.py:167 -msgid "" -"File conflicts:\n" -"%s" -msgstr "" -"Archivo conflilcta:\n" -"%s" - -#: pisi/atomicoperations.py:202 -msgid "Re-install same version package?" -msgstr "Reinstalar el paquete de la misma versión ?" - -#: pisi/atomicoperations.py:203 -msgid "Package re-install declined" -msgstr "Reinstalación de paquete rechazado" - -#: pisi/atomicoperations.py:209 -msgid "Upgrading to new upstream version" -msgstr "Actualizando a nueva versión upstream" - -#: pisi/atomicoperations.py:212 -msgid "Upgrading to new distribution release" -msgstr "Actualización a nueva versión de distribución" - -#: pisi/atomicoperations.py:216 -msgid "Upgrading to new distribution build" -msgstr "Actualización a nuevo 'build' de distribución" - -#: pisi/atomicoperations.py:226 -msgid "Downgrade to old distribution release?" -msgstr "Revertir hacia versión antigua de distribución ?" - -#: pisi/atomicoperations.py:228 -msgid "Downgrade to old distribution build?" -msgstr "Revertir hacia 'build' antiguo de distribución ?" - -#: pisi/atomicoperations.py:230 -msgid "Package downgrade declined" -msgstr "Reversión (downgrade) de paquetes rechazado" - -#: pisi/atomicoperations.py:254 -msgid "%s configuration failed." -msgstr "Falló configuración %s ." - -#: pisi/atomicoperations.py:341 -msgid "Storing %s, " -msgstr "Guardando %s, " - -#: pisi/atomicoperations.py:344 -msgid "Storing %s." -msgstr "Guardando %s." - -#: pisi/atomicoperations.py:351 -msgid "Storing %s" -msgstr "Guardando %s" - -#: pisi/atomicoperations.py:407 -msgid "File list could not be read for package %s, continuing removal." -msgstr "" -"Lista de archivos no se pudo leer para paquete %s, continuando eliminar." - -#: pisi/atomicoperations.py:413 -msgid "Removing package %s" -msgstr "Eliminando paquete %s" - -#: pisi/atomicoperations.py:416 -msgid "Trying to remove nonexistent package " -msgstr "Intentando remover paquete no-existente" - -#: pisi/atomicoperations.py:455 -msgid "Not removing conflicted file : %s" -msgstr "No eliminado archivo conflictivo: %s" - -#: pisi/atomicoperations.py:475 -msgid "" -"Installed file %s is not exists on system [Probably you manually deleted]" -msgstr "" -"Archivo instalado %s no existe en el sistema [Probablemente eliminado " -"manualmente]" - -#: pisi/atomicoperations.py:536 -msgid "Metadata XML '%s' cannot be found" -msgstr "Metadata XML '%s' no se puede encontrar" - -#: pisi/atomicoperations.py:544 -msgid "MetaData format wrong (%s)" -msgstr "Formato MetaData equivocado (%s)" - -#: pisi/atomicoperations.py:546 -msgid "* Adding '%s' to db... " -msgstr "* Agregando '%s' a db... " - -#: pisi/atomicoperations.py:552 -msgid "Files XML '%s' cannot be found" -msgstr "Archivos XML '%s' no se pueden encontrar" - -#: pisi/atomicoperations.py:557 pisi/package.py:136 -msgid "Invalid %s" -msgstr "%s Invalido" - -#: pisi/atomicoperations.py:566 -msgid "OK." -msgstr "OK." - -#: pisi/build.py:88 -msgid "Path %s belongs in multiple packages" -msgstr "Ruta %s pertenece a paquetes múltiples" - -#: pisi/build.py:114 -msgid "Source URI: %s" -msgstr "URI Fuente: %s" - -#: pisi/build.py:118 -msgid "Source %s not found in any active repository." -msgstr "Fuente %s no encontrado en ningún repositorio activo." - -#: pisi/build.py:183 -msgid "Building PiSi source package: %s" -msgstr "Generando paquete fuente PiSi: %s" - -#: pisi/build.py:229 -msgid "IceCream detected. Make sure your daemon is up and running..." -msgstr "IceCream detectado. Aseguráte que tu demónio está 'up and running'..." - -#: pisi/build.py:234 -msgid "CCache detected..." -msgstr "CCache detectado..." - -#: pisi/build.py:287 -msgid "PartOf tag not defined, looking for component" -msgstr "PartOf tag no definido, buscando componente" - -#: pisi/build.py:297 -msgid "Cannot find component.xml in upper directory" -msgstr "No se pudo encontrar .xml en directorio superior" - -#: pisi/build.py:301 -msgid "Source is part of %s component" -msgstr "Fuente es parte de componente %s " - -#: pisi/build.py:305 -msgid "Fetching source from: %s" -msgstr "Tomando fuente de: %s" - -#: pisi/build.py:307 -msgid "Source archive is stored: %s/%s" -msgstr "Archivo de fuente guardado: %s/%s" - -#: pisi/build.py:311 -msgid "Unpacking archive..." -msgstr "Descompactando archivo..." - -#: pisi/build.py:313 -msgid " unpacked (%s)" -msgstr " descompactado (%s)" - -#: pisi/build.py:318 -msgid "Setting up source..." -msgstr "Configurando fuente..." - -#: pisi/build.py:323 -msgid "Building source..." -msgstr "Generando fuente..." - -#: pisi/build.py:328 -msgid "Installing..." -msgstr "Instalando..." - -#: pisi/build.py:370 -msgid "Unable to read Actions Script (%s): %s" -msgstr "No posible leer Script de Acciones (%s): %s" - -#: pisi/build.py:372 -msgid "SyntaxError in Actions Script (%s): %s" -msgstr "Error de Sintaxis en Script de Acciones (%s): %s" - -#: pisi/build.py:389 -msgid "Unable to read COMAR script (%s): %s" -msgstr "No posible leer Script de COMAR (%s): %s" - -#: pisi/build.py:391 -msgid "SyntaxError in COMAR file (%s): %s" -msgstr "Error de Sintax en archivo COMAR (%s): %s" - -#: pisi/build.py:417 -msgid "unable to call function from actions: %s" -msgstr "no posible llamar funciones desde acciones: %s" - -# did I get "safety switch" right (in this context)? -#: pisi/build.py:433 -msgid "" -"Safety switch: following extra packages in system.devel will be installed: " -msgstr "" -"Cambio de Seguridad: Se instalarán los siguientes paquetes adicionales en " -"system.devel:" - -#: pisi/build.py:438 -msgid "Safety switch: system.devel is already installed" -msgstr "Cambio de Seguridad: system.devel ya está instalado" - -#: pisi/build.py:440 -msgid "Safety switch: the component system.devel cannot be found" -msgstr "Cambio de Seguridad: No posible encontrar el componente system.devel" - -#: pisi/build.py:449 -msgid "Unsatisfied Build Dependencies:" -msgstr "Dependencias Build no satisfechos:" - -#: pisi/build.py:453 -msgid "Cannot build package due to unsatisfied build dependencies" -msgstr "No posible generar el paquete por dependencias no satisfechos" - -#: pisi/build.py:461 -msgid "Build dependency %s cannot be satisfied" -msgstr "Build de dependiente %s no se puede cumplir" - -#: pisi/build.py:463 -msgid "Do you want to install the unsatisfied build dependencies" -msgstr "Quiere instalar las dependencias build no satisfechas ?" - -#: pisi/build.py:464 -msgid "Installing build dependencies." -msgstr "Instalando dependencias build" - -#: pisi/build.py:469 -msgid "Ignoring build dependencies." -msgstr "Ignorando dependencias build" - -#: pisi/build.py:479 -msgid "Patch file is missing: %s\n" -msgstr "Archivo parche faltanda: %s\n" - -#: pisi/build.py:492 -msgid "* Applying patch: %s" -msgstr "* Aplicando parche: %s" - -#: pisi/build.py:550 -msgid "Stripping files.." -msgstr "Quitando archivos.." - -#: pisi/build.py:656 -msgid "(found old version %s)" -msgstr "(encontrado versión antigua %s)" - -#: pisi/build.py:658 -msgid "Skipping %s with wrong pkg name " -msgstr "Saltando %s con nombre de pkg incorrecto" - -#: pisi/build.py:679 -msgid "(no previous build found, setting build no to 1.)" -msgstr "(no se encontró build anterior, seteando número de build a 1.)" - -#: pisi/build.py:724 -msgid "(old package lacks a build no, setting build no to 1.)" -msgstr "" -"(paquete antiguo no tiene número de build, seteando número de build a 1.)" - -#: pisi/build.py:727 -msgid "There are changes, incrementing build no to %d" -msgstr "Hay cambios, incrementando número de build a %d" - -#: pisi/build.py:730 -msgid "There is no change from previous build %d" -msgstr "No hay cambios en relación al build anterior %d" - -#: pisi/build.py:795 -msgid "No user named '%s' found on the system" -msgstr "" - -#: pisi/build.py:800 -msgid "No group named '%s' found on the system" -msgstr "" - -#: pisi/build.py:803 -msgid "** Building package %s" -msgstr "** Building package %s" - -#: pisi/build.py:805 pisi/build.py:808 -msgid "Generating %s," -msgstr "Generando %s," - -#: pisi/build.py:814 -msgid "" -"Build number is not available. For repo builds you must enable buildno in " -"pisi.conf." -msgstr "" -"Número de build no disponible. Para builds de repo buildno debe estar " -"habilitado en pisi.conf." - -#: pisi/build.py:832 -msgid "Creating PiSi package %s." -msgstr "Creando Paquete PiSi %s." - -#: pisi/build.py:877 -msgid "Done." -msgstr "Hecho." - -#: pisi/build.py:883 -msgid "Abandoned files under the install dir (%s):" -msgstr "Archivos abandonados en carpeta de instalación (%s):" - -#: pisi/build.py:887 -msgid "" -"All of the files under the install dir (%s) has been collected by package(s)" -msgstr "" -"Todos los archivos de la carpeta de instalación (%s) se juntaron en los " -"paquetes" - -#: pisi/build.py:891 -msgid "Cleaning Build Directory..." -msgstr "Limpiando Carpeta Build..." - -#: pisi/build.py:894 -msgid "Keeping Build Directory" -msgstr "Manteniendo Carpeta Build" - -#: pisi/cli/__init__.py:79 -msgid "Warning: " -msgstr "Alerta:" - -#: pisi/cli/__init__.py:88 -msgid "Error: " -msgstr "Error: " - -# is this to translate ? would it work if i change this ? -#: pisi/cli/__init__.py:120 -msgid " (yes/no)" -msgstr " (yes/no)" - -#: pisi/cli/__init__.py:141 -msgid " [complete]\n" -msgstr " [complete]\n" - -#: pisi/cli/__init__.py:151 -msgid "Installed %s" -msgstr "Instalado %s" - -#: pisi/cli/__init__.py:153 -msgid "Removed %s" -msgstr "Removido %s" - -#: pisi/cli/__init__.py:155 -msgid "Upgraded %s" -msgstr "Actualizado %s" - -#: pisi/cli/__init__.py:157 -msgid "Configured %s" -msgstr "Configurado %s" - -#: pisi/cli/__init__.py:159 -msgid "Extracting the files of %s" -msgstr "Extrayendo los archivos de %s" - -#: pisi/cli/commands.py:94 -msgid "generic help string for any command" -msgstr "cadena de ayuda genérica para cualquier comando" - -#: pisi/cli/commands.py:123 pisi/cli/pisicli.py:104 -msgid "Unrecognized command: %s" -msgstr "Comando desconocido: %s" - -#: pisi/cli/commands.py:145 -msgid "common options" -msgstr "opciones comúnes" - -#: pisi/cli/commands.py:148 -msgid "general options" -msgstr "opciones generales" - -# "Change" is meant to be imperative ? like "please do.." ? (or is it like "The change") -#: pisi/cli/commands.py:151 -msgid "Change the system root for PiSi commands" -msgstr "Cambie el root del sistema para los comandos PiSi" - -#: pisi/cli/commands.py:153 -msgid "Assume yes in all yes/no queries" -msgstr "Asumir yes(si) en todas consultas yes/no" - -#: pisi/cli/commands.py:158 -msgid "Detailed output" -msgstr "Salida detallada" - -#: pisi/cli/commands.py:160 -msgid "Show debugging information" -msgstr "Mostrar información de depuración" - -#: pisi/cli/commands.py:162 -msgid "Suppresses all coloring of PiSi's output" -msgstr "No colorear mensajes salidas de PiSi" - -# there must be a better choice for "fallback" (in spanish)..doesn't come to my mind right now -#: pisi/cli/commands.py:169 -msgid "" -"This is a fall back function. If the implementer module provides an\n" -" options function it will be called" -msgstr "" -"Esto es una función auxiliar de reserva. Si el módulo que lo implemente " -"provee \n" -" una función options, lo va a llamar" - -#: pisi/cli/commands.py:181 -msgid "Destination directory %s does not exist. Creating directory.\n" -msgstr "Destination directory %s does not exist. Creating directory.\n" - -#: pisi/cli/commands.py:203 -msgid "Password: " -msgstr "Contraseña" - -#: pisi/cli/commands.py:209 -msgid "initialize PiSi components" -msgstr "inicializar componentes PiSi " - -#: pisi/cli/commands.py:217 -msgid "do cleanup work for PiSi components" -msgstr "hacer limpieza para los componentes PiSi" - -#: pisi/cli/commands.py:231 -msgid "print help for the command" -msgstr "imprimir ayuda para el comando" - -#: pisi/cli/commands.py:237 -msgid "exit program" -msgstr "salir del programa" - -#: pisi/cli/commands.py:239 -msgid "Command terminated abnormally." -msgstr "Comando terminado de manera anormal" - -#: pisi/cli/commands.py:249 -msgid "Command lacks name" -msgstr "Comando no tiene nombre" - -#: pisi/cli/commands.py:253 -msgid "Duplicate command %s" -msgstr "Comando duplicado %s" - -#: pisi/cli/commands.py:262 -msgid "" -"Prints help for given commands\n" -"\n" -"Usage: help [ ... ]\n" -"\n" -"If run without parameters, it prints the general help." -msgstr "" -"imprime ayuda para comandos\n" -"\n" -"Uso: help [ ... ]\n" -"\n" -"Cuando se ejecuta sin parámetros imprime la ayuda general." - -#: pisi/cli/commands.py:296 -msgid "" -"Clean stale locks\n" -"\n" -"Usage: clean\n" -"\n" -"PiSi uses filesystem locks for managing database access.\n" -"This command deletes unused locks from the database directory." -msgstr "" -"Limpiar achivos de bloqueo sin uso\n" -"\n" -"Uso: clean\n" -"\n" -"PiSi aplica bloqueos (locks) a nivel de sistema de archivos para controlar " -"el acceso a base de datos.\n" -"Este comando elimina archivos lock sin uso de la carpeta de la base de datos." - -#: pisi/cli/commands.py:315 -msgid "" -"Delete cache files\n" -"\n" -"Usage: delete-cache\n" -"\n" -"Sources, packages and temporary files are stored\n" -"under /var directory. Since these accumulate they can\n" -"consume a lot of disk space." -msgstr "" -"Borrar archivos temporales\n" -"\n" -"Uso: delete-cache\n" -"\n" -"Fuentes, paquetes y archivos temporales varios se \n" -"guardanen la carpeta /var. Al acumularse pueden\n" -"consumir un gran espacio en disco." - -#: pisi/cli/commands.py:336 -msgid "" -"Graph package relations\n" -"\n" -"Usage: graph [ ...]\n" -"\n" -"Write a graph of package relations, tracking dependency and\n" -"conflicts relations starting from given packages. By default\n" -"shows the package relations among repository packages, and writes\n" -"the package in graphviz format to 'pgraph.dot'.\n" -msgstr "" -"Graficar relaciones de paquetes\n" -"\n" -"Uso: graph [ ...]\n" -"\n" -"Produce un gráfico de relaciones de paquetes, indicando dependencias\n" -"y conflictos iniciando de un paquete dado. Por defecto\n" -"muestra las relaciones de paque tes entre los paquetes del repositorio y\n" -"escribe el paquete en formato graphviz a 'pgraph.dot'.\n" - -#: pisi/cli/commands.py:353 -msgid "graph options" -msgstr "opciones del gráfico" - -#: pisi/cli/commands.py:357 -msgid "Specify a particular repository" -msgstr "Especificar un repositorio en particular" - -#: pisi/cli/commands.py:360 -msgid "Graph of installed packages" -msgstr "Grafico de paquetes insgtalados" - -#: pisi/cli/commands.py:363 -msgid "Do not show installed packages" -msgstr "No mostrar paquetes instalados" - -#: pisi/cli/commands.py:366 -msgid "Dot output file" -msgstr "Archivo salida Dot" - -#: pisi/cli/commands.py:377 -msgid "Plotting packages in repository %s" -msgstr "Ploteando paquetes de repositorio %s" - -#: pisi/cli/commands.py:383 -msgid "Plotting a graph of relations among all repository packages" -msgstr "" -"Ploteando un gráfico de relaciones entre los paquetes de todos los " -"repositorios" - -#: pisi/cli/commands.py:390 -msgid "Plotting a graph of relations among all installed packages" -msgstr "Ploteando un gráfico de relaciones entre todos los paquetes instalados" - -#: pisi/cli/commands.py:402 -msgid "Do not take build no into account." -msgstr "No atender número de build." - -#: pisi/cli/commands.py:407 -msgid "Do not take dependency information into account" -msgstr "No atender información de dependencias" - -#: pisi/cli/commands.py:411 -msgid "" -"Build PiSi packages\n" -"\n" -"Usage: build [ | ] ...\n" -"\n" -"You can give a URI of the pspec.xml file. PiSi will\n" -"fetch all necessary files and build the package for you.\n" -"\n" -"Alternatively, you can give the name of a source package\n" -"to be downloaded from a repository containing sources.\n" -msgstr "" -"Build PiSi paquetes\n" -"\n" -"Uso: build [ | ] ...\n" -"\n" -"Se puede indicar la URI de un archivo pspec.xml. PiSi va a\n" -"buscar todos los archivos necesarios y crear el paquete.\n" -"\n" -"Como alternativa se puede indicar la ubicación de un paquete de fuentes,\n" -" para descargarlo de un repositorio de fuentes.\n" - -#: pisi/cli/commands.py:433 -msgid "build options" -msgstr "opciones de build" - -#: pisi/cli/commands.py:441 -msgid "Output directory for produced packages" -msgstr "Carpeta de salida para paquetes producidos" - -#: pisi/cli/commands.py:444 -msgid "Bypass errors from ActionsAPI" -msgstr "Desviar errores del ActionsAPI" - -# check? -#: pisi/cli/commands.py:446 pisi/cli/commands.py:554 -msgid "Bypass safety switch" -msgstr "Cambio de seguridad de Desvio" - -#: pisi/cli/commands.py:448 -msgid "Create a static package with ar files" -msgstr "Crear un paquete estático con archivos ar" - -#: pisi/cli/commands.py:450 -msgid "" -"Do not install build dependencies, fail if a build dependency is present" -msgstr "" -"No instalar dependencias build, error si una dependencia de build está " -"presente" - -#: pisi/cli/commands.py:452 -msgid "PiSi binary package formats: '1.0', '1.1' (default)" -msgstr "Formatos bínarios de paquetes PiSi: '1.0', '1.1' (default)" - -#: pisi/cli/commands.py:455 -msgid "build steps" -msgstr "pasos build" - -#: pisi/cli/commands.py:457 -msgid "Break build after fetching the source archive" -msgstr "Interrumpir build luego de buscar el archivo fuente" - -#: pisi/cli/commands.py:459 -msgid "" -"Break build after unpacking the source archive, checking sha1sum and " -"applying patches" -msgstr "" -"Interrumpir build luego de descompactar el archivo fuente, verificando " -"sha1sum y aplicando parches" - -#: pisi/cli/commands.py:461 -msgid "Break build after running configure step" -msgstr "Interrumpir build luego de ejecutar el paso de configure" - -#: pisi/cli/commands.py:463 -msgid "Break build after running compile step" -msgstr "Interrumpir build luego de compilar" - -#: pisi/cli/commands.py:465 -msgid "Break build after running install step" -msgstr "Interrumpir build luego de ejecutar install" - -#: pisi/cli/commands.py:467 -msgid "create PiSi package" -msgstr "crear paquete PiSi" - -#: pisi/cli/commands.py:481 -msgid "package_format must be one of %s " -msgstr "package_format debe ser uno de %s " - -#: pisi/cli/commands.py:484 pisi/cli/commands.py:533 -msgid "Output directory: %s" -msgstr "Carpeta de salida: %s" - -# sense is "current directory" i think ? -#: pisi/cli/commands.py:486 -msgid "Outputting packages in the working directory." -msgstr "Guardando paquetes en la carpeta actual." - -#: pisi/cli/commands.py:497 -msgid "" -"Build and install PiSi source packages from repository\n" -"\n" -"Usage: emerge ...\n" -"\n" -"You should give the name of a source package to be\n" -"downloaded from a repository containing sources.\n" -"\n" -"You can also give the name of a component.\n" -msgstr "" -"Build e instalar paquetes PiSi de fuentes de repositorio\n" -"\n" -"Uso: emerge ...\n" -"\n" -"Se debe indicar el nombre de un paquete de fuentes \n" -"a ser descargado de un repositorio de fuentes.\n" -"\n" -"Tambien se puede dar el nombre de un componente.\n" - -# no idea, i should know the context :( -#: pisi/cli/commands.py:516 -msgid "emerge options" -msgstr "" - -#: pisi/cli/commands.py:519 pisi/cli/commands.py:592 pisi/cli/commands.py:656 -msgid "Ignore file conflicts" -msgstr "Ignorar conflictos de archivos" - -#: pisi/cli/commands.py:521 pisi/cli/commands.py:594 pisi/cli/commands.py:658 -msgid "Ignore package conflicts" -msgstr "Ignorar confllictos de paquetes" - -#: pisi/cli/commands.py:523 pisi/cli/commands.py:552 -msgid "Bypass comar configuration agent" -msgstr "Saltar el agente de configuración comar" - -#: pisi/cli/commands.py:535 -msgid "Outputting binary packages in the package cache." -msgstr "Guardando paquetes binarios en el cache de paquetes." - -#: pisi/cli/commands.py:543 -msgid "Abstract package operation command" -msgstr "Comando de operación de paquete abstracto" - -#: pisi/cli/commands.py:556 -msgid "Do not perform any action, just show what would be done" -msgstr "no hacer nada, solamente mostrar lo que se haría" - -#: pisi/cli/commands.py:567 -msgid "" -"Install PiSi packages\n" -"\n" -"Usage: install ... \n" -"\n" -"You may use filenames, URI's or package names for packages. If you have\n" -"specified a package name, it should exist in a specified repository.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"Instalar paquetes PiSi\n" -"\n" -"Uso: install ... \n" -"\n" -"Se puede usar nombres de archivos, URI's o nombres de paquetes para los " -"paquetes. Se\n" -"se especifíca un nombre de paquete, éste debería existir en un repositorio " -"especificado.\n" -"\n" -"Tambien se puede indicar componentes en vez de nombres de paquetes, los que " -"se\n" -"completerán a nombres de paquetes.\n" - -#: pisi/cli/commands.py:585 -msgid "install options" -msgstr "Opciones de instalación" - -#: pisi/cli/commands.py:590 -msgid "Reinstall already installed packages" -msgstr "Reinstalar paquetes ya instalados" - -# check here: should be the idea be here - "dependent" (instead of "recursive")? -#: pisi/cli/commands.py:596 -msgid "Install component's and recursive components' packages" -msgstr "Instalar paquetes de componente y de componentes recursivos" - -#: pisi/cli/commands.py:598 pisi/cli/commands.py:662 -msgid "Fetch upgrades but do not install." -msgstr "Descargar actualizaciones pero no instalar" - -#: pisi/cli/commands.py:621 -msgid "" -"Upgrade PiSi packages\n" -"\n" -"Usage: Upgrade [ ... ]\n" -"\n" -": package name\n" -"\n" -"Upgrades the entire system if no package names are given\n" -"\n" -"You may use only package names to specify packages because\n" -"the package upgrade operation is defined only with respect\n" -"to repositories. If you have specified a package name, it\n" -"should exist in the package repositories. If you just want to\n" -"reinstall a package from a PiSi file, use the install command.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"Actualizar paquetes PiSi \n" -"\n" -"Uso: Upgrade [ ... ]\n" -"\n" -": nombre de paquete\n" -"\n" -"Actualiza el sistema entero si no se indica un nombre de paquete\n" -"\n" -"Se puede usar solamente nombres de paquetes para especificar paquetes\n" -"porque la operación de actualizacióno de paquetes solo está definido con \n" -"respecto a repositorios. Para el nombre especificado debe existir\n" -"el paquete correspondiente en los repositorios de paquetes. Si quiere " -"solamente\n" -" reinstalar un paquete de un archivo PiSi file, use el comando install.\n" -"\n" -"Tambien se puede especificar componentes en vez de nombres de paquetes, lo " -"que \n" -"se autocompletará a nombres de paquetes.\n" - -#: pisi/cli/commands.py:647 -msgid "upgrade options" -msgstr "opciones de actualización" - -#: pisi/cli/commands.py:652 -msgid "Security related package upgrades only" -msgstr "Solamente actualizaciones de seguridad" - -#: pisi/cli/commands.py:654 -msgid "Do not update repositories" -msgstr "No actualizar repositorios" - -#: pisi/cli/commands.py:660 -#, fuzzy -msgid "Upgrade component's and recursive components' packages" -msgstr "Remover paquetes del componente y recursivamente de los subcomponentes" - -#: pisi/cli/commands.py:664 -msgid "" -"When upgrading system, ignore packages and components whose basenames match " -"pattern." -msgstr "" -"Ignorar paquetes y componentes para la actualización, cuyo nombre base " -"coincide con patrón." - -# translated as if "..whose basenames contain the pattern string" -#: pisi/cli/commands.py:666 -msgid "" -"When upgrading system, ignore packages and components whose " -"basenames match any pattern contained in file." -msgstr "" -"Ignorar paquetes y componentes para la actualización, cuyo nombre base " -"contiene el patrón." - -#: pisi/cli/commands.py:706 -msgid "Updating repositories" -msgstr "Actualizando repositorios" - -#: pisi/cli/commands.py:711 -msgid "Will not update repositories" -msgstr "No se actuallizarán los repositorios" - -#: pisi/cli/commands.py:733 -msgid "" -"Remove PiSi packages\n" -"\n" -"Usage: remove ... \n" -"\n" -"Remove package(s) from your system. Just give the package names to remove.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"Removee paquetes PiSi \n" -"\n" -"Uso: remove ... \n" -"\n" -"Remover paquete(s) del sistema. Solamente indique el nombre de paquete a " -"remover.\n" -"\n" -"Tambien se puede especificar componentes en vez de nombres de paquetes, lo " -"que \n" -"se autocompletará a nombres de paquetes.\n" - -#: pisi/cli/commands.py:750 -msgid "remove options" -msgstr "opciones de remover" - -#: pisi/cli/commands.py:753 -msgid "Remove component's and recursive components' packages" -msgstr "Remover paquetes del componente y recursivamente de los subcomponentes" - -#: pisi/cli/commands.py:775 -msgid "" -"Configure pending packages\n" -"\n" -"If COMAR configuration of some packages were not\n" -"done at installation time, they are added to a list\n" -"of packages waiting to be configured. This command\n" -"configures those packages.\n" -msgstr "" -"Configurar paquetes pendientes\n" -"\n" -"Si la configuración de COMAR de algunos paquetes no se \n" -"realizaron durante la instalación, se les agrega a una lista\n" -"de paquetes pendientes a configurar. Este comando \n" -"configura los paquetes en esta situación.\n" - -#: pisi/cli/commands.py:791 -msgid "configure-pending options" -msgstr "Opciones de configuración de pendientes" - -#: pisi/cli/commands.py:803 -msgid "" -"Display package information\n" -"\n" -"Usage: info ... \n" -"\n" -" is either a package name or a .pisi file,\n" -msgstr "" -"Mostrar información de paquete\n" -"\n" -"Uso: info ... \n" -"\n" -" puede ser nombre de paquete o un archivo .pisi,\n" - -#: pisi/cli/commands.py:818 -msgid "info options" -msgstr "opciones de info" - -#: pisi/cli/commands.py:825 -msgid "Show a list of package files." -msgstr "Mostrar lista de archivos de paquetes" - -# my translation of "the current component", is it ok ? -#: pisi/cli/commands.py:827 -msgid "Info about the given component" -msgstr "Infos sobre el componente actual" - -#: pisi/cli/commands.py:830 -msgid "Show only paths." -msgstr "Mostrar solamente rutas" - -#: pisi/cli/commands.py:832 -msgid "Do not show details" -msgstr "No mostrar detalles" - -#: pisi/cli/commands.py:834 -msgid "Output in xml format" -msgstr "Salida en formato xml" - -#: pisi/cli/commands.py:880 -msgid "Package file: %s" -msgstr "Archivo de paquete: %s" - -#: pisi/cli/commands.py:886 -msgid "[inst] " -msgstr "[inst] " - -#: pisi/cli/commands.py:888 -msgid "Installed package:" -msgstr "Paquete instalado:" - -#: pisi/cli/commands.py:894 -msgid "[repo] " -msgstr "[repo] " - -#: pisi/cli/commands.py:896 -msgid "Package found in repository:" -msgstr "Paquete encontrado en repositorio:" - -#: pisi/cli/commands.py:900 -#, fuzzy -msgid "%s is not found in repositories" -msgstr "No se actuallizarán los repositorios" - -#: pisi/cli/commands.py:903 -#, fuzzy -msgid "%s is not installed" -msgstr "Paquete %s no está instalado." - -# "Reverse" ne demek ? is this = undo ? -#: pisi/cli/commands.py:916 -msgid "Reverse Dependencies:" -msgstr "" - -#: pisi/cli/commands.py:919 -msgid "" -"\n" -"Files:" -msgstr "" -"\n" -"Archivos:" - -#: pisi/cli/commands.py:927 -msgid "File information not available" -msgstr "Información de archivo no disponible" - -#: pisi/cli/commands.py:933 -msgid "" -"Verify installation\n" -"\n" -"Usage: check [ ... ]\n" -"\n" -": package name\n" -"\n" -"A cryptographic checksum is stored for each installed\n" -"file. Check command uses the checksums to verify a package.\n" -"Just give the names of packages.\n" -"\n" -"If no packages are given, checks all installed packages.\n" -msgstr "" -"Verificar instalación\n" -"\n" -"Uso: check [ ... ]\n" -"\n" -": nombre de paquete\n" -"\n" -"Para cada archivo se guarda un checksum criptográfico. El \n" -"comando Check usa los checksum para verificar la integridad de \n" -"un paquete. Simplemente hay que indicar los nombre de los paquetes.\n" -"\n" -"Sin nombre de paquete, el comando verifica todos los paquetes instalados.\n" - -#: pisi/cli/commands.py:957 -msgid "Checking all installed packages" -msgstr "Verificando todos los paquetes instalados" - -#: pisi/cli/commands.py:960 -msgid "* Checking %s... " -msgstr "* Verificando %s... " - -#: pisi/cli/commands.py:964 -msgid "" -"\n" -"Package %s is corrupt." -msgstr "" -"\n" -"Paquete %s está corrupto." - -#: pisi/cli/commands.py:968 -msgid "Package %s not installed" -msgstr "Paquete %s no está instalado" - -#: pisi/cli/commands.py:973 -msgid "" -"Index PiSi files in a given directory\n" -"\n" -"Usage: index ...\n" -"\n" -"This command searches for all PiSi files in a directory, collects PiSi\n" -"tags from them and accumulates the information in an output XML file,\n" -"named by default 'pisi-index.xml'. In particular, it indexes both\n" -"source and binary packages.\n" -"\n" -"If you give multiple directories, the command still works, but puts\n" -"everything in a single index file.\n" -msgstr "" -"Indexar archivos PiSi de una carpeta específicada\n" -"\n" -"Uso: index ...\n" -"\n" -"Este comando busca todos los archivos PiSi de una carpeta, collecciona sus\n" -"tags PiSi y junta la información en un archivo XML de salida,\n" -"que por defecto tiene el nombre 'pisi-index.xml'. El comando indexa\n" -"tanto a paquetes fuente como a binarios.\n" -"\n" -"Cuando se le indica al programa multiples carpetas, la operación funciona " -"igual, pero\n" -"se junta el resultado en un solo archivo del indexado.\n" - -#: pisi/cli/commands.py:994 -msgid "index options" -msgstr "opciones de indexar" - -#: pisi/cli/commands.py:998 -msgid "Store absolute links for indexed files." -msgstr "Guardar rutas absolutas para los archivos indexados." - -#: pisi/cli/commands.py:1001 -msgid "Index output file" -msgstr "Archivo index de salida" - -#: pisi/cli/commands.py:1004 -msgid "Do not index PiSi spec files." -msgstr "No incluir archivos de spec PiSi" - -#: pisi/cli/commands.py:1007 -msgid "Do not sign index." -msgstr "No firmar index" - -#: pisi/cli/commands.py:1020 -msgid "Indexing current directory." -msgstr "Indexando carpeta actual" - -#: pisi/cli/commands.py:1028 -msgid "" -"Print the list of all installed packages\n" -"\n" -"Usage: list-installed\n" -msgstr "" -"Imprime una lista de todos los paquetes instalados\n" -"\n" -"Uso: list-installed\n" - -#: pisi/cli/commands.py:1042 -msgid "list-installed options" -msgstr "opciones de list-installed" - -#: pisi/cli/commands.py:1045 pisi/cli/commands.py:1278 -#: pisi/cli/commands.py:1342 pisi/cli/commands.py:1381 -#: pisi/cli/commands.py:1421 pisi/cli/commands.py:1555 -msgid "Show in long format" -msgstr "Mostrar formato largo" - -#: pisi/cli/commands.py:1047 -msgid "List installed packages under given component" -msgstr "Listar paquetes instalados bajo componente dado" - -#: pisi/cli/commands.py:1049 pisi/cli/commands.py:1425 -msgid "Show detailed install info" -msgstr "Mostrar información detallada de instalación" - -# I suppose here the position is important too ! Should be the same ok as in english -#: pisi/cli/commands.py:1066 pisi/cli/commands.py:1444 -msgid "" -"Package Name |St| Version| Rel.| Build| Distro| Date" -msgstr "" -"Nombre Paquete |St| Versión| Rel.| Build| Distro| Fecha" - -#: pisi/cli/commands.py:1081 -msgid "" -"Rebuild Databases\n" -"\n" -"Usage: rebuilddb [ ... ]\n" -"\n" -"Rebuilds the PiSi databases\n" -"\n" -"If package specs are given, they should be the names of package\n" -"dirs under /var/lib/pisi\n" -msgstr "" -"Regenerar Base de Datos\n" -"\n" -"Uso: rebuilddb [ ... ]\n" -"\n" -"Regenera la base de datos PiSi\n" -"\n" -"Si se indican nombres de paquetes, deberían coincidir con \n" -"carpetas de paquetes en /var/lib/pisi\n" - -#: pisi/cli/commands.py:1099 -msgid "rebuild-db options" -msgstr "opciones rebuild-db" - -#: pisi/cli/commands.py:1102 -msgid "Rebuild files database" -msgstr "Regenerar base de datos de archivos" - -#: pisi/cli/commands.py:1113 -msgid "Rebuild PiSi databases?" -msgstr "Regenerar base de datos PiSi ?" - -#: pisi/cli/commands.py:1120 -msgid "" -"Update repository databases\n" -"\n" -"Usage: update-repo [ ... ]\n" -"\n" -": repository name\n" -"\n" -"Synchronizes the PiSi databases with the current repository.\n" -"If no repository is given, all repositories are updated.\n" -msgstr "" -"Actualizar bases de datos de repositorio\n" -"\n" -"Uso: update-repo [ ... ]\n" -"\n" -": nombre de repositorio\n" -"\n" -"Synchroniza la base de datos PiSi con el repositorio actual.\n" -"Si no se indica un repositorio, se actualizan todos los repositorios.\n" - -#: pisi/cli/commands.py:1138 -msgid "update-repo options" -msgstr "opciones update-repo" - -#: pisi/cli/commands.py:1142 -msgid "Update database in any case" -msgstr "Actualizar la base de datos de todas formas" - -#: pisi/cli/commands.py:1160 -msgid "" -"Add a repository\n" -"\n" -"Usage: add-repo \n" -"\n" -": name of repository to add\n" -": URI of index file\n" -"\n" -"If no repo is given, add-repo pardus-devel repo is added by default\n" -"\n" -"NB: We support only local files (e.g., /a/b/c) and http:// URIs at the " -"moment\n" -msgstr "" -"Agregar un preositorio\n" -"\n" -"Uso: add-repo \n" -"\n" -": nombre de repositorio a agregar\n" -": URI de archivo indexador\n" -"\n" -"Si no se indica repo, add-repo pardus-devel repo se agrega por defecto\n" -"\n" -"Obs.: Actualmente están soportados solamente archivos locales (ej., /a/b/c) " -"y URIs http:// \n" - -#: pisi/cli/commands.py:1180 -msgid "add-repo options" -msgstr "opciones add-repo" - -#: pisi/cli/commands.py:1183 -msgid "Add repository at given position (0 is first)" -msgstr "Agregar repositorio en posicion indicada (inicia con 0)" - -#: pisi/cli/commands.py:1197 -msgid "Update PiSi database for repository %s?" -msgstr "Actualizar base de datos PiSi para repositorio %s?" - -#: pisi/cli/commands.py:1201 -msgid "%s repository could not be reached. Removing %s from system." -msgstr "Repositorio %s inaccesible. Removiendo %s del sistema." - -#: pisi/cli/commands.py:1210 -msgid "" -"Remove repositories\n" -"\n" -"Usage: remove-repo ... \n" -"\n" -"Remove all repository information from the system.\n" -msgstr "" -"Remover repositorios\n" -"\n" -"Uso: remove-repo ... \n" -"\n" -"Remueve toda información de repositorio del sistema.\n" - -# i think translatioin ok, but maybe something nicer/better (in spanish) for "tracked" ? -#: pisi/cli/commands.py:1236 -msgid "" -"List repositories\n" -"\n" -"Usage: list-repo\n" -"\n" -"Lists currently tracked repositories.\n" -msgstr "" -"Lista repositorios\n" -"\n" -"Uso: list-repo\n" -"\n" -"Lista repositorios que están siendo observados actualmente.\n" - -#: pisi/cli/commands.py:1259 -msgid "" -"List available packages in the repositories\n" -"\n" -"Usage: list-available [ ... repon ]\n" -"\n" -"Gives a brief list of PiSi packages published in the specified\n" -"repositories. If no repository is specified, we list packages in\n" -"all repositories.\n" -msgstr "" -"Lista paquetes disponibles en los repositorios\n" -"\n" -"Uso: list-available [ ... repon ]\n" -"\n" -"Da una lista breve de los paquetes PiSi publicados en los\n" -"repositorios especificados. Sin especificar un repositorio, se listan\n" -"los paquetes de todos los repositorios.\n" - -#: pisi/cli/commands.py:1276 -msgid "list-available options" -msgstr "opciones list-available" - -#: pisi/cli/commands.py:1280 -msgid "List available packages under given component" -msgstr "Listar paquetes disponibles bajo un componente dado" - -#: pisi/cli/commands.py:1282 -msgid "Show uninstalled packages only" -msgstr "Solo muestra paquetes no instalados" - -#: pisi/cli/commands.py:1290 -msgid "Installed packages are shown in this color" -msgstr "Paquetes instalados se muestran en este color" - -#: pisi/cli/commands.py:1298 -msgid "Repository : %s\n" -msgstr "Repositorio : %s\n" - -#: pisi/cli/commands.py:1325 -msgid "" -"List available components\n" -"\n" -"Usage: list-components\n" -"\n" -"Gives a brief list of PiSi components published in the\n" -"repositories.\n" -msgstr "" -"Lista componentes disponibles\n" -"\n" -"Uso: list-components\n" -"\n" -"Da una lista breve de componentes PiSi publicados en los\n" -"repositorios.\n" - -#: pisi/cli/commands.py:1340 -msgid "list-components options" -msgstr "opciones list-components" - -#: pisi/cli/commands.py:1365 -msgid "" -"List available sources\n" -"\n" -"Usage: list-sources\n" -"\n" -"Gives a brief list of sources published in the repositories.\n" -msgstr "" -"Lista fuentes disponibles\n" -"\n" -"Uso: list-sources\n" -"\n" -"Da una lista breve de los fuentes publicados en los repositories.\n" - -#: pisi/cli/commands.py:1379 -msgid "list-sources options" -msgstr "opciones list-sources" - -#: pisi/cli/commands.py:1404 -msgid "" -"List packages to be upgraded\n" -"\n" -"Usage: list-upgrades\n" -"\n" -"Lists the packages that will be upgraded.\n" -msgstr "" -"Lista paquetes a actualizar\n" -"\n" -"Uso: list-upgrades\n" -"\n" -"Lista los paquetes que se actualizarán.\n" - -#: pisi/cli/commands.py:1418 -msgid "list-upgrades options" -msgstr "opcioens list-upgrades" - -#: pisi/cli/commands.py:1423 -msgid "List upgradable packages under given component" -msgstr "Lista paquetes actualizables bajo un componente dado" - -#: pisi/cli/commands.py:1440 pisi/operations.py:466 -msgid "No packages to upgrade." -msgstr "No hay paquetes para actualizar" - -#: pisi/cli/commands.py:1460 -msgid "" -"List pending packages\n" -"\n" -"Lists packages waiting to be configured.\n" -msgstr "" -"Lista de paquetes pendientes\n" -"\n" -"Lista paquetes esperando la configuración.\n" - -#: pisi/cli/commands.py:1482 -#, fuzzy -msgid "There are no packages waiting to be configured" -msgstr "" -"Lista de paquetes pendientes\n" -"\n" -"Lista paquetes esperando la configuración.\n" - -#: pisi/cli/commands.py:1487 -msgid "" -"Search packages\n" -"\n" -"Usage: search ... \n" -"\n" -"Finds a package containing specified search terms\n" -"in summary, description, and package name fields.\n" -msgstr "" -"Buscar paquetes\n" -"\n" -"Uso: search ... \n" -"\n" -"Busca paquetes con un patrón de búsqueda en\n" -"campos de resumen, descripción y nombre de paquete.\n" - -#: pisi/cli/commands.py:1502 -msgid "search options" -msgstr "opciones de busqueda" - -#: pisi/cli/commands.py:1505 -msgid "Set search language" -msgstr "Establecer idioma de búsqueda" - -#: pisi/cli/commands.py:1510 -msgid "Show details" -msgstr "Mostrar detalles" - -#: pisi/cli/commands.py:1530 -msgid "%s packages found" -msgstr "%s paquetes encontrados" - -#: pisi/cli/commands.py:1539 -msgid "" -"Search for a file\n" -"\n" -"Usage: search-file ... \n" -"\n" -"Finds the installed package which contains the specified file.\n" -msgstr "" -"Buscar archivo\n" -"\n" -"Uso: search-file ... \n" -"\n" -"Busca el paquete instalado que contiene el archivo indicado.\n" - -#: pisi/cli/commands.py:1553 -msgid "search-file options" -msgstr "opcioens search-file" - -#: pisi/cli/commands.py:1557 -msgid "Fuzzy search" -msgstr "Búsqueda Fuzzy" - -#: pisi/cli/commands.py:1559 -msgid "Show only package name" -msgstr "Mostrar solamente nombre de paquete" - -# i put in spanish "contains" instead of "has", ok ? -#: pisi/cli/commands.py:1580 -msgid "Package %s has file %s" -msgstr "Paquete %s contiene archivo %s" - -#: pisi/cli/commands.py:1582 -msgid "Type: %s, Hash: %s" -msgstr "Tpio: %s, Hash: %s" - -#: pisi/cli/commands.py:1585 -msgid "Path '%s' does not belong to an installed package" -msgstr "Ruta '%s' no perteneca a un paquete instalado" - -#: pisi/cli/commands.py:1598 -msgid "Searching for %s" -msgstr "Buscando %s" - -#: pisi/cli/commands.py:1608 -msgid "" -"%prog [options] [arguments]\n" -"\n" -"where is one of:\n" -"\n" -msgstr "" -"%prog [options] [arguments]\n" -"\n" -"donde es uno de:\n" -"\n" - -#: pisi/cli/commands.py:1614 -msgid "" -"\n" -"Use \"%prog help \" for help on a specific command.\n" -msgstr "" -"\n" -"Use \"%prog help \" para ayuda de un comando específico.\n" - -#: pisi/cli/pisicli.py:56 -msgid "Options must precede non-option arguments" -msgstr "Opciones deben ir antes de los otros argumentos" - -#: pisi/cli/pisicli.py:97 -msgid "No command given" -msgstr "No se dió ningún comando" - -# is my idea of "parsing" in spanish correct - or acceptable ? -#: pisi/cli/pisicli.py:100 -msgid "Command line parsing error" -msgstr "Error de sintax de comando" - -#: pisi/comariface.py:54 -msgid "cannot connect to comar" -msgstr "no posible conectar a comar" - -#: pisi/comariface.py:72 -msgid "Could not restart comar" -msgstr "No posible reiniciar comar" - -#: pisi/comariface.py:77 -msgid "connection with comar unexpectedly closed" -msgstr "Pérdida de conexión con comar inesperada" - -#: pisi/comariface.py:90 -msgid "Configuration error: %s" -msgstr "Error de configuración: %s" - -#: pisi/comariface.py:92 -msgid "Script error: %s" -msgstr "Error de script: %s" - -#: pisi/comariface.py:94 -msgid "comar denied our access" -msgstr "comar denegó el acceso" - -#: pisi/comariface.py:99 -msgid "Configuring %s package" -msgstr "Configurando paquete %s " - -#: pisi/comariface.py:104 -msgid "Registering %s comar script" -msgstr "Registrando comar script %s " - -#: pisi/comariface.py:110 -msgid "Calling post install handlers" -msgstr "Llamando actualdores de post-install" - -#: pisi/comariface.py:115 -msgid "Running package's post install script" -msgstr "Ejecutando script de post-install del paquete" - -#: pisi/comariface.py:122 -msgid "Configuring %s package for removal" -msgstr "Configurando paquete %s para remover" - -#: pisi/comariface.py:125 -msgid "Running package's pre remove script" -msgstr "Ejecutando script previo de remover paquete" - -#: pisi/comariface.py:129 -msgid "Calling pre remove handlers" -msgstr "Llamando actualores antes de remover" - -#: pisi/comariface.py:133 -msgid "Unregistering comar scripts" -msgstr "Excluyendo scripts comar del registro" - -#: pisi/component.py:97 pisi/component.py:103 -msgid "Component %s not found" -msgstr "Componente %s no encontrado" - -#: pisi/component.py:199 pisi/component.py:225 -msgid "Information for component %s not available" -msgstr "Información para componente %s no disponible" - -#: pisi/config.py:61 -msgid "Destination directory %s does not exist. Creating it." -msgstr "Carpeta destino %s no existe. Creando ahora." - -#: pisi/configfile.py:105 -msgid "No section by name '%s'" -msgstr "No sección con nombre '%s'" - -#: pisi/conflict.py:39 pisi/dependency.py:40 -msgid " version >= " -msgstr " version >= " - -#: pisi/conflict.py:41 pisi/dependency.py:42 -msgid " version <= " -msgstr " version <= " - -#: pisi/conflict.py:43 pisi/dependency.py:44 -msgid " release >= " -msgstr " release >= " - -#: pisi/conflict.py:45 pisi/dependency.py:46 -msgid " release <= " -msgstr " release <= " - -#: pisi/constants.py:30 -msgid "Can't rebind constant: %s" -msgstr "" - -#: pisi/constants.py:36 -msgid "Can't unbind constant: %s" -msgstr "" - -#: pisi/dependency.py:103 -msgid "Package %s does not satisfy dependency %s" -msgstr "Paquete %s no satiface dependencia %s" - -#: pisi/dependency.py:116 -msgid "Package %s is not present in the package database" -msgstr "Paquete %s no figura en la base de datos de paquetes" - -#: pisi/fetcher.py:81 -msgid "Filename error" -msgstr "Error de nombre de archivo" - -#: pisi/fetcher.py:84 -msgid "Access denied to write to destination directory: \"%s\"" -msgstr "Acceso de escritura denegado para carpeta: \"%s\"" - -#: pisi/fetcher.py:89 -msgid "Access denied to destination file: \"%s\"" -msgstr "Acceso denegado a archivo de destino: \"%s\"" - -#: pisi/fetcher.py:100 -msgid "" -"A problem occured. Please check the archive address and/or permissions again." -msgstr "" -"Ocurrió un problema. Favor verifique otra vez la ubicación y/o los permisos " -"del paquete." - -#: pisi/fetcher.py:158 -msgid "No such file or no permission to read" -msgstr "No existe el archivo o no hay permisos de lectura" - -#: pisi/fetcher.py:183 -msgid "Requested range not satisfiable, starting again." -msgstr "Rango solicitado no posible satisfacer, iniciando otra vez." - -#: pisi/fetcher.py:190 -msgid "Cannot fetch %s; value error: %s" -msgstr "Imposible traer %s; valor de error: %s" - -#: pisi/fetcher.py:192 pisi/fetcher.py:194 pisi/fetcher.py:196 -msgid "Cannot fetch %s; %s" -msgstr "No posible traer %s; %s" - -#: pisi/fetcher.py:198 -msgid "Cannot fetch %s; (%s): %s" -msgstr "No posible traer %s; (%s): %s" - -#: pisi/fetcher.py:244 -msgid "Proxy configuration has been found for '%s' protocol" -msgstr "Configuración de proxy se detectó para protocolo '%s' " - -#: pisi/fetcher.py:328 pisi/fetcher.py:349 pisi/fetcher.py:362 -msgid "ftp error" -msgstr "error ftp" - -#: pisi/file.py:66 -msgid "uri must have type either URI or string" -msgstr "uri debe ser de tipo URI o string" - -#: pisi/file.py:89 -msgid "zip compression not supported yet" -msgstr "compresión zip todavía no soportado" - -#: pisi/file.py:117 -msgid "Fetching %s" -msgstr "Trayendo %s" - -#: pisi/file.py:122 -msgid "Copying %s to transfer dir" -msgstr "Copyiando %s a carpeta de transfer" - -#: pisi/file.py:127 -msgid "File '%s' not found." -msgstr "Archivo '%s' no encontrado" - -#: pisi/file.py:135 -msgid "File integrity of %s compromised." -msgstr "La integridad de %s acusa un problema." - -#: pisi/file.py:155 -msgid "File mode must be either File.read or File.write" -msgstr "modo de archivo debe ser File.read o File.write" - -#: pisi/file.py:160 -msgid "Remote write not implemented" -msgstr "Escritura remota no implementado" - -#: pisi/file.py:187 -msgid "gzip compression not supported yet" -msgstr "compresión gzip todavía no soportado" - -#: pisi/file.py:202 pisi/file.py:205 -msgid "ERROR: gpg --detach-sig %s failed" -msgstr "ERROR: gpg --detach-sig %s falló" - -#: pisi/graph.py:31 -msgid "Encountered cycle %s" -msgstr "Encontrado cycle %s" - -#: pisi/index.py:92 -msgid "Adding %s to package index" -msgstr "Agregando %s al index de paquetes" - -#: pisi/index.py:95 -msgid "Adding %s to component index" -msgstr "Agregando %s a index de componentes" - -#: pisi/index.py:113 -msgid "Updating package database of %s" -msgstr "Actualizando base de datos de paquetes %s" - -#: pisi/index.py:141 -msgid "Package %s: metadata corrupt, skipping..." -msgstr "Metadata de paquete %s: corrupto, omitiendo..." - -# here "source" means - like source code ? (not "base".. ) -#: pisi/index.py:169 -msgid "Adding %s to source index" -msgstr "Agregando %s a index de fuentes" - -#: pisi/installdb.py:58 -msgid "installed" -msgstr "instalado" - -#: pisi/installdb.py:58 -msgid "installed-pending" -msgstr "installed-pending" - -# ok ? -#: pisi/installdb.py:59 -msgid "purged" -msgstr "limpiado" - -#: pisi/installdb.py:59 -msgid "removed" -msgstr "removido" - -#: pisi/installdb.py:62 -msgid "" -"State: %s\n" -"Version: %s, Release: %s, Build: %s\n" -msgstr "" -"Estado: %s\n" -"Version: %s, Release: %s, Build: %s\n" - -#: pisi/installdb.py:67 -msgid "Distribution: %s, Install Time: %s\n" -msgstr "Distribución: %s, Tiempo de Instalación: %s\n" - -#: pisi/installdb.py:154 -msgid "Already installed" -msgstr "Ya instalado" - -#: pisi/itembyrepodb.py:120 -msgid "Invalid repository string" -msgstr "Cadena de repositorio inválida" - -#: pisi/itembyrepodb.py:142 -msgid "Key %s not found" -msgstr "Clave %s no encontrado" - -#: pisi/itembyrepodb.py:152 -msgid "Key %s in repo %s not found" -msgstr "Clave %s no encontrado en repositorio %s " - -#: pisi/lockeddbshelve.py:47 -msgid "Database version for %s insufficient. Please run rebuild-db command." -msgstr "" -"Versión de base de datos %s insuficiente. Favor ejecute el comando rebuild-" -"db." - -#: pisi/lockeddbshelve.py:51 -msgid "" -"Database version for %s greater than PiSi version. You need a newer PiSi." -msgstr "" -"Versión de base de datos %s mayor que versión de PiSi. Necesitas una versión " -"PiSi más nueva." - -#: pisi/lockeddbshelve.py:62 -msgid "Cannot attain write access to database environment" -msgstr "No posible escribir en base de datos" - -#: pisi/lockeddbshelve.py:64 -msgid "Database version %s not present." -msgstr "Versión de base de datos %s no disponible." - -#: pisi/lockeddbshelve.py:71 pisi/lockeddbshelve.py:153 -msgid "" -"Another instance of PiSi is running. Only one instance is allowed to modify " -"the PiSi database at a time." -msgstr "" -"Otra instancia de PiSi está ejecutandose en este momento. Solamente una de " -"las instancias puede modificar la base de datos de PiSi." - -#: pisi/lockeddbshelve.py:81 -msgid "Cannot attain read access to database environment" -msgstr "No posible acceder base de datos para lectura" - -#: pisi/lockeddbshelve.py:95 -#, fuzzy -msgid "" -"Cannot attain write access to PiSi database. You have to be root for this " -"operation." -msgstr "No posible escribir en base de datos" - -#: pisi/lockeddbshelve.py:113 -msgid "Cannot attain read or write access to database %s" -msgstr "No posible acceder a base de datos %s para lectura o escritura" - -#: pisi/lockeddbshelve.py:139 -msgid "" -"Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" -msgstr "" -"Banderas deberían ser uno de 'r', 'w', 'c' or 'n' o use las banderas bsddb." -"db.DB_* " - -#: pisi/metadata.py:58 -msgid "Distribution: %s, Dist. Release: %s\n" -msgstr "Distribución: %s, Dist. Release: %s\n" - -#: pisi/metadata.py:60 -msgid "Architecture: %s, Installed Size: %s" -msgstr "Arquitectura: %s, Tamaño Instalado: %s" - -# "mirrors" should be better (in spanish).. -#: pisi/mirrors.py:46 -msgid "Mirrors file %s does not exist. Could not resolve mirrors://" -msgstr "Archivo mirror %s no existe. No posible resolver mirrors://" - -#: pisi/operations.py:114 -msgid "Mixing file names and package names not supported yet." -msgstr "" -"Mezclando nombres de archivos y nombres de paquetes todavía no soportado." - -#: pisi/operations.py:156 -msgid "" -"The following packages will be installed\n" -"in the respective order to satisfy extra dependencies:\n" -msgstr "" -"Se instalarán los siguientes paquetes\n" -"en el orden respectivo para satisfacer las dependencias adicionales:\n" - -#: pisi/operations.py:159 pisi/operations.py:621 -msgid "Do you want to continue?" -msgstr "Quiere continuar ?" - -#: pisi/operations.py:160 -msgid "External dependencies not satisfied" -msgstr "Dependencia externa no satisfecha" - -#: pisi/operations.py:172 pisi/operations.py:339 -msgid "No packages to install." -msgstr "No hay paquetes a instalar." - -#: pisi/operations.py:203 -msgid "Installation order: " -msgstr "Orden de instalación:" - -# might be slightly different. i should see the context -#: pisi/operations.py:257 pisi/operations.py:279 -msgid "Conflicts remain" -msgstr "Conflictos quedan" - -#: pisi/operations.py:267 -msgid "Selected packages [%s] are in conflict with each other." -msgstr "Paquetes seleccionados [%s] están en conflicto entre sí." - -#: pisi/operations.py:273 -msgid "[%s conflicts with: %s]\n" -msgstr "[%s conflicta con: %s]\n" - -#: pisi/operations.py:275 -msgid "" -"The following packages have conflicts:\n" -"%s" -msgstr "" -"Los siguientes paquetes tienen conflictos:\n" -"%s" - -#: pisi/operations.py:278 -msgid "Remove the following conflicting packages?" -msgstr "Remover los siguientes paquetes conflictivos ?" - -# I don't know what to say for "Safety switch".. yet -#: pisi/operations.py:305 -msgid "Safety switch: Following packages in system.base will be installed: " -msgstr "Safety switch: Se instalarán los siguientes paquetes en system.base: " - -#: pisi/operations.py:311 -msgid "Safety switch: Following packages in system.base will be upgraded: " -msgstr "" -"Safety switch: Se actualizarán los siguientes paquetes en system.base: " - -# should this say in english ? "Safety switch: the component cannot be found in system.base" ?? (i did in spanish like this) -#: pisi/operations.py:317 pisi/operations.py:597 -msgid "Safety switch: the component system.base cannot be found" -msgstr "Safety switch: No posible encontrar el componente en system.base: " - -#: pisi/operations.py:334 -msgid "" -"The following package(s) are already installed and are not going to be " -"installed again:\n" -msgstr "" -"The following package(s) are already installed and are not going to be " -"installed again:\n" - -#: pisi/operations.py:355 -msgid "" -"Following packages will be installed in the respective order to satisfy " -"dependencies:\n" -msgstr "" -"Se instalarán los siguientes paquetes en el orden indicado para satisfacer " -"las dependencias:\n" - -#: pisi/operations.py:360 pisi/operations.py:491 -msgid "Total size of package(s): %.2f %s" -msgstr "Tamaño total de paquete(s): %.2f %s" - -#: pisi/operations.py:366 pisi/operations.py:497 pisi/operations.py:709 -msgid "There are extra packages due to dependencies. Do you want to continue?" -msgstr "" -"Hay paquetes adicionales por motivo de dependencias. Quiere continuar ?" - -#: pisi/operations.py:432 -msgid "Warning: package *name* ends with '.pisi'" -msgstr "Alterta: *name* de paquete termina con '.pisi'" - -#: pisi/operations.py:435 -msgid "Package %s is not installed." -msgstr "Paquete %s no está instalado." - -#: pisi/operations.py:441 -msgid "Package %s is not available in repositories." -msgstr "Paquete %s no está disponible en repositorios." - -#: pisi/operations.py:453 -msgid "Package %s is already at the latest release %s." -msgstr "Paquete %s ya está con su ultima release %s." - -#: pisi/operations.py:459 -msgid "Package %s is already at the latest build %s." -msgstr "Paquete %s ya está con su último build %s." - -#: pisi/operations.py:486 -msgid "The following packages will be upgraded: " -msgstr "Se actualizarán los siguientes paquetes: " - -#: pisi/operations.py:552 -msgid "Dependency %s of %s cannot be satisfied" -msgstr "Dependencia %s de %s no se puede satisfacer" - -#: pisi/operations.py:553 -msgid "Upgrade is not possible." -msgstr "Actualización no posible." - -#: pisi/operations.py:568 -msgid "Reverse dependency %s of %s cannot be satisfied" -msgstr "" - -#: pisi/operations.py:593 -msgid "Safety switch: cannot remove the following packages in system.base: " -msgstr "" - -#: pisi/operations.py:604 -msgid "Package %s does not exist. Cannot remove." -msgstr "Paquete %s no existe. No posible remover." - -#: pisi/operations.py:608 -msgid "No packages to remove." -msgstr "No hay paquetes para remover." - -#: pisi/operations.py:617 -msgid "" -"The following minimal list of packages will be removed\n" -"in the respective order to satisfy dependencies:\n" -msgstr "" -"La siguiente lista mínimal de paquetes se removerán\n" -"en el orden indicado, para satisfacer las dependencias:\n" - -#: pisi/operations.py:622 -msgid "Package removal declined" -msgstr "Remover paquetes rechazado" - -#: pisi/operations.py:634 -msgid "Package %s is not installed. Cannot remove." -msgstr "Paquete %s no está instalado. No posible remover." - -#: pisi/operations.py:683 -msgid "No packages to emerge." -msgstr "" - -#: pisi/operations.py:698 -msgid "" -"The following minimal list of packages will be installed\n" -"from repository in the respective order to satisfy dependencies:\n" -msgstr "" -"The following minimal list of packages will be installed\n" -"from repository in the respective order to satisfy dependencies:\n" - -#: pisi/operations.py:701 -msgid "" -"The following minimal list of packages will be built and\n" -"installed in the respective order to satisfy dependencies:\n" -msgstr "" -"La siguiente lista mínimal de paquetes se genererán e instalarán\n" -"en el orden indicado, para satisfacer las dependencias:\n" - -#: pisi/operations.py:743 -msgid "Cannot find source package: %s" -msgstr "No posible encontrar paquete de fuentes: %s" - -#: pisi/package.py:56 -msgid "" -"There was a problem while fetching '%s'.\n" -"The package may have been upgraded. Please try to upgrade the package." -msgstr "" -"Ocurrió un problema al traer '%s'.\n" -"El paquete puede ya estar actualizado. Favor intente actualizar el paquete." - -#: pisi/package.py:60 pisi/sourcearchive.py:94 -msgid "%s [cached]" -msgstr "%s [cached]" - -#: pisi/package.py:131 -msgid "MetaData format wrong" -msgstr "Formato MetaData incorrecto" - -#: pisi/packagedb.py:66 -msgid "Package %s not found" -msgstr "Paquete %s no encontrado" - -#: pisi/pxml/autoxml.py:77 -msgid "At least one '%s' tag should have local text" -msgstr "Al menos un tag '%s' debería tener texto local" - -#: pisi/pxml/autoxml.py:84 -msgid "'%s' language of tag '%s' is empty" -msgstr "Idioma '%s' de tag '%s' está vacío" - -#: pisi/pxml/autoxml.py:112 -msgid "LocalText: unable to get either current or default locale" -msgstr "LocalText: no posible obtener locale actual o valor por defecto" - -#: pisi/pxml/autoxml.py:118 pisi/pxml/autoxml.py:133 -msgid "" -"Tag should have at least the current locale, or failing that an English or " -"Turkish version" -msgstr "" -"El Tag debería tener al menos un locale actual, o si falla esto, una versión " -"en inglés o turco" - -#: pisi/pxml/autoxml.py:368 -msgid "autoxml.check: '%s' errors" -msgstr "autoxml.check: '%s' errores" - -#: pisi/pxml/autoxml.py:423 pisi/pxml/autoxml.py:433 -msgid "autoxml.parse: String '%s' has errors" -msgstr "autoxml.parse: Cadena '%s' tiene errores" - -#: pisi/pxml/autoxml.py:443 pisi/pxml/autoxml.py:453 -msgid "autoxml.read: File '%s' has errors" -msgstr "autoxml.read: Archivo '%s' tiene errores" - -#: pisi/pxml/autoxml.py:461 -msgid "autoxml.write: object validation has failed" -msgstr "autoxml.write: falló validación de objeto" - -#: pisi/pxml/autoxml.py:469 -msgid "autoxml.write: File encoding '%s' has errors" -msgstr "autoxml.write: codificación de archivo '%s' tiene errores" - -#: pisi/pxml/autoxml.py:519 -msgid "gen_tag: unrecognized tag type %s in spec" -msgstr "gen_tag: tipo de tag desconocido %s en spec" - -#: pisi/pxml/autoxml.py:567 pisi/pxml/autoxml.py:578 -msgid "Mandatory variable %s not available" -msgstr "Variable obligatoria %s no disponible" - -#: pisi/pxml/autoxml.py:648 -msgid "Type mismatch: read text cannot be decoded" -msgstr "Error de tipo de datos: no posible decodificar cadena de entrada" - -# anything better for "token"? -#: pisi/pxml/autoxml.py:652 pisi/pxml/autoxml.py:661 -msgid "Mandatory token %s not available" -msgstr "Token obligatorio %s no disponible" - -#: pisi/pxml/autoxml.py:666 -msgid "Type mismatch. Expected %s, got %s" -msgstr "Error de tipo de datos. Esperado %s, recibido %s" - -#: pisi/pxml/autoxml.py:696 pisi/pxml/autoxml.py:812 -msgid "Type mismatch: DOM cannot be decoded" -msgstr "Error de tipo de datos: no posible decodificar DOM " - -#: pisi/pxml/autoxml.py:699 pisi/pxml/autoxml.py:715 pisi/pxml/autoxml.py:725 -#: pisi/pxml/autoxml.py:815 pisi/pxml/autoxml.py:829 pisi/pxml/autoxml.py:839 -msgid "Mandatory argument not available" -msgstr "Argumento obligatorio no disponible" - -#: pisi/pxml/autoxml.py:712 pisi/pxml/autoxml.py:826 -msgid "Object cannot be encoded" -msgstr "No posible codificar objeto" - -#: pisi/pxml/autoxml.py:737 -msgid "List type must contain only one element" -msgstr "Tipo de lilsta debe contener un solo elemento" - -#: pisi/pxml/autoxml.py:750 pisi/pxml/autoxml.py:771 -msgid "Mandatory list \"%s\" under \"%s\" node is empty." -msgstr "Lista obligatoria \"%s\" bajo nodo \"%s\" está vacía." - -#: pisi/pxml/xmlext.py:79 -msgid "getNodeText: Expected text node, got something else!" -msgstr "getNodeText: Esperado nodo de text, recibido algo diferente!" - -#: pisi/pxml/xmlfile.py:64 -msgid "String '%s' has invalid XML" -msgstr "Cadena '%s' contiene XML inválido" - -#: pisi/pxml/xmlfile.py:72 pisi/pxml/xmlfile.py:87 -msgid "File '%s' has invalid XML" -msgstr "Archivo '%s' contiene XML inválido" - -#: pisi/repodb.py:74 -#, fuzzy -msgid "No repository named %s exists" -msgstr "No se encontró repositorio con nombre %s." - -#: pisi/repodb.py:83 -msgid "Repository %s already exists" -msgstr "Repositorio %s ya existe" - -#: pisi/repodb.py:90 -msgid "Cannot add repository at position %s" -msgstr "No posible agregar repositorio en posición %s" - -#: pisi/scenarioapi/package.py:67 -msgid "No pisi package: %s* found." -msgstr "Paquete pisi: %s* no encontrado." - -#: pisi/scenarioapi/repoops.py:28 -msgid "Repo already has package named %s." -msgstr "Repo ya incluye paquete de nombre %s." - -#: pisi/scenarioapi/repoops.py:52 pisi/scenarioapi/repoops.py:59 -msgid "Repo does not have package named %s." -msgstr "Repo no contiene paquete con nombre %s." - -#: pisi/sourcearchive.py:63 -msgid "Trying fallback address: %s" -msgstr "Intentando dirección de auxilio: %s" - -#: pisi/sourcearchive.py:74 -msgid "%s mirrors are not defined." -msgstr "%s mirrors no están definidos." - -#: pisi/sourcearchive.py:79 -msgid "Fetching source from mirror: %s" -msgstr "Trayendo fuente de mirror: %s" - -#: pisi/sourcearchive.py:85 -msgid "Could not fetch source from %s mirrors." -msgstr "No posible traer fuentes de %s mirrors." - -#: pisi/sourcearchive.py:103 -msgid "unpack: check_file_hash failed" -msgstr "unpack: check_file_hash falló" - -#: pisi/sourcedb.py:59 pisi/sourcedb.py:65 -msgid "Source package %s not found" -msgstr "Paquete fuente %s no encontrado" - -#: pisi/specfile.py:141 -msgid "URI: %s, type: %s, sha1sum: %s" -msgstr "URI: %s, tipo: %s, sha1sum: %s" - -#: pisi/specfile.py:208 -msgid "Name: %s, version: %s, release: %s, build %s\n" -msgstr "Nombre: %s, version: %s, release: %s, build %s\n" - -#: pisi/specfile.py:210 -msgid "Summary: %s\n" -msgstr "Resumen: %s\n" - -#: pisi/specfile.py:211 -msgid "Description: %s\n" -msgstr "Descripción: %s\n" - -#: pisi/specfile.py:212 -msgid "Component: %s\n" -msgstr "Componente: %s\n" - -#: pisi/specfile.py:213 -msgid "Provides: " -msgstr "Provee: " - -#: pisi/specfile.py:217 -msgid "Dependencies: " -msgstr "Dependencias: " - -#: pisi/uri.py:80 -msgid "setAuthInfo needs a tuple (user, pass)" -msgstr "setAuthInfo requiere un tuple (user, pass)" - -#: pisi/util.py:122 pisi/util.py:143 -msgid "Running " -msgstr "Ejecutando" - -#: pisi/util.py:126 pisi/util.py:161 -msgid "return value for \"%s\" is %s" -msgstr "valor devuelto de \"%s\" es %s" - -#: pisi/util.py:364 -msgid "Including external link '%s'" -msgstr "Incluyendo link externo '%s'" - -#: pisi/util.py:366 -msgid "Including directory '%s'" -msgstr "Incluyendo carpeta '%s'" - -#: pisi/util.py:440 -msgid "I/O Error: Cannot calculate SHA1 hash of %s" -msgstr "I/O Error: No posible calcular hash SHA1 de %s" - -#: pisi/util.py:451 -msgid "Cannot calculate SHA1 hash of given data" -msgstr "No posible calculaar hash SHA1 de datos presentes" - -#: pisi/util.py:488 -msgid "ERROR: patch (%s) failed" -msgstr "ERROR: parche (%s) falló" - -#: pisi/util.py:490 -msgid "ERROR: patch (%s) failed: %s" -msgstr "ERROR: parche (%s) falló: %s" - -#: pisi/util.py:536 -msgid "strip command failed for file '%s'!" -msgstr "comando strip falló para archivo '%s'!" - -#: pisi/util.py:543 -msgid "objcopy (keep-debug) command failed for file '%s'!" -msgstr "comando objcopy (keep-debug) falló para archivo '%s'!" - -#: pisi/util.py:549 -msgid "objcopy (add-debuglink) command failed for file '%s'!" -msgstr "comando objcopy (add-debuglink) falló para archivo '%s'!" - -#: pisi/util.py:610 -msgid "Updating environment..." -msgstr "Actualizando entorno..." - -#: scripts/repostats.py:361 -msgid "" -"Duplicate binary packages:\n" -"%s\n" -"%s\n" -msgstr "" -"Duplicar paquetes binarios:\n" -"%s\n" -"%s\n" - -#: scripts/repostats.py:366 -msgid "Unknown file type '%s' in package '%s'" -msgstr "Tipo de archivo '%s' en paquete '%s' desconocido" - -#: scripts/repostats.py:422 -msgid "" -"Duplicate source packages:\n" -"%s\n" -"%s\n" -msgstr "" -"Duplicar paquetes de fuentes:\n" -"%s\n" -"%s\n" - -#: scripts/repostats.py:442 -msgid "Source package '%s' has wrong date format '%s'" -msgstr "Paeuete de fuente '%s' tiene formato de fecha incorrecto '%s'" - -#: scripts/repostats.py:481 -msgid "" -"Developer '%s <%s>' has another mail address '%s' in source package '%s'" -msgstr "" -"Desarollador '%s <%s>' tiene otra dirección email '%s' en archivo fuente '%s'" - -#: scripts/repostats.py:564 -msgid "" -"Cannot parse '%s':\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:642 -msgid "Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n" -msgstr "Uso: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n" - -#: scripts/repostats.py:643 -msgid "Dont generate the web site.\n" -msgstr "No generar sitio web.\n" - -#: scripts/repostats.py:664 -msgid "Scanning source repository...\n" -msgstr "Escaneando repositorio fuente...\n" - -#: scripts/repostats.py:668 -msgid "Scanning binary packages...\n" -msgstr "Escaneando paquetes binarios...\n" - -#: scripts/repostats.py:673 -msgid "Encountered %d errors! Fix them immediately!\n" -msgstr "%d errores encontrados! Corrígalos de inmediato!\n" - -#: scripts/repostats.py:681 -msgid "These dependencies are not available in repository:\n" -msgstr "Las siguientes dependencias no están disponibles en el repositorio:\n" - -#~ msgid "Cannot write to PiSi database." -#~ msgstr "No posible escribir en base de datos PiSi" - -#~ msgid "%s section should have a '%s' tag" -#~ msgstr "Sección %s debería tener un tag '%s'" - -#~ msgid "Removing lock %s" -#~ msgstr "Removiendo candado %s" diff --git a/tags/pisi-1.1_rc10/po/nl.po b/tags/pisi-1.1_rc10/po/nl.po deleted file mode 100644 index e9c0be47..00000000 --- a/tags/pisi-1.1_rc10/po/nl.po +++ /dev/null @@ -1,3071 +0,0 @@ -# translation of nl.po to Nederlands -# Andre van der Lubben , 2006. -# Willem Gielen , 2006. -# Rinse de Vries , 2006. -# W.P.M.H.I.A. Gielen , 2006. -# Copyright (C) 2005, 2006 Free Software Foundation, Inc. -msgid "" -msgstr "" -"Project-Id-Version: nl\n" -"POT-Creation-Date: 2006-12-08 21:29+EET\n" -"PO-Revision-Date: 2006-12-05 22:33+0200\n" -"Last-Translator: Willem Gielen \n" -"Language-Team: Nederlands \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: KBabel 1.11.4\n" -"X-Poedit-Language: Dutch\n" -"X-Poedit-Country: NETHERLANDS\n" -"X-Poedit-SourceCharset: utf-8\n" - -#: /usr/lib/python2.4/optparse.py:1 -msgid "" -"optparse - a powerful, extensible, and easy-to-use option parser.\n" -"\n" -"By Greg Ward \n" -"\n" -"Originally distributed as Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"If you have problems with this module, please do not file bugs,\n" -"patches, or feature requests with Python; instead, use Optik's\n" -"SourceForge project page:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"For support, use the optik-users@lists.sourceforge.net mailing list\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" -msgstr "" -"optparse - a powerful, extensible, and easy-to-use option parser.\n" -"\n" -"By Greg Ward \n" -"\n" -"Originally distributed as Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"If you have problems with this module, please do not file bugs,\n" -"patches, or feature requests with Python; instead, use Optik's\n" -"SourceForge project page:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"For support, use the optik-users@lists.sourceforge.net mailing list\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" - -#: /usr/lib/python2.4/optparse.py:93 -msgid "" -"\n" -" Raised if an Option instance is created with invalid or\n" -" inconsistent arguments.\n" -" " -msgstr "" -"\n" -" Raised if an Option instance is created with invalid or\n" -" inconsistent arguments.\n" -" " - -#: /usr/lib/python2.4/optparse.py:109 -msgid "" -"\n" -" Raised if conflicting options are added to an OptionParser.\n" -" " -msgstr "" -"\n" -" Raised if conflicting options are added to an OptionParser.\n" -" " - -#: /usr/lib/python2.4/optparse.py:114 -msgid "" -"\n" -" Raised if an invalid option value is encountered on the command\n" -" line.\n" -" " -msgstr "" -"\n" -" Raised if an invalid option value is encountered on the command\n" -" line.\n" -" " - -#: /usr/lib/python2.4/optparse.py:120 -msgid "" -"\n" -" Raised if an invalid or ambiguous option is seen on the command-line.\n" -" " -msgstr "" -"\n" -" Raised if an invalid or ambiguous option is seen on the command-line.\n" -" " - -#: /usr/lib/python2.4/optparse.py:298 pisi/cli/commands.py:50 -msgid "Return a comma-separated list of option strings & metavariables." -msgstr "Return a comma-separated list of option strings & metavariables." - -#: /usr/lib/python2.4/optparse.py:317 -msgid "" -"Format help with indented section bodies.\n" -" " -msgstr "" -"Format help with indented section bodies.\n" -" " - -#: /usr/lib/python2.4/optparse.py:329 pisi/cli/commands.py:44 -msgid "usage: %s\n" -msgstr "usage: %s\n" - -#: /usr/lib/python2.4/optparse.py:336 -msgid "" -"Format help with underlined section headers.\n" -" " -msgstr "" -"Format help with underlined section headers.\n" -" " - -#: /usr/lib/python2.4/optparse.py:348 -msgid "Usage" -msgstr "Usage" - -#: /usr/lib/python2.4/optparse.py:354 -msgid "integer" -msgstr "integer" - -#: /usr/lib/python2.4/optparse.py:355 -msgid "long integer" -msgstr "long integer" - -#: /usr/lib/python2.4/optparse.py:356 -msgid "floating-point" -msgstr "floating-point" - -#: /usr/lib/python2.4/optparse.py:357 -msgid "complex" -msgstr "complex" - -#: /usr/lib/python2.4/optparse.py:365 -msgid "option %s: invalid %s value: %r" -msgstr "option %s: invalid %s value: %r" - -#: /usr/lib/python2.4/optparse.py:373 -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "option %s: invalid choice: %r (choose from %s)" - -#: /usr/lib/python2.4/optparse.py:382 -msgid "" -"\n" -" Instance attributes:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " -msgstr "" -"\n" -" Instance attributes:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " - -#: /usr/lib/python2.4/optparse.py:781 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary, but only\n" -" use keys from dict that already have a corresponding attribute\n" -" in self. Any keys in dict without a corresponding attribute\n" -" are silently ignored.\n" -" " -msgstr "" -"\n" -" Update the option values from an arbitrary dictionary, but only\n" -" use keys from dict that already have a corresponding attribute\n" -" in self. Any keys in dict without a corresponding attribute\n" -" are silently ignored.\n" -" " - -#: /usr/lib/python2.4/optparse.py:794 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary,\n" -" using all keys from the dictionary regardless of whether\n" -" they have a corresponding attribute in self or not.\n" -" " -msgstr "" -"\n" -" Update the option values from an arbitrary dictionary,\n" -" using all keys from the dictionary regardless of whether\n" -" they have a corresponding attribute in self or not.\n" -" " - -#: /usr/lib/python2.4/optparse.py:926 -msgid "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " -msgstr "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " - -#: /usr/lib/python2.4/optparse.py:1138 -msgid "show this help message and exit" -msgstr "show this help message and exit" - -#: /usr/lib/python2.4/optparse.py:1143 -msgid "show program's version number and exit" -msgstr "show program's version number and exit" - -#: /usr/lib/python2.4/optparse.py:1166 -msgid "%prog [options]" -msgstr "%prog [options]" - -#: /usr/lib/python2.4/optparse.py:1246 -msgid "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse the command-line options found in 'args' (default:\n" -" sys.argv[1:]). Any errors result in a call to 'error()', which\n" -" by default prints the usage message to stderr and calls\n" -" sys.exit() with an error message. On success returns a pair\n" -" (values, args) where 'values' is an Values instance (with all\n" -" your option values) and 'args' is the list of arguments left\n" -" over after parsing options.\n" -" " -msgstr "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse the command-line options found in 'args' (default:\n" -" sys.argv[1:]). Any errors result in a call to 'error()', which\n" -" by default prints the usage message to stderr and calls\n" -" sys.exit() with an error message. On success returns a pair\n" -" (values, args) where 'values' is an Values instance (with all\n" -" your option values) and 'args' is the list of arguments left\n" -" over after parsing options.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1285 -msgid "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Check that the supplied option values and leftover arguments are\n" -" valid. Returns the option values and leftover arguments\n" -" (possibly adjusted, possibly completely new -- whatever you\n" -" like). Default implementation just returns the passed-in\n" -" values; subclasses may override as desired.\n" -" " -msgstr "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Check that the supplied option values and leftover arguments are\n" -" valid. Returns the option values and leftover arguments\n" -" (possibly adjusted, possibly completely new -- whatever you\n" -" like). Default implementation just returns the passed-in\n" -" values; subclasses may override as desired.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1298 -msgid "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Process command-line arguments and populate 'values', consuming\n" -" options and arguments from 'rargs'. If 'allow_interspersed_args' " -"is\n" -" false, stop at the first non-option argument. If true, accumulate " -"any\n" -" interspersed non-option arguments in 'largs'.\n" -" " -msgstr "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Process command-line arguments and populate 'values', consuming\n" -" options and arguments from 'rargs'. If 'allow_interspersed_args' " -"is\n" -" false, stop at the first non-option argument. If true, accumulate " -"any\n" -" interspersed non-option arguments in 'largs'.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1349 -msgid "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determine which long option string 'opt' matches, ie. which one\n" -" it is an unambiguous abbrevation for. Raises BadOptionError if\n" -" 'opt' doesn't unambiguously match any long option string.\n" -" " -msgstr "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determine which long option string 'opt' matches, ie. which one\n" -" it is an unambiguous abbrevation for. Raises BadOptionError if\n" -" 'opt' doesn't unambiguously match any long option string.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1376 /usr/lib/python2.4/optparse.py:1415 -msgid "%s option requires an argument" -msgstr "%s option requires an argument" - -#: /usr/lib/python2.4/optparse.py:1378 /usr/lib/python2.4/optparse.py:1417 -msgid "%s option requires %d arguments" -msgstr "%s option requires %d arguments" - -#: /usr/lib/python2.4/optparse.py:1387 -msgid "%s option does not take a value" -msgstr "%s option does not take a value" - -#: /usr/lib/python2.4/optparse.py:1404 /usr/lib/python2.4/optparse.py:1558 -msgid "no such option: %s" -msgstr "no such option: %s" - -#: /usr/lib/python2.4/optparse.py:1454 -msgid "" -"error(msg : string)\n" -"\n" -" Print a usage message incorporating 'msg' to stderr and exit.\n" -" If you override this in a subclass, it should not return -- it\n" -" should either exit or raise an exception.\n" -" " -msgstr "" -"error(msg : string)\n" -"\n" -" Print a usage message incorporating 'msg' to stderr and exit.\n" -" If you override this in a subclass, it should not return -- it\n" -" should either exit or raise an exception.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1471 -msgid "" -"print_usage(file : file = stdout)\n" -"\n" -" Print the usage message for the current program (self.usage) to\n" -" 'file' (default stdout). Any occurence of the string \"%prog\" in\n" -" self.usage is replaced with the name of the current program\n" -" (basename of sys.argv[0]). Does nothing if self.usage is empty\n" -" or not defined.\n" -" " -msgstr "" -"print_usage(file : file = stdout)\n" -"\n" -" Print the usage message for the current program (self.usage) to\n" -" 'file' (default stdout). Any occurence of the string \"%prog\" in\n" -" self.usage is replaced with the name of the current program\n" -" (basename of sys.argv[0]). Does nothing if self.usage is empty\n" -" or not defined.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1489 -msgid "" -"print_version(file : file = stdout)\n" -"\n" -" Print the version message for this program (self.version) to\n" -" 'file' (default stdout). As with print_usage(), any occurence\n" -" of \"%prog\" in self.version is replaced by the current program's\n" -" name. Does nothing if self.version is empty or undefined.\n" -" " -msgstr "" -"print_version(file : file = stdout)\n" -"\n" -" Print the version message for this program (self.version) to\n" -" 'file' (default stdout). As with print_usage(), any occurence\n" -" of \"%prog\" in self.version is replaced by the current program's\n" -" name. Does nothing if self.version is empty or undefined.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1504 -msgid "options" -msgstr "options" - -#: /usr/lib/python2.4/optparse.py:1528 -msgid "" -"print_help(file : file = stdout)\n" -"\n" -" Print an extended help message, listing all options and any\n" -" help text provided with them, to 'file' (default stdout).\n" -" " -msgstr "" -"print_help(file : file = stdout)\n" -"\n" -" Print an extended help message, listing all options and any\n" -" help text provided with them, to 'file' (default stdout).\n" -" " - -#: /usr/lib/python2.4/optparse.py:1541 -msgid "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Return the string key in 'wordmap' for which 's' is an unambiguous\n" -" abbreviation. If 's' is found to be ambiguous or doesn't match any of\n" -" 'words', raise BadOptionError.\n" -" " -msgstr "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Return the string key in 'wordmap' for which 's' is an unambiguous\n" -" abbreviation. If 's' is found to be ambiguous or doesn't match any of\n" -" 'words', raise BadOptionError.\n" -" " - -#: /usr/lib/python2.4/optparse.py:1562 -msgid "ambiguous option: %s (%s?)" -msgstr "ambiguous option: %s (%s?)" - -#: pisi-cli:46 -msgid "Keyboard Interrupt: Exiting..." -msgstr "Toetsenbord onderbreking: sluit af..." - -#: pisi-cli:49 -msgid "Program Terminated." -msgstr "Programma beëindigd." - -#: pisi-cli:52 -msgid "" -"A database operation has been aborted. You should run pisi\n" -"again for normal DB recovery procedure. Make sure you have free disk " -"space. \n" -"You have to run rebuild-db only when there is file corruption and database " -"upgrades." -msgstr "" -"Een database handeling is afgebroken. U zult pisi opnieuw\n" -"moeten opstarten voor een normale herstelprocedure van de database. Zorg " -"voor voldoende vrije ruimte op de harde schijf.\n" -"U zult rebuild-db alleen uit moeten voeren indien er een beschadiging van " -"bestanden heeft plaats gevonden of bij bijgewerkte databases." - -#: pisi-cli:57 -msgid "" -"Unhandled internal exception.\n" -"Please file a bug report. (http://bugs.uludag.org.tr)" -msgstr "" -"Onbehandelde interne uitzondering.\n" -"Rapporteer deze fout alstublieft. (http://bugs.uludag.org.tr)" - -#: pisi-cli:63 -msgid "System Error. Program Terminated." -msgstr "Systeemfout: programma beëindigd. " - -#: pisi-cli:70 -msgid "Please use 'pisi help' for general help." -msgstr "Gebruik pisi help voor algemene hulp. " - -#: pisi-cli:73 -msgid "Traceback:" -msgstr "Terugloop:" - -#: pisi-cli:77 -msgid "Use --debug to see a traceback." -msgstr "Gebruik --debug voor een terugloop." - -#: pisi/actionsapi/autotools.py:36 -msgid "" -"Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" -"Voeg config.log toe aan uw foutrapport:\n" -"%s/config.log" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/actionsapi/autotools.py:75 pisi/actionsapi/autotools.py:85 -#: pisi/actionsapi/kde.py:65 pisi/actionsapi/perlmodules.py:54 -#: pisi/actionsapi/perlmodules.py:57 -msgid "Configure failed." -msgstr "Configuratie is mislukt." - -# pisi/actionsapi/autotools.py:77 :87 -#: pisi/actionsapi/autotools.py:77 pisi/actionsapi/autotools.py:87 -#: pisi/actionsapi/kde.py:67 -msgid "No configure script found." -msgstr "Geen configuratiescript gevonden." - -#: pisi/actionsapi/autotools.py:96 pisi/actionsapi/kde.py:72 -#: pisi/actionsapi/perlmodules.py:63 pisi/actionsapi/perlmodules.py:72 -#: pisi/actionsapi/pythonmodules.py:49 pisi/actionsapi/scons.py:39 -msgid "Make failed." -msgstr "Make mislukt." - -# pisi/actionsapi/autotools.py:119 :127 -#: pisi/actionsapi/autotools.py:124 pisi/actionsapi/autotools.py:134 -#: pisi/actionsapi/kde.py:79 pisi/actionsapi/pythonmodules.py:54 -#: pisi/actionsapi/scons.py:43 -msgid "Install failed." -msgstr "Installatie mislukt." - -# pisi/actionsapi/autotools.py:121 :129 -#: pisi/actionsapi/autotools.py:126 pisi/actionsapi/autotools.py:136 -#: pisi/actionsapi/kde.py:81 -msgid "No Makefile found." -msgstr "Geen Makefile-bestand gevonden." - -#: pisi/actionsapi/autotools.py:143 -msgid "Running aclocal failed." -msgstr "Uitvoeren aclocal mislukt." - -# pisi/actionsapi/autotools.py:139 :144 -#: pisi/actionsapi/autotools.py:148 -msgid "Running autoconf failed." -msgstr "Uitvoeren autoconf mislukt." - -# pisi/actionsapi/autotools.py:139 :144 -#: pisi/actionsapi/autotools.py:153 -msgid "Running autoreconf failed." -msgstr "Uitvoeren autoreconf mislukt." - -#: pisi/actionsapi/autotools.py:158 -msgid "Running automake failed." -msgstr "Uitvoeren automake mislukt." - -#: pisi/actionsapi/autotools.py:163 -msgid "Running autoheader failed." -msgstr "Uitvoeren autoheader mislukt." - -#: pisi/actionsapi/get.py:163 -msgid "Util %s cannot be found" -msgstr "Hulpprogramma %s niet gevonden" - -#: pisi/actionsapi/get.py:165 -msgid "Warning: %s does not exist, using plain name %s" -msgstr "Waarschuwing: %s bestaat niet, %s wordt gebruikt" - -#: pisi/actionsapi/kde.py:34 -msgid "" -"\n" -"!!! Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" -"\n" -"!!! Voeg het bestand config.log toe aan uw bugrapport:\n" -"%s/config.log" - -#: pisi/actionsapi/libtools.py:38 -msgid "Running ldconfig failed." -msgstr "Uitvoeren ldconfig mislukt." - -#: pisi/actionsapi/libtools.py:49 -msgid "GNU Config Update Finished." -msgstr "GNU Config Update voltooid." - -#: pisi/actionsapi/libtools.py:53 -msgid "Running libtoolize failed." -msgstr "Uitvoeren libtoolize mislukt." - -# pisi/actionsapi/autotools.py:119 :127 -#: pisi/actionsapi/perlmodules.py:66 -msgid "perl build failed." -msgstr "perl compileren mislukt." - -# pisi/actionsapi/autotools.py:119 :127 -#: pisi/actionsapi/perlmodules.py:75 -msgid "perl install failed." -msgstr "perl installatie mislukt." - -#: pisi/actionsapi/pisitools.py:126 -msgid "ActionsAPI [doman]: Wrong man page file: %s" -msgstr "ActionsAPI [doman]: onjuist man-pagina bestand: %s" - -#: pisi/actionsapi/pisitools.py:164 -msgid "ActionsAPI [rename]: No such file or directory: %s" -msgstr "ActionsAPI [rename]: bestand of map niet gevonden: %s" - -#: pisi/actionsapi/pisitools.py:181 -msgid "File does not exist or permission denied: %s" -msgstr "Bestand bestaat niet of toegang wordt geweigerd: %s" - -#: pisi/actionsapi/pisitools.py:198 -msgid "ActionsAPI [dosym]: File exists: %s" -msgstr "ActionsAPI [dosym]: bestand aanwezig: %s" - -# pisi/actionsapi/pisitoolsfunctions.py:46 :59 -#: pisi/actionsapi/pisitoolsfunctions.py:45 -#: pisi/actionsapi/pisitoolsfunctions.py:59 -#: pisi/actionsapi/pisitoolsfunctions.py:72 -msgid "Insufficient arguments." -msgstr "Onvoldoende parameters." - -#: pisi/actionsapi/pythonmodules.py:66 -msgid "Running %s failed." -msgstr "Uitvoeren %s mislukt" - -#: pisi/actionsapi/shelltools.py:49 -msgid "Cannot create directory %s" -msgstr "Kan map %s niet aanmaken" - -#: pisi/actionsapi/shelltools.py:57 -msgid "ActionsAPI [echo]: Can't append to file %s." -msgstr "ActionsAPI [echo]: kan niet toevoegen aan bestand %s." - -#: pisi/actionsapi/shelltools.py:66 -msgid "ActionsAPI [chmod]: Operation not permitted: %s (mode: %s)" -msgstr "ActionsAPI [chmod]: handeling niet toegestaan: %s (mod: %s)" - -#: pisi/actionsapi/shelltools.py:69 -msgid "ActionsAPI [chmod]: File %s doesn't exists." -msgstr "ActionsAPI [chmod]: bestand %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:77 -msgid "ActionsAPI [chown]: Operation not permitted: %s (uid: %s, gid: %s)" -msgstr "ActionsAPI [chown]: handeling niet toegestaan: %s (uid: %s, gid: %s)" - -#: pisi/actionsapi/shelltools.py:80 -msgid "ActionsAPI [chown]: File %s doesn't exists." -msgstr "ActionsAPI [chown]: bestand %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:87 -msgid "ActionsAPI [sym]: Permission denied: %s to %s" -msgstr "ActionsAPI [sym]: toegang geweigerd: %s -> %s" - -#: pisi/actionsapi/shelltools.py:95 -msgid "ActionsAPI [unlink]: Permission denied: %s." -msgstr "ActionsAPI [unlink]: toegang geweigerd: %s." - -#: pisi/actionsapi/shelltools.py:99 -msgid "ActionsAPI [unlink]: File %s doesn't exists." -msgstr "ActionsAPI [unlink]: bestand %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:107 -msgid "ActionsAPI [unlinkDir]: Operation not permitted: %s" -msgstr "ActionsAPI [unlinkDir]: handeling niet toegestaan: %s" - -#: pisi/actionsapi/shelltools.py:111 -msgid "ActionsAPI [unlinkDir]: Directory %s doesn't exists." -msgstr "ActionsAPI [unlinkDir]: map %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:120 -msgid "ActionsAPI [move]: Permission denied: %s to %s" -msgstr "ActionsAPI [move]: toegang geweigerd: %s -> %s" - -#: pisi/actionsapi/shelltools.py:122 -msgid "ActionsAPI [move]: File %s doesn't exists." -msgstr "ActionsAPI [move]: bestand %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:132 -msgid "ActionsAPI [copy]: Permission denied: %s to %s" -msgstr "ActionsAPI [copy]: toegang geweigerd: %s -> %s" - -#: pisi/actionsapi/shelltools.py:148 -msgid "ActionsAPI [copy]: File %s does not exist." -msgstr "ActionsAPI [copy]: bestand %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:163 -msgid "ActionsAPI [copytree] %s to %s: %s" -msgstr "ActionsAPI [copytree] %s naar %s: %s" - -#: pisi/actionsapi/shelltools.py:165 -msgid "ActionsAPI [copytree]: Directory %s doesn't exists." -msgstr "ActionsAPI [copytree]: map %s bestaat niet." - -#: pisi/actionsapi/shelltools.py:177 -msgid "ActionsAPI [touch]: Permission denied: %s" -msgstr "ActionsAPI [touch]: toegang geweigerd: %s" - -#: pisi/api.py:302 pisi/comariface.py:30 -msgid "comar package is not fully installed" -msgstr "comar-pakket is niet volledig geïnstalleerd" - -#: pisi/api.py:314 -msgid "File %s not found" -msgstr "Bestand %s niet gevonden." - -#: pisi/api.py:375 -msgid "Checking /%s " -msgstr "Contrôle /%s " - -#: pisi/api.py:379 -msgid "" -"\n" -"Corrupt file: %s" -msgstr "" -"\n" -"Bestand met fouten: %s" - -#: pisi/api.py:381 pisi/cli/commands.py:966 -msgid "OK" -msgstr "OK" - -#: pisi/api.py:394 -msgid "* Building index of PiSi files under %s" -msgstr "* Index aanmaken van PiSi-bestanden onder %s" - -#: pisi/api.py:401 -msgid "* Index file written" -msgstr "* Index-bestand geschreven" - -#: pisi/api.py:405 -msgid "Repo %s already present." -msgstr "Repo %s is al aanwezig." - -#: pisi/api.py:409 -msgid "Repo %s added to system." -msgstr "Repo %s toegevoegd aan het systeem." - -#: pisi/api.py:415 -msgid "Repo %s removed from system." -msgstr "Repo %s verwijderd uit het systeem." - -#: pisi/api.py:417 -msgid "Repository %s does not exist. Cannot remove." -msgstr "Repository %s bestaat niet. Kan niet verwijderen." - -#: pisi/api.py:424 -msgid "* Updating repository: %s" -msgstr "* Bijwerken repository: %s " - -#: pisi/api.py:432 -msgid "No updates available for repository %s." -msgstr "Geen bijgewerkte bestanden beschikbaar op repository %s." - -#: pisi/api.py:434 -msgid "Updating database at any rate as requested" -msgstr "Database bijwerken op elke snelheid zoals verzocht" - -#: pisi/api.py:445 -msgid "* Package database updated." -msgstr "* Pakketdatabase bijgewerkt." - -#: pisi/api.py:447 pisi/api.py:472 -msgid "No repository named %s found." -msgstr "Geen repository met de naam %s gevonden." - -#: pisi/api.py:455 -msgid "* Rebuilding '%s' named repo... " -msgstr "* 'Opnieuw opbouwen %s' repo... " - -#: pisi/api.py:468 -msgid "Input/Output error while reading %s: %s" -msgstr "I/O-fout bij lezen van %s: %s" - -#: pisi/api.py:525 -msgid "Rebuilding package database" -msgstr "Herbouwen pakket database" - -#: pisi/archive.py:36 -msgid "" -"An error has occured while running LZMA:\n" -"%s" -msgstr "" -"Een fout is opgetreden bij het uitvoeren van LZMA:\n" -"%s" - -#: pisi/archive.py:101 pisi/archive.py:161 -msgid "Archive type not recognized" -msgstr "Archieftype niet herkend" - -#: pisi/atomicoperations.py:66 -msgid "Package %s found in repository %s" -msgstr "Pakket %s gevonden in repository %s " - -#: pisi/atomicoperations.py:78 -msgid "Package URI: %s" -msgstr "Pakket-URI: %s" - -#: pisi/atomicoperations.py:82 -msgid "Package %s not found in any active repository." -msgstr "Pakket %s niet gevonden in de actieve repositories." - -#: pisi/atomicoperations.py:101 -msgid "Installing %s, version %s, release %s, build %s" -msgstr "Installatie %s, versie %s, uitgave %s, compilatie %s" - -#: pisi/atomicoperations.py:146 -msgid "Dependencies for %s not satisfied" -msgstr "Afhankelijkheden voor %s niet opgelost" - -#: pisi/atomicoperations.py:148 -msgid "Package not installable" -msgstr "Pakket niet installeerbaar" - -#: pisi/atomicoperations.py:166 -msgid "/%s from %s package\n" -msgstr "%s van %s pakket\n" - -#: pisi/atomicoperations.py:167 -msgid "" -"File conflicts:\n" -"%s" -msgstr "" -"Bestandsconflicten:\n" -"%s" - -#: pisi/atomicoperations.py:202 -msgid "Re-install same version package?" -msgstr "Zelfde versie van het pakket herinstalleren?" - -#: pisi/atomicoperations.py:203 -msgid "Package re-install declined" -msgstr "Herinstalleren van het pakket geweigerd" - -#: pisi/atomicoperations.py:209 -msgid "Upgrading to new upstream version" -msgstr "Opwaarderen naar nieuwe upstream-versie" - -#: pisi/atomicoperations.py:212 -msgid "Upgrading to new distribution release" -msgstr "Opwaarderen naar nieuwe distributie-uitgave" - -#: pisi/atomicoperations.py:216 -msgid "Upgrading to new distribution build" -msgstr "Opwaarderen naar nieuwe distributie compilatie" - -#: pisi/atomicoperations.py:226 -msgid "Downgrade to old distribution release?" -msgstr "Terugwaarderen naar oude distributie uitgave?" - -#: pisi/atomicoperations.py:228 -msgid "Downgrade to old distribution build?" -msgstr "Terugwaarderen naar oude distributie compilatie?" - -#: pisi/atomicoperations.py:230 -msgid "Package downgrade declined" -msgstr "Terugwaarderen van pakket geweigerd" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/atomicoperations.py:254 -msgid "%s configuration failed." -msgstr "%s configuratie mislukt." - -#: pisi/atomicoperations.py:341 -msgid "Storing %s, " -msgstr "Opslaan %s, " - -#: pisi/atomicoperations.py:344 -msgid "Storing %s." -msgstr "Opslaan %s." - -#: pisi/atomicoperations.py:351 -msgid "Storing %s" -msgstr "Opslaan %s" - -#: pisi/atomicoperations.py:407 -msgid "File list could not be read for package %s, continuing removal." -msgstr "" -"Bestandslijst kon niet gelezen worden voor pakket %s, voortzetten " -"verwijderen." - -#: pisi/atomicoperations.py:413 -msgid "Removing package %s" -msgstr "Verwijderen pakket %s" - -#: pisi/atomicoperations.py:416 -msgid "Trying to remove nonexistent package " -msgstr "Proberen niet-bestaand pakket te verwijderen " - -#: pisi/atomicoperations.py:455 -msgid "Not removing conflicted file : %s" -msgstr "Niet verwijderen conflicterend bestand: %s" - -#: pisi/atomicoperations.py:475 -msgid "" -"Installed file %s is not exists on system [Probably you manually deleted]" -msgstr "" -"Genïstalleerd bestand %s bestaat niet op systeem [mogelijk met de hand " -"verwijderd]" - -#: pisi/atomicoperations.py:536 -msgid "Metadata XML '%s' cannot be found" -msgstr "Metadata-XML '%s' kan niet worden gevonden" - -#: pisi/atomicoperations.py:544 -msgid "MetaData format wrong (%s)" -msgstr "Metadata opmaak fout (%s)" - -#: pisi/atomicoperations.py:546 -msgid "* Adding '%s' to db... " -msgstr "* Toevoegen '%s' aan db... " - -#: pisi/atomicoperations.py:552 -msgid "Files XML '%s' cannot be found" -msgstr "Bestanden XML '%s' kunnen niet worden gevonden" - -#: pisi/atomicoperations.py:557 pisi/package.py:136 -msgid "Invalid %s" -msgstr "Onjuist %s" - -#: pisi/atomicoperations.py:566 -msgid "OK." -msgstr "OK." - -#: pisi/build.py:88 -msgid "Path %s belongs in multiple packages" -msgstr "Pad %s behoort bij meerdere pakketten" - -#: pisi/build.py:114 -msgid "Source URI: %s" -msgstr "Bron URI: %s" - -#: pisi/build.py:118 -msgid "Source %s not found in any active repository." -msgstr "Bron %s niet gevonden in actieve repositories." - -#: pisi/build.py:183 -msgid "Building PiSi source package: %s" -msgstr "Compileren PiSi-bronpakket: %s " - -#: pisi/build.py:229 -msgid "IceCream detected. Make sure your daemon is up and running..." -msgstr "IceCream gevonden. Zorg dat uw daemon actief is..." - -#: pisi/build.py:234 -msgid "CCache detected..." -msgstr "Ccache gevonden..." - -#: pisi/build.py:287 -msgid "PartOf tag not defined, looking for component" -msgstr "PartOf' tag is niet omschreven, zoeken naar component" - -#: pisi/build.py:297 -msgid "Cannot find component.xml in upper directory" -msgstr "Kan component.xml niet vinden in hoger gelegen map" - -#: pisi/build.py:301 -msgid "Source is part of %s component" -msgstr "Bron is onderdeel van %s component" - -#: pisi/build.py:305 -msgid "Fetching source from: %s" -msgstr "Ophalen bron van: %s " - -#: pisi/build.py:307 -msgid "Source archive is stored: %s/%s" -msgstr "Bronarchief is opgeslagen: %s/%s" - -#: pisi/build.py:311 -msgid "Unpacking archive..." -msgstr "Uitpakken archief..." - -#: pisi/build.py:313 -msgid " unpacked (%s)" -msgstr " uitgepakt (%s)" - -#: pisi/build.py:318 -msgid "Setting up source..." -msgstr "Instellen bron..." - -#: pisi/build.py:323 -msgid "Building source..." -msgstr "Compileren bron..." - -#: pisi/build.py:328 -msgid "Installing..." -msgstr "Installeren..." - -#: pisi/build.py:370 -msgid "Unable to read Actions Script (%s): %s" -msgstr "Kan Actions Script niet lezen (%s): %s" - -#: pisi/build.py:372 -msgid "SyntaxError in Actions Script (%s): %s" -msgstr "Syntaxfout in Actions Script (%s): %s" - -#: pisi/build.py:389 -msgid "Unable to read COMAR script (%s): %s" -msgstr "Kan COMAR script niet lezen (%s): %s" - -#: pisi/build.py:391 -msgid "SyntaxError in COMAR file (%s): %s" -msgstr "Syntaxfout in COMARbestand (%s): %s" - -#: pisi/build.py:417 -msgid "unable to call function from actions: %s" -msgstr "kan functie niet aanroepen vanuit actions: %s" - -#: pisi/build.py:433 -msgid "" -"Safety switch: following extra packages in system.devel will be installed: " -msgstr "" -"Veiligheidsprocedure: de volgende extra pakketten in system.devel zullen " -"geïnstalleerd worden:" - -#: pisi/build.py:438 -msgid "Safety switch: system.devel is already installed" -msgstr "Veiligheidsprocedure: system.devel is al geïnstalleerd" - -#: pisi/build.py:440 -msgid "Safety switch: the component system.devel cannot be found" -msgstr "Veiligheidsprocedure: het component system.devel niet gevonden" - -#: pisi/build.py:449 -msgid "Unsatisfied Build Dependencies:" -msgstr "Niet-opgeloste compileerafhankelijkheden:" - -#: pisi/build.py:453 -msgid "Cannot build package due to unsatisfied build dependencies" -msgstr "" -"Kan pakket niet compileren wegens niet-opgeloste compileerafhankelijkheden" - -#: pisi/build.py:461 -msgid "Build dependency %s cannot be satisfied" -msgstr "Compileerafhankelijkheid %s niet opgelost." - -#: pisi/build.py:463 -msgid "Do you want to install the unsatisfied build dependencies" -msgstr "Wilt u de niet-opgeloste compileerafhankelijkheden installeren?" - -#: pisi/build.py:464 -msgid "Installing build dependencies." -msgstr "Installeren compileerafhankelijkheden." - -#: pisi/build.py:469 -msgid "Ignoring build dependencies." -msgstr "Negeren compileerafhankelijkheden." - -#: pisi/build.py:479 -msgid "Patch file is missing: %s\n" -msgstr "Patch-bestand ontbreekt: %s\n" - -#: pisi/build.py:492 -msgid "* Applying patch: %s" -msgstr "* Patch toepassen: %s" - -#: pisi/build.py:550 -msgid "Stripping files.." -msgstr "Strippen bestanden..." - -#: pisi/build.py:656 -msgid "(found old version %s)" -msgstr "(gevonden oude versie %s)" - -#: pisi/build.py:658 -msgid "Skipping %s with wrong pkg name " -msgstr "Overslaan %s met onjuiste pakketnaam" - -#: pisi/build.py:679 -msgid "(no previous build found, setting build no to 1.)" -msgstr "(geen eerdere compilatie gevonden, zet compilatienummer op 1.)" - -#: pisi/build.py:724 -msgid "(old package lacks a build no, setting build no to 1.)" -msgstr "(oud pakket heeft geen compilatienummer, zet compilatienummer op 1.)" - -#: pisi/build.py:727 -msgid "There are changes, incrementing build no to %d" -msgstr "Er zijn wijzigingen, zet compilatienummer op %d " - -#: pisi/build.py:730 -msgid "There is no change from previous build %d" -msgstr "Er zijn geen wijzigingen sinds vorige compilatie %d" - -#: pisi/build.py:795 -msgid "No user named '%s' found on the system" -msgstr "" - -#: pisi/build.py:800 -msgid "No group named '%s' found on the system" -msgstr "" - -#: pisi/build.py:803 -msgid "** Building package %s" -msgstr "** compileren pakket %s" - -# pisi/build.py:503 :506 -#: pisi/build.py:805 pisi/build.py:808 -msgid "Generating %s," -msgstr "Genereren %s." - -#: pisi/build.py:814 -msgid "" -"Build number is not available. For repo builds you must enable buildno in " -"pisi.conf." -msgstr "" -"Compilatienummer is niet aanwezig. Bij repo-compilaties moet u buildno " -"inschakelen in pisi.conf." - -#: pisi/build.py:832 -msgid "Creating PiSi package %s." -msgstr "Aanmaken PiSi-pakket %s." - -#: pisi/build.py:877 -msgid "Done." -msgstr "Gereed." - -#: pisi/build.py:883 -msgid "Abandoned files under the install dir (%s):" -msgstr "Verlaten bestanden in de installatiemap (%s):" - -#: pisi/build.py:887 -msgid "" -"All of the files under the install dir (%s) has been collected by package(s)" -msgstr "" -"Alle bestanden in de installatiemap (%s) zijn verzameld door pakket(ten)." - -#: pisi/build.py:891 -msgid "Cleaning Build Directory..." -msgstr "Opschonen compilatiemap..." - -#: pisi/build.py:894 -msgid "Keeping Build Directory" -msgstr "Behouden compilatiemap" - -#: pisi/cli/__init__.py:79 -msgid "Warning: " -msgstr "Waarschuwing: " - -#: pisi/cli/__init__.py:88 -msgid "Error: " -msgstr "Fout: " - -#: pisi/cli/__init__.py:120 -msgid " (yes/no)" -msgstr " (ja/nee)" - -#: pisi/cli/__init__.py:141 -msgid " [complete]\n" -msgstr " [compleet]\n" - -#: pisi/cli/__init__.py:151 -msgid "Installed %s" -msgstr "Geïnstalleerd %s" - -#: pisi/cli/__init__.py:153 -msgid "Removed %s" -msgstr "Verwijderd %s" - -#: pisi/cli/__init__.py:155 -msgid "Upgraded %s" -msgstr "Opgewaardeerd %s" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/cli/__init__.py:157 -msgid "Configured %s" -msgstr "Geconfigureerd %s" - -#: pisi/cli/__init__.py:159 -msgid "Extracting the files of %s" -msgstr "Uitpakken bestanden uitpakken van %s" - -#: pisi/cli/commands.py:94 -msgid "generic help string for any command" -msgstr "algemene helptekst voor elk commando" - -#: pisi/cli/commands.py:123 pisi/cli/pisicli.py:104 -msgid "Unrecognized command: %s" -msgstr "Niet herkend commando: %s" - -#: pisi/cli/commands.py:145 -msgid "common options" -msgstr "standaard opties" - -# pisi/build.py:503 :506 -#: pisi/cli/commands.py:148 -msgid "general options" -msgstr "algemene opties" - -#: pisi/cli/commands.py:151 -msgid "Change the system root for PiSi commands" -msgstr "Wijzig de systeem root voor PiSi commando's" - -#: pisi/cli/commands.py:153 -msgid "Assume yes in all yes/no queries" -msgstr "Uitgaan van ja bij alle ja/nee vragen" - -#: pisi/cli/commands.py:158 -msgid "Detailed output" -msgstr "Gedetailleerde uitvoer" - -#: pisi/cli/commands.py:160 -msgid "Show debugging information" -msgstr "Toon debuginformatie" - -#: pisi/cli/commands.py:162 -msgid "Suppresses all coloring of PiSi's output" -msgstr "Onderdrukt kleuren van PiSi uitvoer" - -#: pisi/cli/commands.py:169 -msgid "" -"This is a fall back function. If the implementer module provides an\n" -" options function it will be called" -msgstr "" -"Dit is een terugvalfunctie. Als de geïmplementeerde module een\n" -" opties-functie heeft wordt deze aangeroepen" - -#: pisi/cli/commands.py:181 -msgid "Destination directory %s does not exist. Creating directory.\n" -msgstr "Doelmap %s bestaat niet. Aanmaken map.\n" - -#: pisi/cli/commands.py:203 -msgid "Password: " -msgstr "Wachtwoord: " - -#: pisi/cli/commands.py:209 -msgid "initialize PiSi components" -msgstr "Initialiseren PiSi-componenten" - -#: pisi/cli/commands.py:217 -msgid "do cleanup work for PiSi components" -msgstr "opruimwerk voor PiSi-componenten uitvoeren" - -#: pisi/cli/commands.py:231 -msgid "print help for the command" -msgstr "toon hulp over het commando" - -#: pisi/cli/commands.py:237 -msgid "exit program" -msgstr "afsluiten programma" - -#: pisi/cli/commands.py:239 -msgid "Command terminated abnormally." -msgstr "Commando abnormaal gestopt." - -#: pisi/cli/commands.py:249 -msgid "Command lacks name" -msgstr "Commando is naamloos" - -#: pisi/cli/commands.py:253 -msgid "Duplicate command %s" -msgstr "Dupliceer commando %s" - -#: pisi/cli/commands.py:262 -msgid "" -"Prints help for given commands\n" -"\n" -"Usage: help [ ... ]\n" -"\n" -"If run without parameters, it prints the general help." -msgstr "" -"Toon hulp over het gegeven commando\n" -"\n" -"Gebruik: help [ ... ]\n" -"\n" -"Zonder parameters toont het algemene hulp." - -#: pisi/cli/commands.py:296 -msgid "" -"Clean stale locks\n" -"\n" -"Usage: clean\n" -"\n" -"PiSi uses filesystem locks for managing database access.\n" -"This command deletes unused locks from the database directory." -msgstr "" -"Ruim oude sloten op\n" -"\n" -"Gebruik: clean\n" -"\n" -"PiSi gebruikt bestandssysteemsloten voor het beheren van de databasetoegang\n" -"Dit commando verwijdert ongebruikte sloten in de databasemap." - -#: pisi/cli/commands.py:315 -msgid "" -"Delete cache files\n" -"\n" -"Usage: delete-cache\n" -"\n" -"Sources, packages and temporary files are stored\n" -"under /var directory. Since these accumulate they can\n" -"consume a lot of disk space." -msgstr "" -"Verwijder cachebestanden\n" -"\n" -"Gebruik: delete-cache\n" -"\n" -"Bronnen, pakketten en tijdelijke bestanden worden opgeslagen\n" -"in de map /var. Omdat ze opstapelen kunnen ze veel \n" -"schijfruimte in beslag nemen." - -#: pisi/cli/commands.py:336 -msgid "" -"Graph package relations\n" -"\n" -"Usage: graph [ ...]\n" -"\n" -"Write a graph of package relations, tracking dependency and\n" -"conflicts relations starting from given packages. By default\n" -"shows the package relations among repository packages, and writes\n" -"the package in graphviz format to 'pgraph.dot'.\n" -msgstr "" -"Grafische pakketrelatie\n" -"\n" -"Gebruik: graph [ ...]\n" -"\n" -"Toont een grafiek van pakketrelaties, zoekt afhankelijkheden en\n" -"conflictrelaties van de opgegeven pakketten. Standaard\n" -"worden pakketrelaties tussen repositoy-pakketten weergegeven, en\n" -"worden pakketten in graphviz-formaat naar pgraph.dot geschreven.\n" - -#: pisi/cli/commands.py:353 -msgid "graph options" -msgstr "grafische opties" - -#: pisi/cli/commands.py:357 -msgid "Specify a particular repository" -msgstr "Geef een bepaalde repository aan" - -#: pisi/cli/commands.py:360 -msgid "Graph of installed packages" -msgstr "Grafiek van geïnstalleerde pakketten" - -#: pisi/cli/commands.py:363 -msgid "Do not show installed packages" -msgstr "Geïnstalleerde pakketten niet weergeven" - -#: pisi/cli/commands.py:366 -msgid "Dot output file" -msgstr "Dot uitvoerbestand" - -#: pisi/cli/commands.py:377 -msgid "Plotting packages in repository %s" -msgstr "Plot pakketten in repository %s" - -#: pisi/cli/commands.py:383 -msgid "Plotting a graph of relations among all repository packages" -msgstr "Plot een grafiek van de relaties tussen alle repositoy-pakketten" - -#: pisi/cli/commands.py:390 -msgid "Plotting a graph of relations among all installed packages" -msgstr "Plot een grafiek van de relaties tussen alle geïnstalleerde pakketten" - -#: pisi/cli/commands.py:402 -msgid "Do not take build no into account." -msgstr "Compileernummer niet meerekenen." - -#: pisi/cli/commands.py:407 -msgid "Do not take dependency information into account" -msgstr "Geen rekening houden met afhankelijkheidsinformatie" - -#: pisi/cli/commands.py:411 -msgid "" -"Build PiSi packages\n" -"\n" -"Usage: build [ | ] ...\n" -"\n" -"You can give a URI of the pspec.xml file. PiSi will\n" -"fetch all necessary files and build the package for you.\n" -"\n" -"Alternatively, you can give the name of a source package\n" -"to be downloaded from a repository containing sources.\n" -msgstr "" -"Compileer PiSi-pakket\n" -"\n" -"Gebruik: build [ | ] ...\n" -"\n" -"U kunt een URI van het pspec.xml bestand geven. PiSi zal\n" -"all de benodigde bestanden samenvoegen en een pakket bouwen.\n" -"\n" -"Als alternatief kunt u de naam van het bronpakket opgeven\n" -"dat gedownload moet worden van een repository die de broncode bevat.\n" - -#: pisi/cli/commands.py:433 -msgid "build options" -msgstr "compilatie opties" - -#: pisi/cli/commands.py:441 -msgid "Output directory for produced packages" -msgstr "Doelmap voor geproduceerde pakketten" - -#: pisi/cli/commands.py:444 -msgid "Bypass errors from ActionsAPI" -msgstr "Omzeilen fouten van ActionsAPI" - -#: pisi/cli/commands.py:446 pisi/cli/commands.py:554 -msgid "Bypass safety switch" -msgstr "Omzeilen veiligheidsprocedure" - -#: pisi/cli/commands.py:448 -msgid "Create a static package with ar files" -msgstr "Maak een statisch pakket met ar-bestanden aan" - -#: pisi/cli/commands.py:450 -msgid "" -"Do not install build dependencies, fail if a build dependency is present" -msgstr "" -"Installeer geen compileerafhankelijkheden, stoppen als zich een " -"compileerafhankelijkheid voordoet" - -#: pisi/cli/commands.py:452 -msgid "PiSi binary package formats: '1.0', '1.1' (default)" -msgstr "PiSi binaire pakket formaten: '1.0', '1.1' (standaard)" - -#: pisi/cli/commands.py:455 -msgid "build steps" -msgstr "compilatie stappen" - -#: pisi/cli/commands.py:457 -msgid "Break build after fetching the source archive" -msgstr "Breek Compilatie af na ophalen bron archief" - -#: pisi/cli/commands.py:459 -msgid "" -"Break build after unpacking the source archive, checking sha1sum and " -"applying patches" -msgstr "" -"Breek compilatie af na uitpakken van het bron archief, controlleert sha1sum " -"en herstelt" - -#: pisi/cli/commands.py:461 -msgid "Break build after running configure step" -msgstr "Breek compilatie af na uitvoeren van de configuratie stap" - -#: pisi/cli/commands.py:463 -msgid "Break build after running compile step" -msgstr "Breek compilatie af na uitvoeren van de compilatie stap" - -#: pisi/cli/commands.py:465 -msgid "Break build after running install step" -msgstr "Breek compilatie af na uitvoeren van de installatie stap" - -#: pisi/cli/commands.py:467 -msgid "create PiSi package" -msgstr "Aanmaken PiSi-pakket" - -#: pisi/cli/commands.py:481 -msgid "package_format must be one of %s " -msgstr "package_format moet zijn %s " - -#: pisi/cli/commands.py:484 pisi/cli/commands.py:533 -msgid "Output directory: %s" -msgstr "Doelmap: %s" - -#: pisi/cli/commands.py:486 -msgid "Outputting packages in the working directory." -msgstr "Uitvoeren pakketten naar de werkmap." - -#: pisi/cli/commands.py:497 -msgid "" -"Build and install PiSi source packages from repository\n" -"\n" -"Usage: emerge ...\n" -"\n" -"You should give the name of a source package to be\n" -"downloaded from a repository containing sources.\n" -"\n" -"You can also give the name of a component.\n" -msgstr "" -"Compileer en installleer PiSi pakketten vanaf de repository\n" -"\n" -"Gebruik: emerge ...\n" -"\n" -"U geeft de naam op van het bronpakket dat\n" -"u wilt downloaden van de repository die de broncode bevat.\n" -"\n" -"U kunt ook de naam van een component opgeven.\n" - -#: pisi/cli/commands.py:516 -msgid "emerge options" -msgstr "duik opties op" - -#: pisi/cli/commands.py:519 pisi/cli/commands.py:592 pisi/cli/commands.py:656 -msgid "Ignore file conflicts" -msgstr "Negeer bestandsconflicten" - -#: pisi/cli/commands.py:521 pisi/cli/commands.py:594 pisi/cli/commands.py:658 -msgid "Ignore package conflicts" -msgstr "Negeer pakketconflicten" - -#: pisi/cli/commands.py:523 pisi/cli/commands.py:552 -msgid "Bypass comar configuration agent" -msgstr "Omzeil Comar-configuratieagent" - -#: pisi/cli/commands.py:535 -msgid "Outputting binary packages in the package cache." -msgstr "Uitvoeren binaire pakketten naar de pakketcache." - -#: pisi/cli/commands.py:543 -msgid "Abstract package operation command" -msgstr "Abstract pakket handelingscommando" - -#: pisi/cli/commands.py:556 -msgid "Do not perform any action, just show what would be done" -msgstr "Geen acties uitvoeren, geef alleen weer wat er zou gebeuren" - -#: pisi/cli/commands.py:567 -msgid "" -"Install PiSi packages\n" -"\n" -"Usage: install ... \n" -"\n" -"You may use filenames, URI's or package names for packages. If you have\n" -"specified a package name, it should exist in a specified repository.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"Installeer PiSi pakketten\n" -"\n" -"Gebruik: install ... \n" -"\n" -"U kunt bestandsnamen, URI-adressen of pakketnamen gebruiken voor pakketten.\n" -"U kunt alleen namen opgeven van pakketten die aanwezig zijn in een bepaalde " -"repository.\n" -"\n" -"U kunt ook componenten opgeven in plaats van pakketnamen, deze zullen dan " -"worden uitgebreid tot pakketnamen.\n" - -#: pisi/cli/commands.py:585 -msgid "install options" -msgstr "installatie opties" - -#: pisi/cli/commands.py:590 -msgid "Reinstall already installed packages" -msgstr "Herïnstalleer reeds geïnstalleerde pakketten" - -#: pisi/cli/commands.py:596 -msgid "Install component's and recursive components' packages" -msgstr "Installeer componenten en de pakketten van recursieve componenten" - -#: pisi/cli/commands.py:598 pisi/cli/commands.py:662 -msgid "Fetch upgrades but do not install." -msgstr "Haal bijgewerkte bestanden op maar installeer ze niet." - -#: pisi/cli/commands.py:621 -msgid "" -"Upgrade PiSi packages\n" -"\n" -"Usage: Upgrade [ ... ]\n" -"\n" -": package name\n" -"\n" -"Upgrades the entire system if no package names are given\n" -"\n" -"You may use only package names to specify packages because\n" -"the package upgrade operation is defined only with respect\n" -"to repositories. If you have specified a package name, it\n" -"should exist in the package repositories. If you just want to\n" -"reinstall a package from a PiSi file, use the install command.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"Opwaarderen PiSi-pakketten\n" -"\n" -"Gebruik: Upgrade [ ... ]\n" -"\n" -": pakketnaam\n" -"\n" -"Waardeert het hele systeem op als er geen pakketnaam wordt gegeven\n" -"\n" -"U mag alleen pakketnamen gebruiken om pakketten op te geven\n" -"omdat het opwaarderen van de pakketten alleen via de repositories plaats " -"vindt.\n" -"Als u een pakketnaam opgeeft moet deze in de repositories aanwezig zijn. Als " -"u een \n" -"pakket opnieuw wilt installeren vanuit een pisi-bestand kunt u beter " -"install commando gebruiken.\n" -"\n" -"U kunt ook componenten opgeven in plaats van pakketnamen, deze zullen worden " -"uitgebreid tot pakketnamen.\n" - -#: pisi/cli/commands.py:647 -msgid "upgrade options" -msgstr "bijwerk opties" - -#: pisi/cli/commands.py:652 -msgid "Security related package upgrades only" -msgstr "Alleen beveiligingspakketten bijwerken" - -#: pisi/cli/commands.py:654 -msgid "Do not update repositories" -msgstr "Repositories niet bijwerken" - -#: pisi/cli/commands.py:660 -#, fuzzy -msgid "Upgrade component's and recursive components' packages" -msgstr "Verwijder componenten en de pakketten van recursieve componenten" - -#: pisi/cli/commands.py:664 -msgid "" -"When upgrading system, ignore packages and components whose basenames match " -"pattern." -msgstr "" -"Bij het opwaarderen van het systeem, pakketten en componenten negeren " -"waarbij basenames overeenkomen met patroon." - -#: pisi/cli/commands.py:666 -msgid "" -"When upgrading system, ignore packages and components whose " -"basenames match any pattern contained in file." -msgstr "" -"Als het systeem bijgewerkt wordt, pakketten en componenten negeren waarbij " -"basenames overeenkomen met ieder patroon in bestand." - -#: pisi/cli/commands.py:706 -msgid "Updating repositories" -msgstr "Bijwerken repositories" - -#: pisi/cli/commands.py:711 -msgid "Will not update repositories" -msgstr "Zal repositories niet bijwerken" - -#: pisi/cli/commands.py:733 -msgid "" -"Remove PiSi packages\n" -"\n" -"Usage: remove ... \n" -"\n" -"Remove package(s) from your system. Just give the package names to remove.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"Verwijder PiSi-pakketten\n" -"\n" -"Gebruik: remove ... \n" -"\n" -"Verwijder pakketten van uw systeem. Geef de pakketnamen om ze te " -"verwijderen.\n" -"\n" -"U kunt ook componenten opgeven in plaats van pakketnamen, deze zullen " -"worden uitgebreid tot pakketnamen.\n" - -#: pisi/cli/commands.py:750 -msgid "remove options" -msgstr "verwijder opties" - -#: pisi/cli/commands.py:753 -msgid "Remove component's and recursive components' packages" -msgstr "Verwijder componenten en de pakketten van recursieve componenten" - -#: pisi/cli/commands.py:775 -msgid "" -"Configure pending packages\n" -"\n" -"If COMAR configuration of some packages were not\n" -"done at installation time, they are added to a list\n" -"of packages waiting to be configured. This command\n" -"configures those packages.\n" -msgstr "" -"Configureer wachtende pakketten\n" -"\n" -"Als de COMAR-configuratie van sommige pakketten niet\n" -"afgerond is tijdens de installatie, dan zullen ze toegevoegd worden aan\n" -"een lijst van pakketten in de wachtrij voor configuratie. Dit commando\n" -"configureert deze pakketten.\n" - -#: pisi/cli/commands.py:791 -msgid "configure-pending options" -msgstr "wachtende configuratie opties" - -#: pisi/cli/commands.py:803 -msgid "" -"Display package information\n" -"\n" -"Usage: info ... \n" -"\n" -" is either a package name or a .pisi file,\n" -msgstr "" -"Toon pakketinformatie\n" -"\n" -"Gebruik: info ... \n" -"\n" -" is ofwel een pakketnaam ofwel een .pisi bestand.\n" - -#: pisi/cli/commands.py:818 -msgid "info options" -msgstr "info opties" - -#: pisi/cli/commands.py:825 -msgid "Show a list of package files." -msgstr "Toon een lijst van pakketbestanden." - -#: pisi/cli/commands.py:827 -msgid "Info about the given component" -msgstr "Info van het gegeven component" - -#: pisi/cli/commands.py:830 -msgid "Show only paths." -msgstr "Toon alleen paden." - -#: pisi/cli/commands.py:832 -msgid "Do not show details" -msgstr "Geen details tonen" - -#: pisi/cli/commands.py:834 -msgid "Output in xml format" -msgstr "Uitvoer in xml-opmaak" - -#: pisi/cli/commands.py:880 -msgid "Package file: %s" -msgstr "Pakketbestand: %s" - -#: pisi/cli/commands.py:886 -msgid "[inst] " -msgstr "[inst] " - -#: pisi/cli/commands.py:888 -msgid "Installed package:" -msgstr "Geïnstalleerd pakket:" - -#: pisi/cli/commands.py:894 -msgid "[repo] " -msgstr "[repo] " - -#: pisi/cli/commands.py:896 -msgid "Package found in repository:" -msgstr "Pakket gevonden in repository:" - -#: pisi/cli/commands.py:900 -#, fuzzy -msgid "%s is not found in repositories" -msgstr "Zal repositories niet bijwerken" - -#: pisi/cli/commands.py:903 -#, fuzzy -msgid "%s is not installed" -msgstr "Pakket %s is niet geïnstalleerd." - -#: pisi/cli/commands.py:916 -msgid "Reverse Dependencies:" -msgstr "Omgekeerde afhankelijkheden:" - -#: pisi/cli/commands.py:919 -msgid "" -"\n" -"Files:" -msgstr "" -"\n" -"Bestanden:" - -#: pisi/cli/commands.py:927 -msgid "File information not available" -msgstr "Bestandsinformatie niet aanwezig" - -#: pisi/cli/commands.py:933 -msgid "" -"Verify installation\n" -"\n" -"Usage: check [ ... ]\n" -"\n" -": package name\n" -"\n" -"A cryptographic checksum is stored for each installed\n" -"file. Check command uses the checksums to verify a package.\n" -"Just give the names of packages.\n" -"\n" -"If no packages are given, checks all installed packages.\n" -msgstr "" -"Verifiëer installatie\n" -"\n" -"Gebruik: check [ ... ]\n" -"\n" -": pakketnaam\n" -"\n" -"Een cryptografische controlesom wordt opgeslagen voor ieder geïnstalleerd\n" -"bestand. Het check commando gebruikt de controlesommen om pakketten te " -"verifiëren.\n" -"Geef slechts de namen van pakketten op.\n" -"\n" -"Als er geen pakketten opgegeven worden, worden alle pakketen nagekeken.\n" - -#: pisi/cli/commands.py:957 -msgid "Checking all installed packages" -msgstr "Controleren alle geïnstalleerde pakketten" - -#: pisi/cli/commands.py:960 -msgid "* Checking %s... " -msgstr "* Contrôle %s... " - -#: pisi/cli/commands.py:964 -msgid "" -"\n" -"Package %s is corrupt." -msgstr "" -"\n" -"Pakket %s is beschadigd." - -#: pisi/cli/commands.py:968 -msgid "Package %s not installed" -msgstr "Pakket %s niet geïnstalleerd" - -#: pisi/cli/commands.py:973 -msgid "" -"Index PiSi files in a given directory\n" -"\n" -"Usage: index ...\n" -"\n" -"This command searches for all PiSi files in a directory, collects PiSi\n" -"tags from them and accumulates the information in an output XML file,\n" -"named by default 'pisi-index.xml'. In particular, it indexes both\n" -"source and binary packages.\n" -"\n" -"If you give multiple directories, the command still works, but puts\n" -"everything in a single index file.\n" -msgstr "" -"Indexeer PiSi-bestanden in een opgegeven map\n" -"\n" -"Gebruik: index ...\n" -"\n" -"Dit commando zoekt naar alle PiSi-bestanden in een map, verzamelt PiSi\n" -"tags en zet de verkregen informatie in een XML-bestand, standaard\n" -"pisi-index.xml genoemd. In het bijzonder indexeert het zowel bron- als " -"binaire pakketten.\n" -"\n" -"Als u meerdere mappen opgeeft, werkt het commando nog steeds, maar\n" -"zal het alles in één index bestand zetten.\n" - -#: pisi/cli/commands.py:994 -msgid "index options" -msgstr "index opties" - -#: pisi/cli/commands.py:998 -msgid "Store absolute links for indexed files." -msgstr "Opslaan absolute koppelingen voor geïndexeerde bestanden." - -#: pisi/cli/commands.py:1001 -msgid "Index output file" -msgstr "Index-uitvoerbestand" - -#: pisi/cli/commands.py:1004 -msgid "Do not index PiSi spec files." -msgstr "Niet indexeren PiSi-specifieke bestanden." - -#: pisi/cli/commands.py:1007 -msgid "Do not sign index." -msgstr "Niet ondertekenen index." - -#: pisi/cli/commands.py:1020 -msgid "Indexing current directory." -msgstr "Indexeren huidige map." - -#: pisi/cli/commands.py:1028 -msgid "" -"Print the list of all installed packages\n" -"\n" -"Usage: list-installed\n" -msgstr "" -"Toon een lijst van alle geïnstalleerde pakketten\n" -"\n" -"Gebruik: list-installed\n" - -#: pisi/cli/commands.py:1042 -msgid "list-installed options" -msgstr "list-installed opties" - -#: pisi/cli/commands.py:1045 pisi/cli/commands.py:1278 -#: pisi/cli/commands.py:1342 pisi/cli/commands.py:1381 -#: pisi/cli/commands.py:1421 pisi/cli/commands.py:1555 -msgid "Show in long format" -msgstr "Toon in lang formaat" - -#: pisi/cli/commands.py:1047 -msgid "List installed packages under given component" -msgstr "Toon geïnstalleerde pakketten onder gegeven component" - -#: pisi/cli/commands.py:1049 pisi/cli/commands.py:1425 -msgid "Show detailed install info" -msgstr "Toon gedetailleerde installatie-informatie" - -# pisi/cli/commands.py:542 :729 -#: pisi/cli/commands.py:1066 pisi/cli/commands.py:1444 -msgid "" -"Package Name |St| Version| Rel.| Build| Distro| Date" -msgstr "" -"Pakketnaam |St| Versie| Rel.| Compilatie| Distro| Datum" - -#: pisi/cli/commands.py:1081 -msgid "" -"Rebuild Databases\n" -"\n" -"Usage: rebuilddb [ ... ]\n" -"\n" -"Rebuilds the PiSi databases\n" -"\n" -"If package specs are given, they should be the names of package\n" -"dirs under /var/lib/pisi\n" -msgstr "" -"Herbouw databases\n" -"\n" -"Gebruik: rebuilddb [ ... ]\n" -"\n" -"Herbouwt de PiSi-databases\n" -"\n" -"Als pakketspecificaties worden gegeven, geef dan de namen van de\n" -"pakketmappen onder /var/lib/pisi\n" - -#: pisi/cli/commands.py:1099 -msgid "rebuild-db options" -msgstr "rebuild-db opties" - -#: pisi/cli/commands.py:1102 -msgid "Rebuild files database" -msgstr "Herbouw bestanden database" - -#: pisi/cli/commands.py:1113 -msgid "Rebuild PiSi databases?" -msgstr "PiSi-databases herbouwen?" - -#: pisi/cli/commands.py:1120 -msgid "" -"Update repository databases\n" -"\n" -"Usage: update-repo [ ... ]\n" -"\n" -": repository name\n" -"\n" -"Synchronizes the PiSi databases with the current repository.\n" -"If no repository is given, all repositories are updated.\n" -msgstr "" -"Bijwerken repositorydatabases\n" -"\n" -"Gebruik: update-repo [ ... ]\n" -"\n" -": repositorynaam\n" -"\n" -"Synchroniseert de PiSi-databases met de huidige repository.\n" -"Indien geen repository opgegeven is worden alle repositories bijgewerkt.\n" - -#: pisi/cli/commands.py:1138 -msgid "update-repo options" -msgstr "update-repo opties" - -#: pisi/cli/commands.py:1142 -msgid "Update database in any case" -msgstr "Database altijd bijwerken" - -#: pisi/cli/commands.py:1160 -msgid "" -"Add a repository\n" -"\n" -"Usage: add-repo \n" -"\n" -": name of repository to add\n" -": URI of index file\n" -"\n" -"If no repo is given, add-repo pardus-devel repo is added by default\n" -"\n" -"NB: We support only local files (e.g., /a/b/c) and http:// URIs at the " -"moment\n" -msgstr "" -"Toevoegen repository\n" -"\n" -"Gebruik: add-repo \n" -"\n" -": naam van de toe te voegen repository\n" -": URL van het indexbestand\n" -"\n" -"Indien geen repo wordt opgegeven, wordt add-repo pardus-devel repo standaard " -"toegevoegd\n" -"\n" -"Opmerking: we ondersteunen vooralsnog alleen lokale bestanden (b.v. /a/b/c) " -"en http: // URI's.\n" - -#: pisi/cli/commands.py:1180 -msgid "add-repo options" -msgstr "add-repo opties" - -#: pisi/cli/commands.py:1183 -msgid "Add repository at given position (0 is first)" -msgstr "Toevoegen repository op gegeven positie (0 is eerst)" - -#: pisi/cli/commands.py:1197 -msgid "Update PiSi database for repository %s?" -msgstr "Bijwerken PiSi-database voor repository %s?" - -#: pisi/cli/commands.py:1201 -msgid "%s repository could not be reached. Removing %s from system." -msgstr "%s repository kan niet bereikt worden. Verwijderd %s van systeem." - -#: pisi/cli/commands.py:1210 -msgid "" -"Remove repositories\n" -"\n" -"Usage: remove-repo ... \n" -"\n" -"Remove all repository information from the system.\n" -msgstr "" -"Verwijder repositories\n" -"\n" -"Gebruik: remove-repo ... \n" -"\n" -"Verwijdert alle repository-informatie van het systeem.\n" - -#: pisi/cli/commands.py:1236 -msgid "" -"List repositories\n" -"\n" -"Usage: list-repo\n" -"\n" -"Lists currently tracked repositories.\n" -msgstr "" -"Toon repositories\n" -"\n" -"Gebruik: list-repo\n" -"\n" -"Toont de huidige opgespoorde repositories.\n" - -#: pisi/cli/commands.py:1259 -msgid "" -"List available packages in the repositories\n" -"\n" -"Usage: list-available [ ... repon ]\n" -"\n" -"Gives a brief list of PiSi packages published in the specified\n" -"repositories. If no repository is specified, we list packages in\n" -"all repositories.\n" -msgstr "" -"Toon beschikbare pakketten in de repositories\n" -"\n" -"Gebruik: list-available [ ... repon ]\n" -"\n" -"Geeft een korte lijst van de beschikbare PiSi-pakketten in de\n" -"opgegeven repositories. Indien geen repository\n" -"opgegeven is worden de pakketten in alle repositories\n" -"getoond.\n" - -#: pisi/cli/commands.py:1276 -msgid "list-available options" -msgstr "list-available opties" - -#: pisi/cli/commands.py:1280 -msgid "List available packages under given component" -msgstr "Toon aanwezige pakketten onder gegeven component" - -#: pisi/cli/commands.py:1282 -msgid "Show uninstalled packages only" -msgstr "Toon alleen niet-geïnstalleerde pakketten" - -#: pisi/cli/commands.py:1290 -msgid "Installed packages are shown in this color" -msgstr "Geïnstalleerde pakketten worden in deze kleur weergegeven" - -#: pisi/cli/commands.py:1298 -msgid "Repository : %s\n" -msgstr "Repository: %s\n" - -#: pisi/cli/commands.py:1325 -msgid "" -"List available components\n" -"\n" -"Usage: list-components\n" -"\n" -"Gives a brief list of PiSi components published in the\n" -"repositories.\n" -msgstr "" -"Toon beschikbare componenten\n" -"\n" -"Gebruik: list-components\n" -"\n" -"Geeft een korte lijst van PiSi componenten gepubliceerd in \n" -"de repositories.\n" - -#: pisi/cli/commands.py:1340 -msgid "list-components options" -msgstr "list-components opties" - -#: pisi/cli/commands.py:1365 -msgid "" -"List available sources\n" -"\n" -"Usage: list-sources\n" -"\n" -"Gives a brief list of sources published in the repositories.\n" -msgstr "" -"Toon beschikbare bronnen\n" -"\n" -"Gebruik: list-sources\n" -"\n" -"Geeft een korte lijst van bronnen in de repositories.\n" - -#: pisi/cli/commands.py:1379 -msgid "list-sources options" -msgstr "list-sources opties" - -#: pisi/cli/commands.py:1404 -msgid "" -"List packages to be upgraded\n" -"\n" -"Usage: list-upgrades\n" -"\n" -"Lists the packages that will be upgraded.\n" -msgstr "" -"Toon op te waarderen pakketten\n" -"\n" -"Gebruik: list-upgrades\n" -"\n" -"Toont pakketten die opgewaardeerd zullen worden.\n" - -#: pisi/cli/commands.py:1418 -msgid "list-upgrades options" -msgstr "list-upgrades opties" - -#: pisi/cli/commands.py:1423 -msgid "List upgradable packages under given component" -msgstr "Toon op te waarderen pakketten onder opgegeven component" - -#: pisi/cli/commands.py:1440 pisi/operations.py:466 -msgid "No packages to upgrade." -msgstr "Geen pakketten op te waarderen." - -#: pisi/cli/commands.py:1460 -msgid "" -"List pending packages\n" -"\n" -"Lists packages waiting to be configured.\n" -msgstr "" -"Toon wachtende pakketten\n" -"\n" -"Toont pakketten wachtend op configuratie\n" - -#: pisi/cli/commands.py:1482 -#, fuzzy -msgid "There are no packages waiting to be configured" -msgstr "" -"Toon wachtende pakketten\n" -"\n" -"Toont pakketten wachtend op configuratie\n" - -#: pisi/cli/commands.py:1487 -msgid "" -"Search packages\n" -"\n" -"Usage: search ... \n" -"\n" -"Finds a package containing specified search terms\n" -"in summary, description, and package name fields.\n" -msgstr "" -"Zoek pakketten\n" -"\n" -"Gebruik: search ... \n" -"\n" -"Vindt een pakket met de opgegeven zoekterm\n" -"in de samenvatting, beschrijving en/of pakketnaam.\n" - -#: pisi/cli/commands.py:1502 -msgid "search options" -msgstr "search opties" - -#: pisi/cli/commands.py:1505 -msgid "Set search language" -msgstr "Stel zoektaal in" - -#: pisi/cli/commands.py:1510 -msgid "Show details" -msgstr "Toon details" - -#: pisi/cli/commands.py:1530 -msgid "%s packages found" -msgstr "%s pakketten gevonden" - -#: pisi/cli/commands.py:1539 -msgid "" -"Search for a file\n" -"\n" -"Usage: search-file ... \n" -"\n" -"Finds the installed package which contains the specified file.\n" -msgstr "" -"Zoek een bestand\n" -"\n" -"Gebruik: search-file ... \n" -"\n" -"Vindt het geïnstalleerde pakket dat het opgegeven bestand bevat.\n" - -#: pisi/cli/commands.py:1553 -msgid "search-file options" -msgstr "search-file opties" - -#: pisi/cli/commands.py:1557 -msgid "Fuzzy search" -msgstr "Vage zoekopdracht" - -#: pisi/cli/commands.py:1559 -msgid "Show only package name" -msgstr "Toon alleen pakketnaam" - -#: pisi/cli/commands.py:1580 -msgid "Package %s has file %s" -msgstr "Pakket %s bevat bestand %s" - -#: pisi/cli/commands.py:1582 -msgid "Type: %s, Hash: %s" -msgstr "Type: %s, Hash: %s" - -#: pisi/cli/commands.py:1585 -msgid "Path '%s' does not belong to an installed package" -msgstr "Pad '%s' hoort niet bij een geïnstalleerd pakket" - -#: pisi/cli/commands.py:1598 -msgid "Searching for %s" -msgstr "Zoekt naar %s" - -#: pisi/cli/commands.py:1608 -msgid "" -"%prog [options] [arguments]\n" -"\n" -"where is one of:\n" -"\n" -msgstr "" -"%prog [opties] [argumenten]\n" -"\n" -"waar één is van:\n" -"\n" - -#: pisi/cli/commands.py:1614 -msgid "" -"\n" -"Use \"%prog help \" for help on a specific command.\n" -msgstr "" -"\n" -"Gebruik \"%prog help \" voor help over een specifiek commando.\n" - -#: pisi/cli/pisicli.py:56 -msgid "Options must precede non-option arguments" -msgstr "Opties moeten voorafgaan aan non-optie-argumenten" - -#: pisi/cli/pisicli.py:97 -msgid "No command given" -msgstr "Geen commando gegeven" - -#: pisi/cli/pisicli.py:100 -msgid "Command line parsing error" -msgstr "Fout bij ontleden van commando" - -#: pisi/comariface.py:54 -msgid "cannot connect to comar" -msgstr "kan geen verbinding maken met comar" - -#: pisi/comariface.py:72 -msgid "Could not restart comar" -msgstr "Kon comar niet herstarten" - -#: pisi/comariface.py:77 -msgid "connection with comar unexpectedly closed" -msgstr "verbinding met conmar onverwachts verbroken" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/comariface.py:90 -msgid "Configuration error: %s" -msgstr "Configuratiefout: %s" - -#: pisi/comariface.py:92 -msgid "Script error: %s" -msgstr "Scriptfout: %s" - -#: pisi/comariface.py:94 -msgid "comar denied our access" -msgstr "comar heeft de toegang geweigerd" - -#: pisi/comariface.py:99 -msgid "Configuring %s package" -msgstr "Configureren %s pakket" - -#: pisi/comariface.py:104 -msgid "Registering %s comar script" -msgstr "Registreren %s comar-script" - -#: pisi/comariface.py:110 -msgid "Calling post install handlers" -msgstr "Aanroepen post-installatie afhandelingen" - -#: pisi/comariface.py:115 -msgid "Running package's post install script" -msgstr "UItvoeren post-installatiescript van pakket" - -#: pisi/comariface.py:122 -msgid "Configuring %s package for removal" -msgstr "Configureren %s pakket voor verwijdering" - -#: pisi/comariface.py:125 -msgid "Running package's pre remove script" -msgstr "Uitvoeren pre-verwijderscript van pakket" - -#: pisi/comariface.py:129 -msgid "Calling pre remove handlers" -msgstr "Aanroepen pre-verwijder afhandelingen" - -#: pisi/comariface.py:133 -msgid "Unregistering comar scripts" -msgstr "Deregistreren comar-scripts" - -#: pisi/component.py:97 pisi/component.py:103 -msgid "Component %s not found" -msgstr "Component %s niet gevonden" - -#: pisi/component.py:199 pisi/component.py:225 -msgid "Information for component %s not available" -msgstr "Informatie voor component %s niet beschikbaar" - -#: pisi/config.py:61 -msgid "Destination directory %s does not exist. Creating it." -msgstr "Doelmap %s bestaat niet. Deze wordt nu aangemaakt." - -#: pisi/configfile.py:105 -msgid "No section by name '%s'" -msgstr "Geen sectie met de naam '%s'" - -#: pisi/conflict.py:39 pisi/dependency.py:40 -msgid " version >= " -msgstr " versie >= " - -#: pisi/conflict.py:41 pisi/dependency.py:42 -msgid " version <= " -msgstr " versie <= " - -#: pisi/conflict.py:43 pisi/dependency.py:44 -msgid " release >= " -msgstr " uitgave >= " - -#: pisi/conflict.py:45 pisi/dependency.py:46 -msgid " release <= " -msgstr " uitgave <= " - -#: pisi/constants.py:30 -msgid "Can't rebind constant: %s" -msgstr "Kan niet opnieuw koppelen aan constante: %s " - -#: pisi/constants.py:36 -msgid "Can't unbind constant: %s" -msgstr "Kan niet ontkoppelen van contante: %s" - -#: pisi/dependency.py:103 -msgid "Package %s does not satisfy dependency %s" -msgstr "Pakket %s voldoet niet aan afhankelijkheid %s" - -#: pisi/dependency.py:116 -msgid "Package %s is not present in the package database" -msgstr "Pakket %s niet aanwezig in de pakketdatabase" - -#: pisi/fetcher.py:81 -msgid "Filename error" -msgstr "Bestandsnaam fout" - -#: pisi/fetcher.py:84 -msgid "Access denied to write to destination directory: \"%s\"" -msgstr "Toegang geweigerd om te schrijven naar de doelmap: \"%s\"" - -#: pisi/fetcher.py:89 -msgid "Access denied to destination file: \"%s\"" -msgstr "Toegang geweigerd van doelbestand: \"%s\" " - -#: pisi/fetcher.py:100 -msgid "" -"A problem occured. Please check the archive address and/or permissions again." -msgstr "" -"Probleem plaatsgevonden. Controleer het archiefadres en/of de " -"toegangsrechten opnieuw." - -#: pisi/fetcher.py:158 -msgid "No such file or no permission to read" -msgstr "Bestand niet gevonden of geen leesrechten" - -#: pisi/fetcher.py:183 -msgid "Requested range not satisfiable, starting again." -msgstr "Verzocht bereik niet verwezenlijkbaar, opnieuw gestart." - -#: pisi/fetcher.py:190 -msgid "Cannot fetch %s; value error: %s" -msgstr "Kan %s niet ophalen. Foutcode: %s" - -#: pisi/fetcher.py:192 pisi/fetcher.py:194 pisi/fetcher.py:196 -msgid "Cannot fetch %s; %s" -msgstr "Kan niet ophalen %s; %s" - -#: pisi/fetcher.py:198 -msgid "Cannot fetch %s; (%s): %s" -msgstr "Kan niet ophalen %s; (%s): %s" - -#: pisi/fetcher.py:244 -msgid "Proxy configuration has been found for '%s' protocol" -msgstr "Proxy-configuratie gevonden voor '%s' protocol" - -#: pisi/fetcher.py:328 pisi/fetcher.py:349 pisi/fetcher.py:362 -msgid "ftp error" -msgstr "ftp fout" - -#: pisi/file.py:66 -msgid "uri must have type either URI or string" -msgstr "uri moet van het type URI-adres of tekenreeks zijn" - -#: pisi/file.py:89 -msgid "zip compression not supported yet" -msgstr "zip compressie nog niet ondersteund." - -#: pisi/file.py:117 -msgid "Fetching %s" -msgstr "Ophalen %s" - -#: pisi/file.py:122 -msgid "Copying %s to transfer dir" -msgstr "Kopiëren %s naar overdrachtmap" - -#: pisi/file.py:127 -msgid "File '%s' not found." -msgstr "Bestand '%s' niet gevonden." - -#: pisi/file.py:135 -msgid "File integrity of %s compromised." -msgstr "Bestandsintegriteit van %s is gecompromitteerd" - -#: pisi/file.py:155 -msgid "File mode must be either File.read or File.write" -msgstr "Bestandsmodus moet ofwel File.read ofwel File.write zijn" - -#: pisi/file.py:160 -msgid "Remote write not implemented" -msgstr "Schrijven op afstand niet geïmplementeerd" - -#: pisi/file.py:187 -msgid "gzip compression not supported yet" -msgstr "gzip-compressie nog niet ondersteund" - -#: pisi/file.py:202 pisi/file.py:205 -msgid "ERROR: gpg --detach-sig %s failed" -msgstr "FOUT: gpg --detach-sig %s is mislukt" - -#: pisi/graph.py:31 -msgid "Encountered cycle %s" -msgstr "Ondekt cyclus %s" - -#: pisi/index.py:92 -msgid "Adding %s to package index" -msgstr "Toevoegen %s aan pakketindex" - -#: pisi/index.py:95 -msgid "Adding %s to component index" -msgstr "Toevoegen %s aan componentindex" - -#: pisi/index.py:113 -msgid "Updating package database of %s" -msgstr "Bijwerken pakketdatabase van %s" - -#: pisi/index.py:141 -msgid "Package %s: metadata corrupt, skipping..." -msgstr "Pakket %s: metadata is corrupt, wordt overgeslagen..." - -#: pisi/index.py:169 -msgid "Adding %s to source index" -msgstr "Toevoegen %s aan bronindex" - -#: pisi/installdb.py:58 -msgid "installed" -msgstr "geïnstalleerd" - -#: pisi/installdb.py:58 -msgid "installed-pending" -msgstr "geïnstalleerd-wachtend" - -#: pisi/installdb.py:59 -msgid "purged" -msgstr "gezuiverd" - -#: pisi/installdb.py:59 -msgid "removed" -msgstr "verwijderd" - -#: pisi/installdb.py:62 -msgid "" -"State: %s\n" -"Version: %s, Release: %s, Build: %s\n" -msgstr "" -"Status: %s\n" -"Versie: %s, uitgave: %s, compilatie: %s\n" - -#: pisi/installdb.py:67 -msgid "Distribution: %s, Install Time: %s\n" -msgstr "Distributie: %s, installatietijd: %s\n" - -#: pisi/installdb.py:154 -msgid "Already installed" -msgstr "Reeds geïnstalleerd." - -#: pisi/itembyrepodb.py:120 -msgid "Invalid repository string" -msgstr "Ongeldige repositorytekst" - -#: pisi/itembyrepodb.py:142 -msgid "Key %s not found" -msgstr "Sleutel %s niet gevonden" - -#: pisi/itembyrepodb.py:152 -msgid "Key %s in repo %s not found" -msgstr "Sleutel %s in repo %s niet gevonden" - -#: pisi/lockeddbshelve.py:47 -msgid "Database version for %s insufficient. Please run rebuild-db command." -msgstr "" -"Databaseversie van %s is niet toereikend. Voer a.u.b. het commando rebuild-" -"db uit." - -#: pisi/lockeddbshelve.py:51 -msgid "" -"Database version for %s greater than PiSi version. You need a newer PiSi." -msgstr "" -"Databaseversie van %s is hoger dan de PiSi-versie. Een nieuwere versie van " -"PiSi is nodig." - -#: pisi/lockeddbshelve.py:62 -msgid "Cannot attain write access to database environment" -msgstr "Kan geen schrijftoegang tot de databaseomgeving krijgen" - -#: pisi/lockeddbshelve.py:64 -msgid "Database version %s not present." -msgstr "Databaseversie %s is niet aanwezig." - -#: pisi/lockeddbshelve.py:71 pisi/lockeddbshelve.py:153 -msgid "" -"Another instance of PiSi is running. Only one instance is allowed to modify " -"the PiSi database at a time." -msgstr "" -"Er draait nog een exemplaar van PiSi. Slechts één PiSi tegelijk kan de " -"database aanpassen." - -#: pisi/lockeddbshelve.py:81 -msgid "Cannot attain read access to database environment" -msgstr "Kan geen leestoegang tot de databaseomgeving krijgen" - -#: pisi/lockeddbshelve.py:95 -#, fuzzy -msgid "" -"Cannot attain write access to PiSi database. You have to be root for this " -"operation." -msgstr "Kan geen schrijftoegang tot de databaseomgeving krijgen" - -#: pisi/lockeddbshelve.py:113 -msgid "Cannot attain read or write access to database %s" -msgstr "Kan geen lees- of schrijftoegang krijgen tot de database %s" - -#: pisi/lockeddbshelve.py:139 -msgid "" -"Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" -msgstr "" -"Opties moeten een van 'r', 'w', 'c' of 'n' zijn of gebruik de opties bsddb." -"db.DB_*" - -#: pisi/metadata.py:58 -msgid "Distribution: %s, Dist. Release: %s\n" -msgstr "Distributie: %s, distributie-uitgave: %s\n" - -#: pisi/metadata.py:60 -msgid "Architecture: %s, Installed Size: %s" -msgstr "Architectuur: %s, installatiegrootte: %s" - -#: pisi/mirrors.py:46 -msgid "Mirrors file %s does not exist. Could not resolve mirrors://" -msgstr "Mirror bestand %s bestaat niet. Kan mirrors niet oplossen://" - -#: pisi/operations.py:114 -msgid "Mixing file names and package names not supported yet." -msgstr "Combineren van bestands- en pakketnamen nog niet ondersteund." - -#: pisi/operations.py:156 -msgid "" -"The following packages will be installed\n" -"in the respective order to satisfy extra dependencies:\n" -msgstr "" -"De volgende pakketten zullen geïnstalleerd worden\n" -"in de meest gunstige volgorde voor extra afhankelijkheden:\n" - -#: pisi/operations.py:159 pisi/operations.py:621 -msgid "Do you want to continue?" -msgstr "Wilt u doorgaan?" - -#: pisi/operations.py:160 -msgid "External dependencies not satisfied" -msgstr "Externe afhankelijkheden zijn niet voldaan" - -# pisi/api.py:168 :215 -#: pisi/operations.py:172 pisi/operations.py:339 -msgid "No packages to install." -msgstr "Geen te installeren pakketten." - -#: pisi/operations.py:203 -msgid "Installation order: " -msgstr "Installatievolgorde: " - -#: pisi/operations.py:257 pisi/operations.py:279 -msgid "Conflicts remain" -msgstr "Conflicten blijven bestaan" - -#: pisi/operations.py:267 -msgid "Selected packages [%s] are in conflict with each other." -msgstr "Geselecteerde pakketten [%s] zijn in conflict met elkaar." - -#: pisi/operations.py:273 -msgid "[%s conflicts with: %s]\n" -msgstr "[%s in conflict met %s]\n" - -#: pisi/operations.py:275 -msgid "" -"The following packages have conflicts:\n" -"%s" -msgstr "" -"De volgende pakketten hebben conflicten:\n" -"%s" - -#: pisi/operations.py:278 -msgid "Remove the following conflicting packages?" -msgstr "De volgende pakketten met conflicten verwijderen?" - -#: pisi/operations.py:305 -msgid "Safety switch: Following packages in system.base will be installed: " -msgstr "" -"Veiligheidsprocedure: de volgende pakketten in system.base worden " -"geïnstalleerd: " - -#: pisi/operations.py:311 -msgid "Safety switch: Following packages in system.base will be upgraded: " -msgstr "" -"Veiligheidsprocedure: de volgende pakketten in system.base worden " -"opgewaardeerd: " - -#: pisi/operations.py:317 pisi/operations.py:597 -msgid "Safety switch: the component system.base cannot be found" -msgstr "Veiligheidsprocedure: component system.base is niet gevonden" - -#: pisi/operations.py:334 -msgid "" -"The following package(s) are already installed and are not going to be " -"installed again:\n" -msgstr "" -"De volgende pakket(ten) zijn al geïnstalleerd en zullen niet opnieuw worden " -"geïnstalleerd:\n" - -#: pisi/operations.py:355 -msgid "" -"Following packages will be installed in the respective order to satisfy " -"dependencies:\n" -msgstr "" -"De volgende pakketten zullen geïnstalleerd worden in de respectievelijke " -"volgorde voor de afhankelijkheden:\n" - -#: pisi/operations.py:360 pisi/operations.py:491 -msgid "Total size of package(s): %.2f %s" -msgstr "Totale grootte van pakket(ten): %.2f %s" - -#: pisi/operations.py:366 pisi/operations.py:497 pisi/operations.py:709 -msgid "There are extra packages due to dependencies. Do you want to continue?" -msgstr "Er zijn extra pakketten wegens afhankelijkheden. Wilt u doorgaan?" - -#: pisi/operations.py:432 -msgid "Warning: package *name* ends with '.pisi'" -msgstr "Waarschuwing: pakket *naam* eindigt met '.pisi'" - -#: pisi/operations.py:435 -msgid "Package %s is not installed." -msgstr "Pakket %s is niet geïnstalleerd." - -#: pisi/operations.py:441 -msgid "Package %s is not available in repositories." -msgstr "Pakket %s is niet beschikbaar in de repositories." - -#: pisi/operations.py:453 -msgid "Package %s is already at the latest release %s." -msgstr "Pakket %s is al de laatste uitgave %s" - -#: pisi/operations.py:459 -msgid "Package %s is already at the latest build %s." -msgstr "Pakket %s is al de laatste compilatie %s." - -#: pisi/operations.py:486 -msgid "The following packages will be upgraded: " -msgstr "De volgende pakketen zullen worden opgewaardeerd: " - -#: pisi/operations.py:552 -msgid "Dependency %s of %s cannot be satisfied" -msgstr "Afhankelijkheid %s van %s kan niet worden voldaan" - -#: pisi/operations.py:553 -msgid "Upgrade is not possible." -msgstr "Opwaarderen niet mogelijk." - -#: pisi/operations.py:568 -msgid "Reverse dependency %s of %s cannot be satisfied" -msgstr "Omgekeerde afhankelijkheid %s van %s kan niet worden voldaan" - -#: pisi/operations.py:593 -msgid "Safety switch: cannot remove the following packages in system.base: " -msgstr "" -"Veiligheidsprocedure: kan de volgende pakketten niet verwijderen uit system." -"base: " - -#: pisi/operations.py:604 -msgid "Package %s does not exist. Cannot remove." -msgstr "Pakket %s bestaat niet." - -#: pisi/operations.py:608 -msgid "No packages to remove." -msgstr "Geen te verwijderen pakketten." - -#: pisi/operations.py:617 -msgid "" -"The following minimal list of packages will be removed\n" -"in the respective order to satisfy dependencies:\n" -msgstr "" -"De volgende minimale lijst van pakketten zullen verwijderd worden\n" -"in de respectievelijke volgorde om aan afhankelijkheden te voldoen:\n" - -#: pisi/operations.py:622 -msgid "Package removal declined" -msgstr "Verwijderen van pakket afgewezen." - -#: pisi/operations.py:634 -msgid "Package %s is not installed. Cannot remove." -msgstr "Pakket %s niet geïnstalleerd. Kan niet verwijderen." - -#: pisi/operations.py:683 -msgid "No packages to emerge." -msgstr "Geen samen te voegen pakketten." - -#: pisi/operations.py:698 -msgid "" -"The following minimal list of packages will be installed\n" -"from repository in the respective order to satisfy dependencies:\n" -msgstr "" -"De volgende minimale lijst van pakketten zullen geïnstalleerd worden\n" -"uit de repository in de respectievelijke volgorde om aan afhankelijkheden te " -"voldoen:\n" - -#: pisi/operations.py:701 -msgid "" -"The following minimal list of packages will be built and\n" -"installed in the respective order to satisfy dependencies:\n" -msgstr "" -"De volgende minimale lijst van pakketten zullen gecompileerd\n" -"en geïnstalleerd worden in de respectievelijke volgorde om\n" -"aan afhankelijkheden te voldoen:\n" - -#: pisi/operations.py:743 -msgid "Cannot find source package: %s" -msgstr "Kan bronpakket %s niet vinden" - -#: pisi/package.py:56 -msgid "" -"There was a problem while fetching '%s'.\n" -"The package may have been upgraded. Please try to upgrade the package." -msgstr "" -"Er was een probleem bij ophalen van '%s'.\n" -"Het pakket kan bijgewerkt zijn. Probeer het pakket bij te werken." - -#: pisi/package.py:60 pisi/sourcearchive.py:94 -msgid "%s [cached]" -msgstr "%s [cached]" - -#: pisi/package.py:131 -msgid "MetaData format wrong" -msgstr "Opmaak van metadata is onjuist" - -#: pisi/packagedb.py:66 -msgid "Package %s not found" -msgstr "Pakket %s niet gevonden" - -#: pisi/pxml/autoxml.py:77 -msgid "At least one '%s' tag should have local text" -msgstr "Minstens één '%s' tag moet lokale tekst bevatten" - -#: pisi/pxml/autoxml.py:84 -msgid "'%s' language of tag '%s' is empty" -msgstr "'%s' taal van tag %s is leeg" - -#: pisi/pxml/autoxml.py:112 -msgid "LocalText: unable to get either current or default locale" -msgstr "Localtext: huidige of standaard locale kon niet worden verkregen." - -#: pisi/pxml/autoxml.py:118 pisi/pxml/autoxml.py:133 -msgid "" -"Tag should have at least the current locale, or failing that an English or " -"Turkish version" -msgstr "" -"De tag dient tenminste de huidige locale bevatten, of anders een Engelse, " -"Nederlandse of Turkse versie" - -#: pisi/pxml/autoxml.py:368 -msgid "autoxml.check: '%s' errors" -msgstr "autoxml.check: '%s' fouten" - -#: pisi/pxml/autoxml.py:423 pisi/pxml/autoxml.py:433 -msgid "autoxml.parse: String '%s' has errors" -msgstr "autoxml.parse: lijn '%s' bevat fouten" - -#: pisi/pxml/autoxml.py:443 pisi/pxml/autoxml.py:453 -msgid "autoxml.read: File '%s' has errors" -msgstr "autoxml.read: bestand '%s' bevat fouten" - -#: pisi/pxml/autoxml.py:461 -msgid "autoxml.write: object validation has failed" -msgstr "autoxml.write: objectvalidatie is mislukt" - -#: pisi/pxml/autoxml.py:469 -msgid "autoxml.write: File encoding '%s' has errors" -msgstr "autoxml.write: bestandscodering '%s' bevat fouten" - -#: pisi/pxml/autoxml.py:519 -msgid "gen_tag: unrecognized tag type %s in spec" -msgstr "gen_tag: onherkenbare tag %s in spec" - -#: pisi/pxml/autoxml.py:567 pisi/pxml/autoxml.py:578 -msgid "Mandatory variable %s not available" -msgstr "Verplichte variabele %s niet beschikbaar" - -#: pisi/pxml/autoxml.py:648 -msgid "Type mismatch: read text cannot be decoded" -msgstr "Ongeldig type: leestekst kan niet ontcijferd worden" - -#: pisi/pxml/autoxml.py:652 pisi/pxml/autoxml.py:661 -msgid "Mandatory token %s not available" -msgstr "Verplichte teken %s niet beschikbaar" - -#: pisi/pxml/autoxml.py:666 -msgid "Type mismatch. Expected %s, got %s" -msgstr "Ongeldig type: %s werd verwacht, %s is gekregen" - -# pisi/xmlfile.py:420 :521 -#: pisi/pxml/autoxml.py:696 pisi/pxml/autoxml.py:812 -msgid "Type mismatch: DOM cannot be decoded" -msgstr "Ongeldig type: DOM kan niet ontcijferd worden" - -# pisi/xmlfile.py:392 :423 :439 :446 :524 :538 :545 -#: pisi/pxml/autoxml.py:699 pisi/pxml/autoxml.py:715 pisi/pxml/autoxml.py:725 -#: pisi/pxml/autoxml.py:815 pisi/pxml/autoxml.py:829 pisi/pxml/autoxml.py:839 -msgid "Mandatory argument not available" -msgstr "Verplicht argument niet beschikbaar" - -# pisi/xmlfile.py:436 :535 -#: pisi/pxml/autoxml.py:712 pisi/pxml/autoxml.py:826 -msgid "Object cannot be encoded" -msgstr "Object kan niet gecodeerd worden" - -#: pisi/pxml/autoxml.py:737 -msgid "List type must contain only one element" -msgstr "Lijsttype mag maar één element bevatten" - -# pisi/xmlfile.py:470 :485 -#: pisi/pxml/autoxml.py:750 pisi/pxml/autoxml.py:771 -msgid "Mandatory list \"%s\" under \"%s\" node is empty." -msgstr "De verplichte lijst \"%s\" onder de \"%s\" nodus is leeg." - -#: pisi/pxml/xmlext.py:79 -msgid "getNodeText: Expected text node, got something else!" -msgstr "getNodeText:verwachte tekstverbinding, iets anders gevondenı!" - -#: pisi/pxml/xmlfile.py:64 -msgid "String '%s' has invalid XML" -msgstr "Regel '%s' bevat ongeldige XML" - -#: pisi/pxml/xmlfile.py:72 pisi/pxml/xmlfile.py:87 -msgid "File '%s' has invalid XML" -msgstr "Bestand '%s' bevat ongeldige XML" - -#: pisi/repodb.py:74 -#, fuzzy -msgid "No repository named %s exists" -msgstr "Geen repository met de naam %s gevonden." - -#: pisi/repodb.py:83 -msgid "Repository %s already exists" -msgstr "Repository %s bestaat al" - -#: pisi/repodb.py:90 -msgid "Cannot add repository at position %s" -msgstr "Kan geen repository toevoegen op de positie %s" - -#: pisi/scenarioapi/package.py:67 -msgid "No pisi package: %s* found." -msgstr "Geen pisi pakket %s gevonden." - -#: pisi/scenarioapi/repoops.py:28 -msgid "Repo already has package named %s." -msgstr "Repo bevat al een pakket met de naam %s." - -#: pisi/scenarioapi/repoops.py:52 pisi/scenarioapi/repoops.py:59 -msgid "Repo does not have package named %s." -msgstr "Repo bevat geen pakket met de naam %s." - -#: pisi/sourcearchive.py:63 -msgid "Trying fallback address: %s" -msgstr "Pogen terugval adres: %s" - -#: pisi/sourcearchive.py:74 -msgid "%s mirrors are not defined." -msgstr "%s mirrors zijn niet benoemd." - -#: pisi/sourcearchive.py:79 -msgid "Fetching source from mirror: %s" -msgstr "Bron ophalen van mirror: %s " - -#: pisi/sourcearchive.py:85 -msgid "Could not fetch source from %s mirrors." -msgstr "Kon de bron van de %s mirrors niet ophalen." - -#: pisi/sourcearchive.py:103 -msgid "unpack: check_file_hash failed" -msgstr "uitpakken: check_file_hash mislukt" - -#: pisi/sourcedb.py:59 pisi/sourcedb.py:65 -msgid "Source package %s not found" -msgstr "Bronpakket %s niet gevonden." - -#: pisi/specfile.py:141 -msgid "URI: %s, type: %s, sha1sum: %s" -msgstr "URI: %s, type: %s, sha1sum: %s" - -#: pisi/specfile.py:208 -msgid "Name: %s, version: %s, release: %s, build %s\n" -msgstr "Naam: %s, versie %s, uitgave %s, compilatie %s\n" - -#: pisi/specfile.py:210 -msgid "Summary: %s\n" -msgstr "Inhoud: %s\n" - -#: pisi/specfile.py:211 -msgid "Description: %s\n" -msgstr "Beschrijving: %s\n" - -#: pisi/specfile.py:212 -msgid "Component: %s\n" -msgstr "Component: %s\n" - -#: pisi/specfile.py:213 -msgid "Provides: " -msgstr "Levert: " - -#: pisi/specfile.py:217 -msgid "Dependencies: " -msgstr "Afhankelijkheden: " - -#: pisi/uri.py:80 -msgid "setAuthInfo needs a tuple (user, pass)" -msgstr "setAuthInfo heeft een unieke relatie nodig (gebruiker, wachtwoord)" - -#: pisi/util.py:122 pisi/util.py:143 -msgid "Running " -msgstr "Actief " - -#: pisi/util.py:126 pisi/util.py:161 -msgid "return value for \"%s\" is %s" -msgstr "return-waarde voor \"%s\" is %s" - -#: pisi/util.py:364 -msgid "Including external link '%s'" -msgstr "Bijsluiten externe koppeling '%s'" - -#: pisi/util.py:366 -msgid "Including directory '%s'" -msgstr "Bijsluiten map '%s'" - -#: pisi/util.py:440 -msgid "I/O Error: Cannot calculate SHA1 hash of %s" -msgstr "I/O-fout: kan SHA1 hash van%s niet berekenen" - -#: pisi/util.py:451 -msgid "Cannot calculate SHA1 hash of given data" -msgstr "Kan SHA1 hash van opgegeven gegevens niet berekenen" - -#: pisi/util.py:488 -msgid "ERROR: patch (%s) failed" -msgstr "Fout: patch (%s) mislukt" - -#: pisi/util.py:490 -msgid "ERROR: patch (%s) failed: %s" -msgstr "Fout: patch (%s) mislukt: %s" - -#: pisi/util.py:536 -msgid "strip command failed for file '%s'!" -msgstr "Commando 'strip' mislukte voor bestand '%s'!" - -#: pisi/util.py:543 -msgid "objcopy (keep-debug) command failed for file '%s'!" -msgstr "Commando 'objcopy' (keep-debug) mislukte voor bestand '%s'!" - -#: pisi/util.py:549 -msgid "objcopy (add-debuglink) command failed for file '%s'!" -msgstr "Commando 'objcopy' (add-debuglink) mislukte voor bestand '%s'!" - -#: pisi/util.py:610 -msgid "Updating environment..." -msgstr "Omgeving bijwerken..." - -#: scripts/repostats.py:361 -msgid "" -"Duplicate binary packages:\n" -"%s\n" -"%s\n" -msgstr "" -"Dubbele binaire pakketten:\n" -"%s\n" -"%s\n" - -#: scripts/repostats.py:366 -msgid "Unknown file type '%s' in package '%s'" -msgstr "Onbekend bestandstype '%s' in pakket '%s'" - -#: scripts/repostats.py:422 -msgid "" -"Duplicate source packages:\n" -"%s\n" -"%s\n" -msgstr "" -"Dubbele bronpakketten:\n" -"%s\n" -"%s\n" - -#: scripts/repostats.py:442 -msgid "Source package '%s' has wrong date format '%s'" -msgstr "Bronpakket '%s' heeft een onjuiste datumopmaak: '%s'" - -#: scripts/repostats.py:481 -msgid "" -"Developer '%s <%s>' has another mail address '%s' in source package '%s'" -msgstr "" -"Ontwikkelaar '%s <%s>' heeft een ander e-mailadres '%s' in bronpakket '%s'" - -#: scripts/repostats.py:564 -msgid "" -"Cannot parse '%s':\n" -"%s\n" -msgstr "" -"Kan '%s' niet ontleden:\n" -"'%s'\n" - -#: scripts/repostats.py:642 -msgid "Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n" -msgstr "Gebruik: repostats.py [Opties] source-repo-path [binair-repo-adres]\n" - -#: scripts/repostats.py:643 -msgid "Dont generate the web site.\n" -msgstr "Website niet genereren.\n" - -#: scripts/repostats.py:664 -msgid "Scanning source repository...\n" -msgstr "Scannen bron-repository...\n" - -#: scripts/repostats.py:668 -msgid "Scanning binary packages...\n" -msgstr "Scannen binaire pakketten...\n" - -#: scripts/repostats.py:673 -msgid "Encountered %d errors! Fix them immediately!\n" -msgstr "%d problemen gevonden! Repareer ze onmiddellijk!\n" - -#: scripts/repostats.py:681 -msgid "These dependencies are not available in repository:\n" -msgstr "Deze afhankelijkheden zijn niet beschikbaar in de repository:\n" - -#~ msgid "eager upgrades" -#~ msgstr "belangrijke opwaarderingen" - -#~ msgid "Cannot write to PiSi database." -#~ msgstr "Kan niet naar de PiSi-database schrijven." - -#~ msgid "%s section should have a '%s' tag" -#~ msgstr "'%s' sectie zou een '%s' tag moeten hebben" - -#~ msgid "Removing lock %s" -#~ msgstr "Vergrendeling %s verwijderen" diff --git a/tags/pisi-1.1_rc10/po/pisi.pot b/tags/pisi-1.1_rc10/po/pisi.pot deleted file mode 100644 index 670bf799..00000000 --- a/tags/pisi-1.1_rc10/po/pisi.pot +++ /dev/null @@ -1,2646 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2006-12-08 21:30+EET\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: ENCODING\n" -"Generated-By: pygettext.py 1.5\n" - - -#: /usr/lib/python2.4/optparse.py:1 -#, docstring -msgid "" -"optparse - a powerful, extensible, and easy-to-use option parser.\n" -"\n" -"By Greg Ward \n" -"\n" -"Originally distributed as Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"If you have problems with this module, please do not file bugs,\n" -"patches, or feature requests with Python; instead, use Optik's\n" -"SourceForge project page:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"For support, use the optik-users@lists.sourceforge.net mailing list\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:93 -#, docstring -msgid "" -"\n" -" Raised if an Option instance is created with invalid or\n" -" inconsistent arguments.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:109 -#, docstring -msgid "" -"\n" -" Raised if conflicting options are added to an OptionParser.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:114 -#, docstring -msgid "" -"\n" -" Raised if an invalid option value is encountered on the command\n" -" line.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:120 -#, docstring -msgid "" -"\n" -" Raised if an invalid or ambiguous option is seen on the command-line.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:298 pisi/cli/commands.py:50 -#, docstring -msgid "Return a comma-separated list of option strings & metavariables." -msgstr "" - -#: /usr/lib/python2.4/optparse.py:317 -#, docstring -msgid "" -"Format help with indented section bodies.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:329 pisi/cli/commands.py:44 -msgid "" -"usage: %s\n" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:336 -#, docstring -msgid "" -"Format help with underlined section headers.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:348 -msgid "Usage" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:354 -msgid "integer" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:355 -msgid "long integer" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:356 -msgid "floating-point" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:357 -msgid "complex" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:365 -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:373 -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:382 -#, docstring -msgid "" -"\n" -" Instance attributes:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:781 -#, docstring -msgid "" -"\n" -" Update the option values from an arbitrary dictionary, but only\n" -" use keys from dict that already have a corresponding attribute\n" -" in self. Any keys in dict without a corresponding attribute\n" -" are silently ignored.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:794 -#, docstring -msgid "" -"\n" -" Update the option values from an arbitrary dictionary,\n" -" using all keys from the dictionary regardless of whether\n" -" they have a corresponding attribute in self or not.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:926 -#, docstring -msgid "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1138 -msgid "show this help message and exit" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1143 -msgid "show program's version number and exit" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1166 -msgid "%prog [options]" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1246 -#, docstring -msgid "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse the command-line options found in 'args' (default:\n" -" sys.argv[1:]). Any errors result in a call to 'error()', which\n" -" by default prints the usage message to stderr and calls\n" -" sys.exit() with an error message. On success returns a pair\n" -" (values, args) where 'values' is an Values instance (with all\n" -" your option values) and 'args' is the list of arguments left\n" -" over after parsing options.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1285 -#, docstring -msgid "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Check that the supplied option values and leftover arguments are\n" -" valid. Returns the option values and leftover arguments\n" -" (possibly adjusted, possibly completely new -- whatever you\n" -" like). Default implementation just returns the passed-in\n" -" values; subclasses may override as desired.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1298 -#, docstring -msgid "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Process command-line arguments and populate 'values', consuming\n" -" options and arguments from 'rargs'. If 'allow_interspersed_args' is\n" -" false, stop at the first non-option argument. If true, accumulate any\n" -" interspersed non-option arguments in 'largs'.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1349 -#, docstring -msgid "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determine which long option string 'opt' matches, ie. which one\n" -" it is an unambiguous abbrevation for. Raises BadOptionError if\n" -" 'opt' doesn't unambiguously match any long option string.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1376 /usr/lib/python2.4/optparse.py:1415 -msgid "%s option requires an argument" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1378 /usr/lib/python2.4/optparse.py:1417 -msgid "%s option requires %d arguments" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1387 -msgid "%s option does not take a value" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1404 /usr/lib/python2.4/optparse.py:1558 -msgid "no such option: %s" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1454 -#, docstring -msgid "" -"error(msg : string)\n" -"\n" -" Print a usage message incorporating 'msg' to stderr and exit.\n" -" If you override this in a subclass, it should not return -- it\n" -" should either exit or raise an exception.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1471 -#, docstring -msgid "" -"print_usage(file : file = stdout)\n" -"\n" -" Print the usage message for the current program (self.usage) to\n" -" 'file' (default stdout). Any occurence of the string \"%prog\" in\n" -" self.usage is replaced with the name of the current program\n" -" (basename of sys.argv[0]). Does nothing if self.usage is empty\n" -" or not defined.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1489 -#, docstring -msgid "" -"print_version(file : file = stdout)\n" -"\n" -" Print the version message for this program (self.version) to\n" -" 'file' (default stdout). As with print_usage(), any occurence\n" -" of \"%prog\" in self.version is replaced by the current program's\n" -" name. Does nothing if self.version is empty or undefined.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1504 -msgid "options" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1528 -#, docstring -msgid "" -"print_help(file : file = stdout)\n" -"\n" -" Print an extended help message, listing all options and any\n" -" help text provided with them, to 'file' (default stdout).\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1541 -#, docstring -msgid "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Return the string key in 'wordmap' for which 's' is an unambiguous\n" -" abbreviation. If 's' is found to be ambiguous or doesn't match any of\n" -" 'words', raise BadOptionError.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1562 -msgid "ambiguous option: %s (%s?)" -msgstr "" - -#: pisi-cli:46 -msgid "Keyboard Interrupt: Exiting..." -msgstr "" - -#: pisi-cli:49 -msgid "Program Terminated." -msgstr "" - -#: pisi-cli:52 -msgid "" -"A database operation has been aborted. You should run pisi\n" -"again for normal DB recovery procedure. Make sure you have free disk space. \n" -"You have to run rebuild-db only when there is file corruption and database upgrades." -msgstr "" - -#: pisi-cli:57 -msgid "" -"Unhandled internal exception.\n" -"Please file a bug report. (http://bugs.uludag.org.tr)" -msgstr "" - -#: pisi-cli:63 -msgid "System Error. Program Terminated." -msgstr "" - -#: pisi-cli:70 -msgid "Please use 'pisi help' for general help." -msgstr "" - -#: pisi-cli:73 -msgid "Traceback:" -msgstr "" - -#: pisi-cli:77 -msgid "Use --debug to see a traceback." -msgstr "" - -#: pisi/actionsapi/autotools.py:36 -msgid "" -"Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" - -#: pisi/actionsapi/autotools.py:75 pisi/actionsapi/autotools.py:85 -#: pisi/actionsapi/kde.py:65 pisi/actionsapi/perlmodules.py:54 -#: pisi/actionsapi/perlmodules.py:57 -msgid "Configure failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:77 pisi/actionsapi/autotools.py:87 -#: pisi/actionsapi/kde.py:67 -msgid "No configure script found." -msgstr "" - -#: pisi/actionsapi/autotools.py:96 pisi/actionsapi/kde.py:72 -#: pisi/actionsapi/perlmodules.py:63 pisi/actionsapi/perlmodules.py:72 -#: pisi/actionsapi/pythonmodules.py:49 pisi/actionsapi/scons.py:39 -msgid "Make failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:124 pisi/actionsapi/autotools.py:134 -#: pisi/actionsapi/kde.py:79 pisi/actionsapi/pythonmodules.py:54 -#: pisi/actionsapi/scons.py:43 -msgid "Install failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:126 pisi/actionsapi/autotools.py:136 -#: pisi/actionsapi/kde.py:81 -msgid "No Makefile found." -msgstr "" - -#: pisi/actionsapi/autotools.py:143 -msgid "Running aclocal failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:148 -msgid "Running autoconf failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:153 -msgid "Running autoreconf failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:158 -msgid "Running automake failed." -msgstr "" - -#: pisi/actionsapi/autotools.py:163 -msgid "Running autoheader failed." -msgstr "" - -#: pisi/actionsapi/get.py:163 -msgid "Util %s cannot be found" -msgstr "" - -#: pisi/actionsapi/get.py:165 -msgid "Warning: %s does not exist, using plain name %s" -msgstr "" - -#: pisi/actionsapi/kde.py:34 -msgid "" -"\n" -"!!! Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" - -#: pisi/actionsapi/libtools.py:38 -msgid "Running ldconfig failed." -msgstr "" - -#: pisi/actionsapi/libtools.py:49 -msgid "GNU Config Update Finished." -msgstr "" - -#: pisi/actionsapi/libtools.py:53 -msgid "Running libtoolize failed." -msgstr "" - -#: pisi/actionsapi/perlmodules.py:66 -msgid "perl build failed." -msgstr "" - -#: pisi/actionsapi/perlmodules.py:75 -msgid "perl install failed." -msgstr "" - -#: pisi/actionsapi/pisitools.py:126 -msgid "ActionsAPI [doman]: Wrong man page file: %s" -msgstr "" - -#: pisi/actionsapi/pisitools.py:164 -msgid "ActionsAPI [rename]: No such file or directory: %s" -msgstr "" - -#: pisi/actionsapi/pisitools.py:181 -msgid "File does not exist or permission denied: %s" -msgstr "" - -#: pisi/actionsapi/pisitools.py:198 -msgid "ActionsAPI [dosym]: File exists: %s" -msgstr "" - -#: pisi/actionsapi/pisitoolsfunctions.py:45 -#: pisi/actionsapi/pisitoolsfunctions.py:59 -#: pisi/actionsapi/pisitoolsfunctions.py:72 -msgid "Insufficient arguments." -msgstr "" - -#: pisi/actionsapi/pythonmodules.py:66 -msgid "Running %s failed." -msgstr "" - -#: pisi/actionsapi/shelltools.py:49 -msgid "Cannot create directory %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:57 -msgid "ActionsAPI [echo]: Can't append to file %s." -msgstr "" - -#: pisi/actionsapi/shelltools.py:66 -msgid "ActionsAPI [chmod]: Operation not permitted: %s (mode: %s)" -msgstr "" - -#: pisi/actionsapi/shelltools.py:69 -msgid "ActionsAPI [chmod]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:77 -msgid "ActionsAPI [chown]: Operation not permitted: %s (uid: %s, gid: %s)" -msgstr "" - -#: pisi/actionsapi/shelltools.py:80 -msgid "ActionsAPI [chown]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:87 -msgid "ActionsAPI [sym]: Permission denied: %s to %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:95 -msgid "ActionsAPI [unlink]: Permission denied: %s." -msgstr "" - -#: pisi/actionsapi/shelltools.py:99 -msgid "ActionsAPI [unlink]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:107 -msgid "ActionsAPI [unlinkDir]: Operation not permitted: %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:111 -msgid "ActionsAPI [unlinkDir]: Directory %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:120 -msgid "ActionsAPI [move]: Permission denied: %s to %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:122 -msgid "ActionsAPI [move]: File %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:132 -msgid "ActionsAPI [copy]: Permission denied: %s to %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:148 -msgid "ActionsAPI [copy]: File %s does not exist." -msgstr "" - -#: pisi/actionsapi/shelltools.py:163 -msgid "ActionsAPI [copytree] %s to %s: %s" -msgstr "" - -#: pisi/actionsapi/shelltools.py:165 -msgid "ActionsAPI [copytree]: Directory %s doesn't exists." -msgstr "" - -#: pisi/actionsapi/shelltools.py:177 -msgid "ActionsAPI [touch]: Permission denied: %s" -msgstr "" - -#: pisi/api.py:302 pisi/comariface.py:30 -msgid "comar package is not fully installed" -msgstr "" - -#: pisi/api.py:314 -msgid "File %s not found" -msgstr "" - -#: pisi/api.py:375 -msgid "Checking /%s " -msgstr "" - -#: pisi/api.py:379 -msgid "" -"\n" -"Corrupt file: %s" -msgstr "" - -#: pisi/api.py:381 pisi/cli/commands.py:966 -msgid "OK" -msgstr "" - -#: pisi/api.py:394 -msgid "* Building index of PiSi files under %s" -msgstr "" - -#: pisi/api.py:401 -msgid "* Index file written" -msgstr "" - -#: pisi/api.py:405 -msgid "Repo %s already present." -msgstr "" - -#: pisi/api.py:409 -msgid "Repo %s added to system." -msgstr "" - -#: pisi/api.py:415 -msgid "Repo %s removed from system." -msgstr "" - -#: pisi/api.py:417 -msgid "Repository %s does not exist. Cannot remove." -msgstr "" - -#: pisi/api.py:424 -msgid "* Updating repository: %s" -msgstr "" - -#: pisi/api.py:432 -msgid "No updates available for repository %s." -msgstr "" - -#: pisi/api.py:434 -msgid "Updating database at any rate as requested" -msgstr "" - -#: pisi/api.py:445 -msgid "* Package database updated." -msgstr "" - -#: pisi/api.py:447 pisi/api.py:472 -msgid "No repository named %s found." -msgstr "" - -#: pisi/api.py:455 -msgid "* Rebuilding '%s' named repo... " -msgstr "" - -#: pisi/api.py:468 -msgid "Input/Output error while reading %s: %s" -msgstr "" - -#: pisi/api.py:525 -msgid "Rebuilding package database" -msgstr "" - -#: pisi/archive.py:36 -msgid "" -"An error has occured while running LZMA:\n" -"%s" -msgstr "" - -#: pisi/archive.py:101 pisi/archive.py:161 -msgid "Archive type not recognized" -msgstr "" - -#: pisi/atomicoperations.py:66 -msgid "Package %s found in repository %s" -msgstr "" - -#: pisi/atomicoperations.py:78 -msgid "Package URI: %s" -msgstr "" - -#: pisi/atomicoperations.py:82 -msgid "Package %s not found in any active repository." -msgstr "" - -#: pisi/atomicoperations.py:101 -msgid "Installing %s, version %s, release %s, build %s" -msgstr "" - -#: pisi/atomicoperations.py:146 -msgid "Dependencies for %s not satisfied" -msgstr "" - -#: pisi/atomicoperations.py:148 -msgid "Package not installable" -msgstr "" - -#: pisi/atomicoperations.py:166 -msgid "" -"/%s from %s package\n" -msgstr "" - -#: pisi/atomicoperations.py:167 -msgid "" -"File conflicts:\n" -"%s" -msgstr "" - -#: pisi/atomicoperations.py:202 -msgid "Re-install same version package?" -msgstr "" - -#: pisi/atomicoperations.py:203 -msgid "Package re-install declined" -msgstr "" - -#: pisi/atomicoperations.py:209 -msgid "Upgrading to new upstream version" -msgstr "" - -#: pisi/atomicoperations.py:212 -msgid "Upgrading to new distribution release" -msgstr "" - -#: pisi/atomicoperations.py:216 -msgid "Upgrading to new distribution build" -msgstr "" - -#: pisi/atomicoperations.py:226 -msgid "Downgrade to old distribution release?" -msgstr "" - -#: pisi/atomicoperations.py:228 -msgid "Downgrade to old distribution build?" -msgstr "" - -#: pisi/atomicoperations.py:230 -msgid "Package downgrade declined" -msgstr "" - -#: pisi/atomicoperations.py:254 -msgid "%s configuration failed." -msgstr "" - -#: pisi/atomicoperations.py:341 -msgid "Storing %s, " -msgstr "" - -#: pisi/atomicoperations.py:344 -msgid "Storing %s." -msgstr "" - -#: pisi/atomicoperations.py:351 -msgid "Storing %s" -msgstr "" - -#: pisi/atomicoperations.py:407 -msgid "File list could not be read for package %s, continuing removal." -msgstr "" - -#: pisi/atomicoperations.py:413 -msgid "Removing package %s" -msgstr "" - -#: pisi/atomicoperations.py:416 -msgid "Trying to remove nonexistent package " -msgstr "" - -#: pisi/atomicoperations.py:455 -msgid "Not removing conflicted file : %s" -msgstr "" - -#: pisi/atomicoperations.py:475 -msgid "Installed file %s is not exists on system [Probably you manually deleted]" -msgstr "" - -#: pisi/atomicoperations.py:536 -msgid "Metadata XML '%s' cannot be found" -msgstr "" - -#: pisi/atomicoperations.py:544 -msgid "MetaData format wrong (%s)" -msgstr "" - -#: pisi/atomicoperations.py:546 -msgid "* Adding '%s' to db... " -msgstr "" - -#: pisi/atomicoperations.py:552 -msgid "Files XML '%s' cannot be found" -msgstr "" - -#: pisi/atomicoperations.py:557 pisi/package.py:136 -msgid "Invalid %s" -msgstr "" - -#: pisi/atomicoperations.py:566 -msgid "OK." -msgstr "" - -#: pisi/build.py:88 -msgid "Path %s belongs in multiple packages" -msgstr "" - -#: pisi/build.py:114 -msgid "Source URI: %s" -msgstr "" - -#: pisi/build.py:118 -msgid "Source %s not found in any active repository." -msgstr "" - -#: pisi/build.py:183 -msgid "Building PiSi source package: %s" -msgstr "" - -#: pisi/build.py:229 -msgid "IceCream detected. Make sure your daemon is up and running..." -msgstr "" - -#: pisi/build.py:234 -msgid "CCache detected..." -msgstr "" - -#: pisi/build.py:287 -msgid "PartOf tag not defined, looking for component" -msgstr "" - -#: pisi/build.py:297 -msgid "Cannot find component.xml in upper directory" -msgstr "" - -#: pisi/build.py:301 -msgid "Source is part of %s component" -msgstr "" - -#: pisi/build.py:305 -msgid "Fetching source from: %s" -msgstr "" - -#: pisi/build.py:307 -msgid "Source archive is stored: %s/%s" -msgstr "" - -#: pisi/build.py:311 -msgid "Unpacking archive..." -msgstr "" - -#: pisi/build.py:313 -msgid " unpacked (%s)" -msgstr "" - -#: pisi/build.py:318 -msgid "Setting up source..." -msgstr "" - -#: pisi/build.py:323 -msgid "Building source..." -msgstr "" - -#: pisi/build.py:328 -msgid "Installing..." -msgstr "" - -#: pisi/build.py:370 -msgid "Unable to read Actions Script (%s): %s" -msgstr "" - -#: pisi/build.py:372 -msgid "SyntaxError in Actions Script (%s): %s" -msgstr "" - -#: pisi/build.py:389 -msgid "Unable to read COMAR script (%s): %s" -msgstr "" - -#: pisi/build.py:391 -msgid "SyntaxError in COMAR file (%s): %s" -msgstr "" - -#: pisi/build.py:417 -msgid "unable to call function from actions: %s" -msgstr "" - -#: pisi/build.py:433 -msgid "Safety switch: following extra packages in system.devel will be installed: " -msgstr "" - -#: pisi/build.py:438 -msgid "Safety switch: system.devel is already installed" -msgstr "" - -#: pisi/build.py:440 -msgid "Safety switch: the component system.devel cannot be found" -msgstr "" - -#: pisi/build.py:449 -msgid "Unsatisfied Build Dependencies:" -msgstr "" - -#: pisi/build.py:453 -msgid "Cannot build package due to unsatisfied build dependencies" -msgstr "" - -#: pisi/build.py:461 -msgid "Build dependency %s cannot be satisfied" -msgstr "" - -#: pisi/build.py:463 -msgid "Do you want to install the unsatisfied build dependencies" -msgstr "" - -#: pisi/build.py:464 -msgid "Installing build dependencies." -msgstr "" - -#: pisi/build.py:469 -msgid "Ignoring build dependencies." -msgstr "" - -#: pisi/build.py:479 -msgid "" -"Patch file is missing: %s\n" -msgstr "" - -#: pisi/build.py:492 -msgid "* Applying patch: %s" -msgstr "" - -#: pisi/build.py:550 -msgid "Stripping files.." -msgstr "" - -#: pisi/build.py:656 -msgid "(found old version %s)" -msgstr "" - -#: pisi/build.py:658 -msgid "Skipping %s with wrong pkg name " -msgstr "" - -#: pisi/build.py:679 -msgid "(no previous build found, setting build no to 1.)" -msgstr "" - -#: pisi/build.py:724 -msgid "(old package lacks a build no, setting build no to 1.)" -msgstr "" - -#: pisi/build.py:727 -msgid "There are changes, incrementing build no to %d" -msgstr "" - -#: pisi/build.py:730 -msgid "There is no change from previous build %d" -msgstr "" - -#: pisi/build.py:795 -msgid "No user named '%s' found on the system" -msgstr "" - -#: pisi/build.py:800 -msgid "No group named '%s' found on the system" -msgstr "" - -#: pisi/build.py:803 -msgid "** Building package %s" -msgstr "" - -#: pisi/build.py:805 pisi/build.py:808 -msgid "Generating %s," -msgstr "" - -#: pisi/build.py:814 -msgid "Build number is not available. For repo builds you must enable buildno in pisi.conf." -msgstr "" - -#: pisi/build.py:832 -msgid "Creating PiSi package %s." -msgstr "" - -#: pisi/build.py:877 -msgid "Done." -msgstr "" - -#: pisi/build.py:883 -msgid "Abandoned files under the install dir (%s):" -msgstr "" - -#: pisi/build.py:887 -msgid "All of the files under the install dir (%s) has been collected by package(s)" -msgstr "" - -#: pisi/build.py:891 -msgid "Cleaning Build Directory..." -msgstr "" - -#: pisi/build.py:894 -msgid "Keeping Build Directory" -msgstr "" - -#: pisi/cli/__init__.py:79 -msgid "Warning: " -msgstr "" - -#: pisi/cli/__init__.py:88 -msgid "Error: " -msgstr "" - -#: pisi/cli/__init__.py:120 -msgid " (yes/no)" -msgstr "" - -#: pisi/cli/__init__.py:141 -msgid "" -" [complete]\n" -msgstr "" - -#: pisi/cli/__init__.py:151 -msgid "Installed %s" -msgstr "" - -#: pisi/cli/__init__.py:153 -msgid "Removed %s" -msgstr "" - -#: pisi/cli/__init__.py:155 -msgid "Upgraded %s" -msgstr "" - -#: pisi/cli/__init__.py:157 -msgid "Configured %s" -msgstr "" - -#: pisi/cli/__init__.py:159 -msgid "Extracting the files of %s" -msgstr "" - -#: pisi/cli/commands.py:94 -#, docstring -msgid "generic help string for any command" -msgstr "" - -#: pisi/cli/commands.py:123 pisi/cli/pisicli.py:104 -msgid "Unrecognized command: %s" -msgstr "" - -#: pisi/cli/commands.py:145 -#, docstring -msgid "common options" -msgstr "" - -#: pisi/cli/commands.py:148 -msgid "general options" -msgstr "" - -#: pisi/cli/commands.py:151 -msgid "Change the system root for PiSi commands" -msgstr "" - -#: pisi/cli/commands.py:153 -msgid "Assume yes in all yes/no queries" -msgstr "" - -#: pisi/cli/commands.py:158 -msgid "Detailed output" -msgstr "" - -#: pisi/cli/commands.py:160 -msgid "Show debugging information" -msgstr "" - -#: pisi/cli/commands.py:162 -msgid "Suppresses all coloring of PiSi's output" -msgstr "" - -#: pisi/cli/commands.py:169 -#, docstring -msgid "" -"This is a fall back function. If the implementer module provides an\n" -" options function it will be called" -msgstr "" - -#: pisi/cli/commands.py:181 -msgid "" -"Destination directory %s does not exist. Creating directory.\n" -msgstr "" - -#: pisi/cli/commands.py:203 -msgid "Password: " -msgstr "" - -#: pisi/cli/commands.py:209 -#, docstring -msgid "initialize PiSi components" -msgstr "" - -#: pisi/cli/commands.py:217 -#, docstring -msgid "do cleanup work for PiSi components" -msgstr "" - -#: pisi/cli/commands.py:231 -#, docstring -msgid "print help for the command" -msgstr "" - -#: pisi/cli/commands.py:237 -#, docstring -msgid "exit program" -msgstr "" - -#: pisi/cli/commands.py:239 -msgid "Command terminated abnormally." -msgstr "" - -#: pisi/cli/commands.py:249 -msgid "Command lacks name" -msgstr "" - -#: pisi/cli/commands.py:253 -msgid "Duplicate command %s" -msgstr "" - -#: pisi/cli/commands.py:262 -#, docstring -msgid "" -"Prints help for given commands\n" -"\n" -"Usage: help [ ... ]\n" -"\n" -"If run without parameters, it prints the general help." -msgstr "" - -#: pisi/cli/commands.py:296 -#, docstring -msgid "" -"Clean stale locks\n" -"\n" -"Usage: clean\n" -"\n" -"PiSi uses filesystem locks for managing database access.\n" -"This command deletes unused locks from the database directory." -msgstr "" - -#: pisi/cli/commands.py:315 -#, docstring -msgid "" -"Delete cache files\n" -"\n" -"Usage: delete-cache\n" -"\n" -"Sources, packages and temporary files are stored\n" -"under /var directory. Since these accumulate they can\n" -"consume a lot of disk space." -msgstr "" - -#: pisi/cli/commands.py:336 -#, docstring -msgid "" -"Graph package relations\n" -"\n" -"Usage: graph [ ...]\n" -"\n" -"Write a graph of package relations, tracking dependency and\n" -"conflicts relations starting from given packages. By default\n" -"shows the package relations among repository packages, and writes\n" -"the package in graphviz format to 'pgraph.dot'.\n" -msgstr "" - -#: pisi/cli/commands.py:353 -msgid "graph options" -msgstr "" - -#: pisi/cli/commands.py:357 -msgid "Specify a particular repository" -msgstr "" - -#: pisi/cli/commands.py:360 -msgid "Graph of installed packages" -msgstr "" - -#: pisi/cli/commands.py:363 -msgid "Do not show installed packages" -msgstr "" - -#: pisi/cli/commands.py:366 -msgid "Dot output file" -msgstr "" - -#: pisi/cli/commands.py:377 -msgid "Plotting packages in repository %s" -msgstr "" - -#: pisi/cli/commands.py:383 -msgid "Plotting a graph of relations among all repository packages" -msgstr "" - -#: pisi/cli/commands.py:390 -msgid "Plotting a graph of relations among all installed packages" -msgstr "" - -#: pisi/cli/commands.py:402 -msgid "Do not take build no into account." -msgstr "" - -#: pisi/cli/commands.py:407 -msgid "Do not take dependency information into account" -msgstr "" - -#: pisi/cli/commands.py:411 -#, docstring -msgid "" -"Build PiSi packages\n" -"\n" -"Usage: build [ | ] ...\n" -"\n" -"You can give a URI of the pspec.xml file. PiSi will\n" -"fetch all necessary files and build the package for you.\n" -"\n" -"Alternatively, you can give the name of a source package\n" -"to be downloaded from a repository containing sources.\n" -msgstr "" - -#: pisi/cli/commands.py:433 -msgid "build options" -msgstr "" - -#: pisi/cli/commands.py:441 -msgid "Output directory for produced packages" -msgstr "" - -#: pisi/cli/commands.py:444 -msgid "Bypass errors from ActionsAPI" -msgstr "" - -#: pisi/cli/commands.py:446 pisi/cli/commands.py:554 -msgid "Bypass safety switch" -msgstr "" - -#: pisi/cli/commands.py:448 -msgid "Create a static package with ar files" -msgstr "" - -#: pisi/cli/commands.py:450 -msgid "Do not install build dependencies, fail if a build dependency is present" -msgstr "" - -#: pisi/cli/commands.py:452 -msgid "PiSi binary package formats: '1.0', '1.1' (default)" -msgstr "" - -#: pisi/cli/commands.py:455 -msgid "build steps" -msgstr "" - -#: pisi/cli/commands.py:457 -msgid "Break build after fetching the source archive" -msgstr "" - -#: pisi/cli/commands.py:459 -msgid "Break build after unpacking the source archive, checking sha1sum and applying patches" -msgstr "" - -#: pisi/cli/commands.py:461 -msgid "Break build after running configure step" -msgstr "" - -#: pisi/cli/commands.py:463 -msgid "Break build after running compile step" -msgstr "" - -#: pisi/cli/commands.py:465 -msgid "Break build after running install step" -msgstr "" - -#: pisi/cli/commands.py:467 -msgid "create PiSi package" -msgstr "" - -#: pisi/cli/commands.py:481 -msgid "package_format must be one of %s " -msgstr "" - -#: pisi/cli/commands.py:484 pisi/cli/commands.py:533 -msgid "Output directory: %s" -msgstr "" - -#: pisi/cli/commands.py:486 -msgid "Outputting packages in the working directory." -msgstr "" - -#: pisi/cli/commands.py:497 -#, docstring -msgid "" -"Build and install PiSi source packages from repository\n" -"\n" -"Usage: emerge ...\n" -"\n" -"You should give the name of a source package to be\n" -"downloaded from a repository containing sources.\n" -"\n" -"You can also give the name of a component.\n" -msgstr "" - -#: pisi/cli/commands.py:516 -msgid "emerge options" -msgstr "" - -#: pisi/cli/commands.py:519 pisi/cli/commands.py:592 pisi/cli/commands.py:656 -msgid "Ignore file conflicts" -msgstr "" - -#: pisi/cli/commands.py:521 pisi/cli/commands.py:594 pisi/cli/commands.py:658 -msgid "Ignore package conflicts" -msgstr "" - -#: pisi/cli/commands.py:523 pisi/cli/commands.py:552 -msgid "Bypass comar configuration agent" -msgstr "" - -#: pisi/cli/commands.py:535 -msgid "Outputting binary packages in the package cache." -msgstr "" - -#: pisi/cli/commands.py:543 -#, docstring -msgid "Abstract package operation command" -msgstr "" - -#: pisi/cli/commands.py:556 -msgid "Do not perform any action, just show what would be done" -msgstr "" - -#: pisi/cli/commands.py:567 -#, docstring -msgid "" -"Install PiSi packages\n" -"\n" -"Usage: install ... \n" -"\n" -"You may use filenames, URI's or package names for packages. If you have\n" -"specified a package name, it should exist in a specified repository.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" - -#: pisi/cli/commands.py:585 -msgid "install options" -msgstr "" - -#: pisi/cli/commands.py:590 -msgid "Reinstall already installed packages" -msgstr "" - -#: pisi/cli/commands.py:596 -msgid "Install component's and recursive components' packages" -msgstr "" - -#: pisi/cli/commands.py:598 pisi/cli/commands.py:662 -msgid "Fetch upgrades but do not install." -msgstr "" - -#: pisi/cli/commands.py:621 -#, docstring -msgid "" -"Upgrade PiSi packages\n" -"\n" -"Usage: Upgrade [ ... ]\n" -"\n" -": package name\n" -"\n" -"Upgrades the entire system if no package names are given\n" -"\n" -"You may use only package names to specify packages because\n" -"the package upgrade operation is defined only with respect\n" -"to repositories. If you have specified a package name, it\n" -"should exist in the package repositories. If you just want to\n" -"reinstall a package from a PiSi file, use the install command.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" - -#: pisi/cli/commands.py:647 -msgid "upgrade options" -msgstr "" - -#: pisi/cli/commands.py:652 -msgid "Security related package upgrades only" -msgstr "" - -#: pisi/cli/commands.py:654 -msgid "Do not update repositories" -msgstr "" - -#: pisi/cli/commands.py:660 -msgid "Upgrade component's and recursive components' packages" -msgstr "" - -#: pisi/cli/commands.py:664 -msgid "When upgrading system, ignore packages and components whose basenames match pattern." -msgstr "" - -#: pisi/cli/commands.py:666 -msgid "When upgrading system, ignore packages and components whose basenames match any pattern contained in file." -msgstr "" - -#: pisi/cli/commands.py:706 -msgid "Updating repositories" -msgstr "" - -#: pisi/cli/commands.py:711 -msgid "Will not update repositories" -msgstr "" - -#: pisi/cli/commands.py:733 -#, docstring -msgid "" -"Remove PiSi packages\n" -"\n" -"Usage: remove ... \n" -"\n" -"Remove package(s) from your system. Just give the package names to remove.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" - -#: pisi/cli/commands.py:750 -msgid "remove options" -msgstr "" - -#: pisi/cli/commands.py:753 -msgid "Remove component's and recursive components' packages" -msgstr "" - -#: pisi/cli/commands.py:775 -#, docstring -msgid "" -"Configure pending packages\n" -"\n" -"If COMAR configuration of some packages were not\n" -"done at installation time, they are added to a list\n" -"of packages waiting to be configured. This command\n" -"configures those packages.\n" -msgstr "" - -#: pisi/cli/commands.py:791 -msgid "configure-pending options" -msgstr "" - -#: pisi/cli/commands.py:803 -#, docstring -msgid "" -"Display package information\n" -"\n" -"Usage: info ... \n" -"\n" -" is either a package name or a .pisi file,\n" -msgstr "" - -#: pisi/cli/commands.py:818 -msgid "info options" -msgstr "" - -#: pisi/cli/commands.py:825 -msgid "Show a list of package files." -msgstr "" - -#: pisi/cli/commands.py:827 -msgid "Info about the given component" -msgstr "" - -#: pisi/cli/commands.py:830 -msgid "Show only paths." -msgstr "" - -#: pisi/cli/commands.py:832 -msgid "Do not show details" -msgstr "" - -#: pisi/cli/commands.py:834 -msgid "Output in xml format" -msgstr "" - -#: pisi/cli/commands.py:880 -msgid "Package file: %s" -msgstr "" - -#: pisi/cli/commands.py:886 -msgid "[inst] " -msgstr "" - -#: pisi/cli/commands.py:888 -msgid "Installed package:" -msgstr "" - -#: pisi/cli/commands.py:894 -msgid "[repo] " -msgstr "" - -#: pisi/cli/commands.py:896 -msgid "Package found in repository:" -msgstr "" - -#: pisi/cli/commands.py:900 -msgid "%s is not found in repositories" -msgstr "" - -#: pisi/cli/commands.py:903 -msgid "%s is not installed" -msgstr "" - -#: pisi/cli/commands.py:916 -msgid "Reverse Dependencies:" -msgstr "" - -#: pisi/cli/commands.py:919 -msgid "" -"\n" -"Files:" -msgstr "" - -#: pisi/cli/commands.py:927 -msgid "File information not available" -msgstr "" - -#: pisi/cli/commands.py:933 -#, docstring -msgid "" -"Verify installation\n" -"\n" -"Usage: check [ ... ]\n" -"\n" -": package name\n" -"\n" -"A cryptographic checksum is stored for each installed\n" -"file. Check command uses the checksums to verify a package.\n" -"Just give the names of packages.\n" -"\n" -"If no packages are given, checks all installed packages.\n" -msgstr "" - -#: pisi/cli/commands.py:957 -msgid "Checking all installed packages" -msgstr "" - -#: pisi/cli/commands.py:960 -msgid "* Checking %s... " -msgstr "" - -#: pisi/cli/commands.py:964 -msgid "" -"\n" -"Package %s is corrupt." -msgstr "" - -#: pisi/cli/commands.py:968 -msgid "Package %s not installed" -msgstr "" - -#: pisi/cli/commands.py:973 -#, docstring -msgid "" -"Index PiSi files in a given directory\n" -"\n" -"Usage: index ...\n" -"\n" -"This command searches for all PiSi files in a directory, collects PiSi\n" -"tags from them and accumulates the information in an output XML file,\n" -"named by default 'pisi-index.xml'. In particular, it indexes both\n" -"source and binary packages.\n" -"\n" -"If you give multiple directories, the command still works, but puts\n" -"everything in a single index file.\n" -msgstr "" - -#: pisi/cli/commands.py:994 -msgid "index options" -msgstr "" - -#: pisi/cli/commands.py:998 -msgid "Store absolute links for indexed files." -msgstr "" - -#: pisi/cli/commands.py:1001 -msgid "Index output file" -msgstr "" - -#: pisi/cli/commands.py:1004 -msgid "Do not index PiSi spec files." -msgstr "" - -#: pisi/cli/commands.py:1007 -msgid "Do not sign index." -msgstr "" - -#: pisi/cli/commands.py:1020 -msgid "Indexing current directory." -msgstr "" - -#: pisi/cli/commands.py:1028 -#, docstring -msgid "" -"Print the list of all installed packages\n" -"\n" -"Usage: list-installed\n" -msgstr "" - -#: pisi/cli/commands.py:1042 -msgid "list-installed options" -msgstr "" - -#: pisi/cli/commands.py:1045 pisi/cli/commands.py:1278 -#: pisi/cli/commands.py:1342 pisi/cli/commands.py:1381 -#: pisi/cli/commands.py:1421 pisi/cli/commands.py:1555 -msgid "Show in long format" -msgstr "" - -#: pisi/cli/commands.py:1047 -msgid "List installed packages under given component" -msgstr "" - -#: pisi/cli/commands.py:1049 pisi/cli/commands.py:1425 -msgid "Show detailed install info" -msgstr "" - -#: pisi/cli/commands.py:1066 pisi/cli/commands.py:1444 -msgid "Package Name |St| Version| Rel.| Build| Distro| Date" -msgstr "" - -#: pisi/cli/commands.py:1081 -#, docstring -msgid "" -"Rebuild Databases\n" -"\n" -"Usage: rebuilddb [ ... ]\n" -"\n" -"Rebuilds the PiSi databases\n" -"\n" -"If package specs are given, they should be the names of package\n" -"dirs under /var/lib/pisi\n" -msgstr "" - -#: pisi/cli/commands.py:1099 -msgid "rebuild-db options" -msgstr "" - -#: pisi/cli/commands.py:1102 -msgid "Rebuild files database" -msgstr "" - -#: pisi/cli/commands.py:1113 -msgid "Rebuild PiSi databases?" -msgstr "" - -#: pisi/cli/commands.py:1120 -#, docstring -msgid "" -"Update repository databases\n" -"\n" -"Usage: update-repo [ ... ]\n" -"\n" -": repository name\n" -"\n" -"Synchronizes the PiSi databases with the current repository.\n" -"If no repository is given, all repositories are updated.\n" -msgstr "" - -#: pisi/cli/commands.py:1138 -msgid "update-repo options" -msgstr "" - -#: pisi/cli/commands.py:1142 -msgid "Update database in any case" -msgstr "" - -#: pisi/cli/commands.py:1160 -#, docstring -msgid "" -"Add a repository\n" -"\n" -"Usage: add-repo \n" -"\n" -": name of repository to add\n" -": URI of index file\n" -"\n" -"If no repo is given, add-repo pardus-devel repo is added by default\n" -"\n" -"NB: We support only local files (e.g., /a/b/c) and http:// URIs at the moment\n" -msgstr "" - -#: pisi/cli/commands.py:1180 -msgid "add-repo options" -msgstr "" - -#: pisi/cli/commands.py:1183 -msgid "Add repository at given position (0 is first)" -msgstr "" - -#: pisi/cli/commands.py:1197 -msgid "Update PiSi database for repository %s?" -msgstr "" - -#: pisi/cli/commands.py:1201 -msgid "%s repository could not be reached. Removing %s from system." -msgstr "" - -#: pisi/cli/commands.py:1210 -#, docstring -msgid "" -"Remove repositories\n" -"\n" -"Usage: remove-repo ... \n" -"\n" -"Remove all repository information from the system.\n" -msgstr "" - -#: pisi/cli/commands.py:1236 -#, docstring -msgid "" -"List repositories\n" -"\n" -"Usage: list-repo\n" -"\n" -"Lists currently tracked repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1259 -#, docstring -msgid "" -"List available packages in the repositories\n" -"\n" -"Usage: list-available [ ... repon ]\n" -"\n" -"Gives a brief list of PiSi packages published in the specified\n" -"repositories. If no repository is specified, we list packages in\n" -"all repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1276 -msgid "list-available options" -msgstr "" - -#: pisi/cli/commands.py:1280 -msgid "List available packages under given component" -msgstr "" - -#: pisi/cli/commands.py:1282 -msgid "Show uninstalled packages only" -msgstr "" - -#: pisi/cli/commands.py:1290 -msgid "Installed packages are shown in this color" -msgstr "" - -#: pisi/cli/commands.py:1298 -msgid "" -"Repository : %s\n" -msgstr "" - -#: pisi/cli/commands.py:1325 -#, docstring -msgid "" -"List available components\n" -"\n" -"Usage: list-components\n" -"\n" -"Gives a brief list of PiSi components published in the\n" -"repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1340 -msgid "list-components options" -msgstr "" - -#: pisi/cli/commands.py:1365 -#, docstring -msgid "" -"List available sources\n" -"\n" -"Usage: list-sources\n" -"\n" -"Gives a brief list of sources published in the repositories.\n" -msgstr "" - -#: pisi/cli/commands.py:1379 -msgid "list-sources options" -msgstr "" - -#: pisi/cli/commands.py:1404 -#, docstring -msgid "" -"List packages to be upgraded\n" -"\n" -"Usage: list-upgrades\n" -"\n" -"Lists the packages that will be upgraded.\n" -msgstr "" - -#: pisi/cli/commands.py:1418 -msgid "list-upgrades options" -msgstr "" - -#: pisi/cli/commands.py:1423 -msgid "List upgradable packages under given component" -msgstr "" - -#: pisi/cli/commands.py:1440 pisi/operations.py:466 -msgid "No packages to upgrade." -msgstr "" - -#: pisi/cli/commands.py:1460 -#, docstring -msgid "" -"List pending packages\n" -"\n" -"Lists packages waiting to be configured.\n" -msgstr "" - -#: pisi/cli/commands.py:1482 -msgid "There are no packages waiting to be configured" -msgstr "" - -#: pisi/cli/commands.py:1487 -#, docstring -msgid "" -"Search packages\n" -"\n" -"Usage: search ... \n" -"\n" -"Finds a package containing specified search terms\n" -"in summary, description, and package name fields.\n" -msgstr "" - -#: pisi/cli/commands.py:1502 -msgid "search options" -msgstr "" - -#: pisi/cli/commands.py:1505 -msgid "Set search language" -msgstr "" - -#: pisi/cli/commands.py:1510 -msgid "Show details" -msgstr "" - -#: pisi/cli/commands.py:1530 -msgid "%s packages found" -msgstr "" - -#: pisi/cli/commands.py:1539 -#, docstring -msgid "" -"Search for a file\n" -"\n" -"Usage: search-file ... \n" -"\n" -"Finds the installed package which contains the specified file.\n" -msgstr "" - -#: pisi/cli/commands.py:1553 -msgid "search-file options" -msgstr "" - -#: pisi/cli/commands.py:1557 -msgid "Fuzzy search" -msgstr "" - -#: pisi/cli/commands.py:1559 -msgid "Show only package name" -msgstr "" - -#: pisi/cli/commands.py:1580 -msgid "Package %s has file %s" -msgstr "" - -#: pisi/cli/commands.py:1582 -msgid "Type: %s, Hash: %s" -msgstr "" - -#: pisi/cli/commands.py:1585 -msgid "Path '%s' does not belong to an installed package" -msgstr "" - -#: pisi/cli/commands.py:1598 -msgid "Searching for %s" -msgstr "" - -#: pisi/cli/commands.py:1608 -msgid "" -"%prog [options] [arguments]\n" -"\n" -"where is one of:\n" -"\n" -msgstr "" - -#: pisi/cli/commands.py:1614 -msgid "" -"\n" -"Use \"%prog help \" for help on a specific command.\n" -msgstr "" - -#: pisi/cli/pisicli.py:56 -msgid "Options must precede non-option arguments" -msgstr "" - -#: pisi/cli/pisicli.py:97 -msgid "No command given" -msgstr "" - -#: pisi/cli/pisicli.py:100 -msgid "Command line parsing error" -msgstr "" - -#: pisi/comariface.py:54 -msgid "cannot connect to comar" -msgstr "" - -#: pisi/comariface.py:72 -msgid "Could not restart comar" -msgstr "" - -#: pisi/comariface.py:77 -msgid "connection with comar unexpectedly closed" -msgstr "" - -#: pisi/comariface.py:90 -msgid "Configuration error: %s" -msgstr "" - -#: pisi/comariface.py:92 -msgid "Script error: %s" -msgstr "" - -#: pisi/comariface.py:94 -msgid "comar denied our access" -msgstr "" - -#: pisi/comariface.py:99 -msgid "Configuring %s package" -msgstr "" - -#: pisi/comariface.py:104 -msgid "Registering %s comar script" -msgstr "" - -#: pisi/comariface.py:110 -msgid "Calling post install handlers" -msgstr "" - -#: pisi/comariface.py:115 -msgid "Running package's post install script" -msgstr "" - -#: pisi/comariface.py:122 -msgid "Configuring %s package for removal" -msgstr "" - -#: pisi/comariface.py:125 -msgid "Running package's pre remove script" -msgstr "" - -#: pisi/comariface.py:129 -msgid "Calling pre remove handlers" -msgstr "" - -#: pisi/comariface.py:133 -msgid "Unregistering comar scripts" -msgstr "" - -#: pisi/component.py:97 pisi/component.py:103 -msgid "Component %s not found" -msgstr "" - -#: pisi/component.py:199 pisi/component.py:225 -msgid "Information for component %s not available" -msgstr "" - -#: pisi/config.py:61 -msgid "Destination directory %s does not exist. Creating it." -msgstr "" - -#: pisi/configfile.py:105 -msgid "No section by name '%s'" -msgstr "" - -#: pisi/conflict.py:39 pisi/dependency.py:40 -msgid " version >= " -msgstr "" - -#: pisi/conflict.py:41 pisi/dependency.py:42 -msgid " version <= " -msgstr "" - -#: pisi/conflict.py:43 pisi/dependency.py:44 -msgid " release >= " -msgstr "" - -#: pisi/conflict.py:45 pisi/dependency.py:46 -msgid " release <= " -msgstr "" - -#: pisi/constants.py:30 -msgid "Can't rebind constant: %s" -msgstr "" - -#: pisi/constants.py:36 -msgid "Can't unbind constant: %s" -msgstr "" - -#: pisi/dependency.py:103 -msgid "Package %s does not satisfy dependency %s" -msgstr "" - -#: pisi/dependency.py:116 -msgid "Package %s is not present in the package database" -msgstr "" - -#: pisi/fetcher.py:81 -msgid "Filename error" -msgstr "" - -#: pisi/fetcher.py:84 -msgid "Access denied to write to destination directory: \"%s\"" -msgstr "" - -#: pisi/fetcher.py:89 -msgid "Access denied to destination file: \"%s\"" -msgstr "" - -#: pisi/fetcher.py:100 -msgid "A problem occured. Please check the archive address and/or permissions again." -msgstr "" - -#: pisi/fetcher.py:158 -msgid "No such file or no permission to read" -msgstr "" - -#: pisi/fetcher.py:183 -msgid "Requested range not satisfiable, starting again." -msgstr "" - -#: pisi/fetcher.py:190 -msgid "Cannot fetch %s; value error: %s" -msgstr "" - -#: pisi/fetcher.py:192 pisi/fetcher.py:194 pisi/fetcher.py:196 -msgid "Cannot fetch %s; %s" -msgstr "" - -#: pisi/fetcher.py:198 -msgid "Cannot fetch %s; (%s): %s" -msgstr "" - -#: pisi/fetcher.py:244 -msgid "Proxy configuration has been found for '%s' protocol" -msgstr "" - -#: pisi/fetcher.py:328 pisi/fetcher.py:349 pisi/fetcher.py:362 -msgid "ftp error" -msgstr "" - -#: pisi/file.py:66 -msgid "uri must have type either URI or string" -msgstr "" - -#: pisi/file.py:89 -msgid "zip compression not supported yet" -msgstr "" - -#: pisi/file.py:117 -msgid "Fetching %s" -msgstr "" - -#: pisi/file.py:122 -msgid "Copying %s to transfer dir" -msgstr "" - -#: pisi/file.py:127 -msgid "File '%s' not found." -msgstr "" - -#: pisi/file.py:135 -msgid "File integrity of %s compromised." -msgstr "" - -#: pisi/file.py:155 -msgid "File mode must be either File.read or File.write" -msgstr "" - -#: pisi/file.py:160 -msgid "Remote write not implemented" -msgstr "" - -#: pisi/file.py:187 -msgid "gzip compression not supported yet" -msgstr "" - -#: pisi/file.py:202 pisi/file.py:205 -msgid "ERROR: gpg --detach-sig %s failed" -msgstr "" - -#: pisi/graph.py:31 -msgid "Encountered cycle %s" -msgstr "" - -#: pisi/index.py:92 -msgid "Adding %s to package index" -msgstr "" - -#: pisi/index.py:95 -msgid "Adding %s to component index" -msgstr "" - -#: pisi/index.py:113 -msgid "Updating package database of %s" -msgstr "" - -#: pisi/index.py:141 -msgid "Package %s: metadata corrupt, skipping..." -msgstr "" - -#: pisi/index.py:169 -msgid "Adding %s to source index" -msgstr "" - -#: pisi/installdb.py:58 -msgid "installed" -msgstr "" - -#: pisi/installdb.py:58 -msgid "installed-pending" -msgstr "" - -#: pisi/installdb.py:59 -msgid "purged" -msgstr "" - -#: pisi/installdb.py:59 -msgid "removed" -msgstr "" - -#: pisi/installdb.py:62 -msgid "" -"State: %s\n" -"Version: %s, Release: %s, Build: %s\n" -msgstr "" - -#: pisi/installdb.py:67 -msgid "" -"Distribution: %s, Install Time: %s\n" -msgstr "" - -#: pisi/installdb.py:154 -msgid "Already installed" -msgstr "" - -#: pisi/itembyrepodb.py:120 -msgid "Invalid repository string" -msgstr "" - -#: pisi/itembyrepodb.py:142 -msgid "Key %s not found" -msgstr "" - -#: pisi/itembyrepodb.py:152 -msgid "Key %s in repo %s not found" -msgstr "" - -#: pisi/lockeddbshelve.py:47 -msgid "Database version for %s insufficient. Please run rebuild-db command." -msgstr "" - -#: pisi/lockeddbshelve.py:51 -msgid "Database version for %s greater than PiSi version. You need a newer PiSi." -msgstr "" - -#: pisi/lockeddbshelve.py:62 -msgid "Cannot attain write access to database environment" -msgstr "" - -#: pisi/lockeddbshelve.py:64 -msgid "Database version %s not present." -msgstr "" - -#: pisi/lockeddbshelve.py:71 pisi/lockeddbshelve.py:153 -msgid "Another instance of PiSi is running. Only one instance is allowed to modify the PiSi database at a time." -msgstr "" - -#: pisi/lockeddbshelve.py:81 -msgid "Cannot attain read access to database environment" -msgstr "" - -#: pisi/lockeddbshelve.py:95 -msgid "Cannot attain write access to PiSi database. You have to be root for this operation." -msgstr "" - -#: pisi/lockeddbshelve.py:113 -msgid "Cannot attain read or write access to database %s" -msgstr "" - -#: pisi/lockeddbshelve.py:139 -msgid "Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" -msgstr "" - -#: pisi/metadata.py:58 -msgid "" -"Distribution: %s, Dist. Release: %s\n" -msgstr "" - -#: pisi/metadata.py:60 -msgid "Architecture: %s, Installed Size: %s" -msgstr "" - -#: pisi/mirrors.py:46 -msgid "Mirrors file %s does not exist. Could not resolve mirrors://" -msgstr "" - -#: pisi/operations.py:114 -msgid "Mixing file names and package names not supported yet." -msgstr "" - -#: pisi/operations.py:156 -msgid "" -"The following packages will be installed\n" -"in the respective order to satisfy extra dependencies:\n" -msgstr "" - -#: pisi/operations.py:159 pisi/operations.py:621 -msgid "Do you want to continue?" -msgstr "" - -#: pisi/operations.py:160 -msgid "External dependencies not satisfied" -msgstr "" - -#: pisi/operations.py:172 pisi/operations.py:339 -msgid "No packages to install." -msgstr "" - -#: pisi/operations.py:203 -msgid "Installation order: " -msgstr "" - -#: pisi/operations.py:257 pisi/operations.py:279 -msgid "Conflicts remain" -msgstr "" - -#: pisi/operations.py:267 -msgid "Selected packages [%s] are in conflict with each other." -msgstr "" - -#: pisi/operations.py:273 -msgid "" -"[%s conflicts with: %s]\n" -msgstr "" - -#: pisi/operations.py:275 -msgid "" -"The following packages have conflicts:\n" -"%s" -msgstr "" - -#: pisi/operations.py:278 -msgid "Remove the following conflicting packages?" -msgstr "" - -#: pisi/operations.py:305 -msgid "Safety switch: Following packages in system.base will be installed: " -msgstr "" - -#: pisi/operations.py:311 -msgid "Safety switch: Following packages in system.base will be upgraded: " -msgstr "" - -#: pisi/operations.py:317 pisi/operations.py:597 -msgid "Safety switch: the component system.base cannot be found" -msgstr "" - -#: pisi/operations.py:334 -msgid "" -"The following package(s) are already installed and are not going to be installed again:\n" -msgstr "" - -#: pisi/operations.py:355 -msgid "" -"Following packages will be installed in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:360 pisi/operations.py:491 -msgid "Total size of package(s): %.2f %s" -msgstr "" - -#: pisi/operations.py:366 pisi/operations.py:497 pisi/operations.py:709 -msgid "There are extra packages due to dependencies. Do you want to continue?" -msgstr "" - -#: pisi/operations.py:432 -msgid "Warning: package *name* ends with '.pisi'" -msgstr "" - -#: pisi/operations.py:435 -msgid "Package %s is not installed." -msgstr "" - -#: pisi/operations.py:441 -msgid "Package %s is not available in repositories." -msgstr "" - -#: pisi/operations.py:453 -msgid "Package %s is already at the latest release %s." -msgstr "" - -#: pisi/operations.py:459 -msgid "Package %s is already at the latest build %s." -msgstr "" - -#: pisi/operations.py:486 -msgid "The following packages will be upgraded: " -msgstr "" - -#: pisi/operations.py:552 -msgid "Dependency %s of %s cannot be satisfied" -msgstr "" - -#: pisi/operations.py:553 -msgid "Upgrade is not possible." -msgstr "" - -#: pisi/operations.py:568 -msgid "Reverse dependency %s of %s cannot be satisfied" -msgstr "" - -#: pisi/operations.py:593 -msgid "Safety switch: cannot remove the following packages in system.base: " -msgstr "" - -#: pisi/operations.py:604 -msgid "Package %s does not exist. Cannot remove." -msgstr "" - -#: pisi/operations.py:608 -msgid "No packages to remove." -msgstr "" - -#: pisi/operations.py:617 -msgid "" -"The following minimal list of packages will be removed\n" -"in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:622 -msgid "Package removal declined" -msgstr "" - -#: pisi/operations.py:634 -msgid "Package %s is not installed. Cannot remove." -msgstr "" - -#: pisi/operations.py:683 -msgid "No packages to emerge." -msgstr "" - -#: pisi/operations.py:698 -msgid "" -"The following minimal list of packages will be installed\n" -"from repository in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:701 -msgid "" -"The following minimal list of packages will be built and\n" -"installed in the respective order to satisfy dependencies:\n" -msgstr "" - -#: pisi/operations.py:743 -msgid "Cannot find source package: %s" -msgstr "" - -#: pisi/package.py:56 -msgid "" -"There was a problem while fetching '%s'.\n" -"The package may have been upgraded. Please try to upgrade the package." -msgstr "" - -#: pisi/package.py:60 pisi/sourcearchive.py:94 -msgid "%s [cached]" -msgstr "" - -#: pisi/package.py:131 -msgid "MetaData format wrong" -msgstr "" - -#: pisi/packagedb.py:66 -msgid "Package %s not found" -msgstr "" - -#: pisi/pxml/autoxml.py:77 -msgid "At least one '%s' tag should have local text" -msgstr "" - -#: pisi/pxml/autoxml.py:84 -msgid "'%s' language of tag '%s' is empty" -msgstr "" - -#: pisi/pxml/autoxml.py:112 -msgid "LocalText: unable to get either current or default locale" -msgstr "" - -#: pisi/pxml/autoxml.py:118 pisi/pxml/autoxml.py:133 -msgid "Tag should have at least the current locale, or failing that an English or Turkish version" -msgstr "" - -#: pisi/pxml/autoxml.py:368 -msgid "autoxml.check: '%s' errors" -msgstr "" - -#: pisi/pxml/autoxml.py:423 pisi/pxml/autoxml.py:433 -msgid "autoxml.parse: String '%s' has errors" -msgstr "" - -#: pisi/pxml/autoxml.py:443 pisi/pxml/autoxml.py:453 -msgid "autoxml.read: File '%s' has errors" -msgstr "" - -#: pisi/pxml/autoxml.py:461 -msgid "autoxml.write: object validation has failed" -msgstr "" - -#: pisi/pxml/autoxml.py:469 -msgid "autoxml.write: File encoding '%s' has errors" -msgstr "" - -#: pisi/pxml/autoxml.py:519 -msgid "gen_tag: unrecognized tag type %s in spec" -msgstr "" - -#: pisi/pxml/autoxml.py:567 pisi/pxml/autoxml.py:578 -msgid "Mandatory variable %s not available" -msgstr "" - -#: pisi/pxml/autoxml.py:648 -msgid "Type mismatch: read text cannot be decoded" -msgstr "" - -#: pisi/pxml/autoxml.py:652 pisi/pxml/autoxml.py:661 -msgid "Mandatory token %s not available" -msgstr "" - -#: pisi/pxml/autoxml.py:666 -msgid "Type mismatch. Expected %s, got %s" -msgstr "" - -#: pisi/pxml/autoxml.py:696 pisi/pxml/autoxml.py:812 -msgid "Type mismatch: DOM cannot be decoded" -msgstr "" - -#: pisi/pxml/autoxml.py:699 pisi/pxml/autoxml.py:715 pisi/pxml/autoxml.py:725 -#: pisi/pxml/autoxml.py:815 pisi/pxml/autoxml.py:829 pisi/pxml/autoxml.py:839 -msgid "Mandatory argument not available" -msgstr "" - -#: pisi/pxml/autoxml.py:712 pisi/pxml/autoxml.py:826 -msgid "Object cannot be encoded" -msgstr "" - -#: pisi/pxml/autoxml.py:737 -msgid "List type must contain only one element" -msgstr "" - -#: pisi/pxml/autoxml.py:750 pisi/pxml/autoxml.py:771 -msgid "Mandatory list \"%s\" under \"%s\" node is empty." -msgstr "" - -#: pisi/pxml/xmlext.py:79 -msgid "getNodeText: Expected text node, got something else!" -msgstr "" - -#: pisi/pxml/xmlfile.py:64 -msgid "String '%s' has invalid XML" -msgstr "" - -#: pisi/pxml/xmlfile.py:72 pisi/pxml/xmlfile.py:87 -msgid "File '%s' has invalid XML" -msgstr "" - -#: pisi/repodb.py:74 -msgid "No repository named %s exists" -msgstr "" - -#: pisi/repodb.py:83 -msgid "Repository %s already exists" -msgstr "" - -#: pisi/repodb.py:90 -msgid "Cannot add repository at position %s" -msgstr "" - -#: pisi/scenarioapi/package.py:67 -msgid "No pisi package: %s* found." -msgstr "" - -#: pisi/scenarioapi/repoops.py:28 -msgid "Repo already has package named %s." -msgstr "" - -#: pisi/scenarioapi/repoops.py:52 pisi/scenarioapi/repoops.py:59 -msgid "Repo does not have package named %s." -msgstr "" - -#: pisi/sourcearchive.py:63 -msgid "Trying fallback address: %s" -msgstr "" - -#: pisi/sourcearchive.py:74 -msgid "%s mirrors are not defined." -msgstr "" - -#: pisi/sourcearchive.py:79 -msgid "Fetching source from mirror: %s" -msgstr "" - -#: pisi/sourcearchive.py:85 -msgid "Could not fetch source from %s mirrors." -msgstr "" - -#: pisi/sourcearchive.py:103 -msgid "unpack: check_file_hash failed" -msgstr "" - -#: pisi/sourcedb.py:59 pisi/sourcedb.py:65 -msgid "Source package %s not found" -msgstr "" - -#: pisi/specfile.py:141 -msgid "URI: %s, type: %s, sha1sum: %s" -msgstr "" - -#: pisi/specfile.py:208 -msgid "" -"Name: %s, version: %s, release: %s, build %s\n" -msgstr "" - -#: pisi/specfile.py:210 -msgid "" -"Summary: %s\n" -msgstr "" - -#: pisi/specfile.py:211 -msgid "" -"Description: %s\n" -msgstr "" - -#: pisi/specfile.py:212 -msgid "" -"Component: %s\n" -msgstr "" - -#: pisi/specfile.py:213 -msgid "Provides: " -msgstr "" - -#: pisi/specfile.py:217 -msgid "Dependencies: " -msgstr "" - -#: pisi/uri.py:80 -msgid "setAuthInfo needs a tuple (user, pass)" -msgstr "" - -#: pisi/util.py:122 pisi/util.py:143 -msgid "Running " -msgstr "" - -#: pisi/util.py:126 pisi/util.py:161 -msgid "return value for \"%s\" is %s" -msgstr "" - -#: pisi/util.py:364 -msgid "Including external link '%s'" -msgstr "" - -#: pisi/util.py:366 -msgid "Including directory '%s'" -msgstr "" - -#: pisi/util.py:440 -msgid "I/O Error: Cannot calculate SHA1 hash of %s" -msgstr "" - -#: pisi/util.py:451 -msgid "Cannot calculate SHA1 hash of given data" -msgstr "" - -#: pisi/util.py:488 -msgid "ERROR: patch (%s) failed" -msgstr "" - -#: pisi/util.py:490 -msgid "ERROR: patch (%s) failed: %s" -msgstr "" - -#: pisi/util.py:536 -msgid "strip command failed for file '%s'!" -msgstr "" - -#: pisi/util.py:543 -msgid "objcopy (keep-debug) command failed for file '%s'!" -msgstr "" - -#: pisi/util.py:549 -msgid "objcopy (add-debuglink) command failed for file '%s'!" -msgstr "" - -#: pisi/util.py:610 -msgid "Updating environment..." -msgstr "" - -#: scripts/repostats.py:361 -msgid "" -"Duplicate binary packages:\n" -"%s\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:366 -msgid "Unknown file type '%s' in package '%s'" -msgstr "" - -#: scripts/repostats.py:422 -msgid "" -"Duplicate source packages:\n" -"%s\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:442 -msgid "Source package '%s' has wrong date format '%s'" -msgstr "" - -#: scripts/repostats.py:481 -msgid "Developer '%s <%s>' has another mail address '%s' in source package '%s'" -msgstr "" - -#: scripts/repostats.py:564 -msgid "" -"Cannot parse '%s':\n" -"%s\n" -msgstr "" - -#: scripts/repostats.py:642 -msgid "" -"Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n" -msgstr "" - -#: scripts/repostats.py:643 -msgid "" -"Dont generate the web site.\n" -msgstr "" - -#: scripts/repostats.py:664 -msgid "" -"Scanning source repository...\n" -msgstr "" - -#: scripts/repostats.py:668 -msgid "" -"Scanning binary packages...\n" -msgstr "" - -#: scripts/repostats.py:673 -msgid "" -"Encountered %d errors! Fix them immediately!\n" -msgstr "" - -#: scripts/repostats.py:681 -msgid "" -"These dependencies are not available in repository:\n" -msgstr "" - diff --git a/tags/pisi-1.1_rc10/po/tr.po b/tags/pisi-1.1_rc10/po/tr.po deleted file mode 100644 index e2142ba6..00000000 --- a/tags/pisi-1.1_rc10/po/tr.po +++ /dev/null @@ -1,2873 +0,0 @@ -# translation of tr.po to -# Eray Ozkural , 2005,2006. -# Furkan Duman , 2006. -# Faik Uygur , 2006. -# PiSi Translation -# Copyright (C) 2005, 2006 Free Software Foundation, Inc. -msgid "" -msgstr "" -"Project-Id-Version: tr\n" -"POT-Creation-Date: 2006-12-08 21:29+EET\n" -"PO-Revision-Date: 2006-12-08 20:59+0200\n" -"Last-Translator: Faik Uygur \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: KBabel 1.11.4\n" - -#: /usr/lib/python2.4/optparse.py:1 -msgid "" -"optparse - a powerful, extensible, and easy-to-use option parser.\n" -"\n" -"By Greg Ward \n" -"\n" -"Originally distributed as Optik; see http://optik.sourceforge.net/ .\n" -"\n" -"If you have problems with this module, please do not file bugs,\n" -"patches, or feature requests with Python; instead, use Optik's\n" -"SourceForge project page:\n" -" http://sourceforge.net/projects/optik\n" -"\n" -"For support, use the optik-users@lists.sourceforge.net mailing list\n" -"(http://lists.sourceforge.net/lists/listinfo/optik-users).\n" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:93 -msgid "" -"\n" -" Raised if an Option instance is created with invalid or\n" -" inconsistent arguments.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:109 -msgid "" -"\n" -" Raised if conflicting options are added to an OptionParser.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:114 -msgid "" -"\n" -" Raised if an invalid option value is encountered on the command\n" -" line.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:120 -msgid "" -"\n" -" Raised if an invalid or ambiguous option is seen on the command-line.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:298 pisi/cli/commands.py:50 -msgid "Return a comma-separated list of option strings & metavariables." -msgstr "" - -#: /usr/lib/python2.4/optparse.py:317 -msgid "" -"Format help with indented section bodies.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:329 pisi/cli/commands.py:44 -msgid "usage: %s\n" -msgstr "kullanımı: %s\n" - -#: /usr/lib/python2.4/optparse.py:336 -msgid "" -"Format help with underlined section headers.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:348 -msgid "Usage" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:354 -msgid "integer" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:355 -msgid "long integer" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:356 -msgid "floating-point" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:357 -msgid "complex" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:365 -msgid "option %s: invalid %s value: %r" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:373 -msgid "option %s: invalid choice: %r (choose from %s)" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:382 -msgid "" -"\n" -" Instance attributes:\n" -" _short_opts : [string]\n" -" _long_opts : [string]\n" -"\n" -" action : string\n" -" type : string\n" -" dest : string\n" -" default : any\n" -" nargs : int\n" -" const : any\n" -" choices : [string]\n" -" callback : function\n" -" callback_args : (any*)\n" -" callback_kwargs : { string : any }\n" -" help : string\n" -" metavar : string\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:781 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary, but only\n" -" use keys from dict that already have a corresponding attribute\n" -" in self. Any keys in dict without a corresponding attribute\n" -" are silently ignored.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:794 -msgid "" -"\n" -" Update the option values from an arbitrary dictionary,\n" -" using all keys from the dictionary regardless of whether\n" -" they have a corresponding attribute in self or not.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:926 -msgid "" -"add_option(Option)\n" -" add_option(opt_str, ..., kwarg=val, ...)\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1138 -msgid "show this help message and exit" -msgstr "Bu yardım mesajını göster ve çık" - -#: /usr/lib/python2.4/optparse.py:1143 -msgid "show program's version number and exit" -msgstr "Program'ın versiyon numarasını göster ve çık" - -#: /usr/lib/python2.4/optparse.py:1166 -msgid "%prog [options]" -msgstr "%prog [seçenekler]" - -#: /usr/lib/python2.4/optparse.py:1246 -msgid "" -"\n" -" parse_args(args : [string] = sys.argv[1:],\n" -" values : Values = None)\n" -" -> (values : Values, args : [string])\n" -"\n" -" Parse the command-line options found in 'args' (default:\n" -" sys.argv[1:]). Any errors result in a call to 'error()', which\n" -" by default prints the usage message to stderr and calls\n" -" sys.exit() with an error message. On success returns a pair\n" -" (values, args) where 'values' is an Values instance (with all\n" -" your option values) and 'args' is the list of arguments left\n" -" over after parsing options.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1285 -msgid "" -"\n" -" check_values(values : Values, args : [string])\n" -" -> (values : Values, args : [string])\n" -"\n" -" Check that the supplied option values and leftover arguments are\n" -" valid. Returns the option values and leftover arguments\n" -" (possibly adjusted, possibly completely new -- whatever you\n" -" like). Default implementation just returns the passed-in\n" -" values; subclasses may override as desired.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1298 -msgid "" -"_process_args(largs : [string],\n" -" rargs : [string],\n" -" values : Values)\n" -"\n" -" Process command-line arguments and populate 'values', consuming\n" -" options and arguments from 'rargs'. If 'allow_interspersed_args' " -"is\n" -" false, stop at the first non-option argument. If true, accumulate " -"any\n" -" interspersed non-option arguments in 'largs'.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1349 -msgid "" -"_match_long_opt(opt : string) -> string\n" -"\n" -" Determine which long option string 'opt' matches, ie. which one\n" -" it is an unambiguous abbrevation for. Raises BadOptionError if\n" -" 'opt' doesn't unambiguously match any long option string.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1376 /usr/lib/python2.4/optparse.py:1415 -msgid "%s option requires an argument" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1378 /usr/lib/python2.4/optparse.py:1417 -msgid "%s option requires %d arguments" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1387 -msgid "%s option does not take a value" -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1404 /usr/lib/python2.4/optparse.py:1558 -msgid "no such option: %s" -msgstr "böyle bir seçenek yok: %s" - -#: /usr/lib/python2.4/optparse.py:1454 -msgid "" -"error(msg : string)\n" -"\n" -" Print a usage message incorporating 'msg' to stderr and exit.\n" -" If you override this in a subclass, it should not return -- it\n" -" should either exit or raise an exception.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1471 -msgid "" -"print_usage(file : file = stdout)\n" -"\n" -" Print the usage message for the current program (self.usage) to\n" -" 'file' (default stdout). Any occurence of the string \"%prog\" in\n" -" self.usage is replaced with the name of the current program\n" -" (basename of sys.argv[0]). Does nothing if self.usage is empty\n" -" or not defined.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1489 -msgid "" -"print_version(file : file = stdout)\n" -"\n" -" Print the version message for this program (self.version) to\n" -" 'file' (default stdout). As with print_usage(), any occurence\n" -" of \"%prog\" in self.version is replaced by the current program's\n" -" name. Does nothing if self.version is empty or undefined.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1504 -msgid "options" -msgstr "seçenekler" - -#: /usr/lib/python2.4/optparse.py:1528 -msgid "" -"print_help(file : file = stdout)\n" -"\n" -" Print an extended help message, listing all options and any\n" -" help text provided with them, to 'file' (default stdout).\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1541 -msgid "" -"_match_abbrev(s : string, wordmap : {string : Option}) -> string\n" -"\n" -" Return the string key in 'wordmap' for which 's' is an unambiguous\n" -" abbreviation. If 's' is found to be ambiguous or doesn't match any of\n" -" 'words', raise BadOptionError.\n" -" " -msgstr "" - -#: /usr/lib/python2.4/optparse.py:1562 -msgid "ambiguous option: %s (%s?)" -msgstr "" - -#: pisi-cli:46 -msgid "Keyboard Interrupt: Exiting..." -msgstr "Klavye kesmesi: Çıkıyor..." - -#: pisi-cli:49 -msgid "Program Terminated." -msgstr "Program sonlandırıldı." - -#: pisi-cli:52 -msgid "" -"A database operation has been aborted. You should run pisi\n" -"again for normal DB recovery procedure. Make sure you have free disk " -"space. \n" -"You have to run rebuild-db only when there is file corruption and database " -"upgrades." -msgstr "" -"Bir veritabanı işlemi yarıda kesildi. PiSi'yi normal veritabanı \n" -"düzeltme işlemi için yeniden çalıştırmalısınız. Boş disk \n" -"alanınızın bulunduğuna emin olun.\n" -"Sadece dosya bozulması ve veritabanı versiyon değişimi oluğu zaman rebuild-" -"db komutunu kullanmanız gerekir." - -#: pisi-cli:57 -msgid "" -"Unhandled internal exception.\n" -"Please file a bug report. (http://bugs.uludag.org.tr)" -msgstr "" -"Eksik hata denetlemesi.\n" -"Lütfen bir hata raporu bildiriniz. (http://bugs.uludag.org.tr)" - -#: pisi-cli:63 -msgid "System Error. Program Terminated." -msgstr "Sistem Hatası: Program Sonlandırıldı. " - -#: pisi-cli:70 -msgid "Please use 'pisi help' for general help." -msgstr "Genel yardım için lütfen 'pisi help' komutunu kullanınız. " - -#: pisi-cli:73 -msgid "Traceback:" -msgstr "Geri-iz:" - -#: pisi-cli:77 -msgid "Use --debug to see a traceback." -msgstr "" -"Bir geri-iz (traceback) görmek için lütfen --debug seçeneğini kullanın." - -#: pisi/actionsapi/autotools.py:36 -msgid "" -"Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" -"Lütfen hata raporunuza config.log dosyasını ekleyin:\n" -"%s/config.log" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/actionsapi/autotools.py:75 pisi/actionsapi/autotools.py:85 -#: pisi/actionsapi/kde.py:65 pisi/actionsapi/perlmodules.py:54 -#: pisi/actionsapi/perlmodules.py:57 -msgid "Configure failed." -msgstr "Yapılandırma başarısızlığa uğradı." - -# pisi/actionsapi/autotools.py:77 :87 -#: pisi/actionsapi/autotools.py:77 pisi/actionsapi/autotools.py:87 -#: pisi/actionsapi/kde.py:67 -msgid "No configure script found." -msgstr "Yapılandırma betiği bulunamadı." - -#: pisi/actionsapi/autotools.py:96 pisi/actionsapi/kde.py:72 -#: pisi/actionsapi/perlmodules.py:63 pisi/actionsapi/perlmodules.py:72 -#: pisi/actionsapi/pythonmodules.py:49 pisi/actionsapi/scons.py:39 -msgid "Make failed." -msgstr "İnşa başarısızlığa uğradı." - -# pisi/actionsapi/autotools.py:119 :127 -#: pisi/actionsapi/autotools.py:124 pisi/actionsapi/autotools.py:134 -#: pisi/actionsapi/kde.py:79 pisi/actionsapi/pythonmodules.py:54 -#: pisi/actionsapi/scons.py:43 -msgid "Install failed." -msgstr "Kurulum başarısızlığa uğradı." - -# pisi/actionsapi/autotools.py:121 :129 -#: pisi/actionsapi/autotools.py:126 pisi/actionsapi/autotools.py:136 -#: pisi/actionsapi/kde.py:81 -msgid "No Makefile found." -msgstr "Makefile bulunamadı." - -#: pisi/actionsapi/autotools.py:143 -msgid "Running aclocal failed." -msgstr "aclocal çalıştırılamadı." - -# pisi/actionsapi/autotools.py:139 :144 -#: pisi/actionsapi/autotools.py:148 -msgid "Running autoconf failed." -msgstr "autoconf çalıştırılamadı." - -# pisi/actionsapi/autotools.py:139 :144 -#: pisi/actionsapi/autotools.py:153 -msgid "Running autoreconf failed." -msgstr "autoreconf çalıştırılamadı." - -#: pisi/actionsapi/autotools.py:158 -msgid "Running automake failed." -msgstr "automake çalıştırılamadı." - -#: pisi/actionsapi/autotools.py:163 -msgid "Running autoheader failed." -msgstr "autoheader çalıştırılamadı." - -#: pisi/actionsapi/get.py:163 -msgid "Util %s cannot be found" -msgstr "Araç %s bulunamıyor" - -#: pisi/actionsapi/get.py:165 -msgid "Warning: %s does not exist, using plain name %s" -msgstr "Uyarı: %s yok, düz ad %s kullanılıyor" - -#: pisi/actionsapi/kde.py:34 -msgid "" -"\n" -"!!! Please attach the config.log to your bug report:\n" -"%s/config.log" -msgstr "" -"\n" -"Lütfen hata raporunuza config.log dosyasını ekleyin:\n" -"%s/config.log" - -#: pisi/actionsapi/libtools.py:38 -msgid "Running ldconfig failed." -msgstr "ldconfig çalıştırılamadı" - -#: pisi/actionsapi/libtools.py:49 -msgid "GNU Config Update Finished." -msgstr "GNU yapılandırma güncellemesi bitti" - -#: pisi/actionsapi/libtools.py:53 -msgid "Running libtoolize failed." -msgstr "libtoolize çalıştırılamadı" - -# pisi/actionsapi/autotools.py:119 :127 -#: pisi/actionsapi/perlmodules.py:66 -msgid "perl build failed." -msgstr "perl inşası başarısızlığa uğgradı." - -# pisi/actionsapi/autotools.py:119 :127 -#: pisi/actionsapi/perlmodules.py:75 -msgid "perl install failed." -msgstr "perl kurma işlemi başarısızlığa uğgradı." - -#: pisi/actionsapi/pisitools.py:126 -msgid "ActionsAPI [doman]: Wrong man page file: %s" -msgstr "ActionsAPI [doman]: Yanlış kılavuz sayfası dosyası: %s" - -#: pisi/actionsapi/pisitools.py:164 -msgid "ActionsAPI [rename]: No such file or directory: %s" -msgstr "ActionsAPI [rename]: Böyle bir dosya ya da dizin bulunamadı: %s" - -#: pisi/actionsapi/pisitools.py:181 -msgid "File does not exist or permission denied: %s" -msgstr "Dosya yok ya da erişim engellendi: %s" - -#: pisi/actionsapi/pisitools.py:198 -msgid "ActionsAPI [dosym]: File exists: %s" -msgstr "ActionsAPI [dosym]: %s dosyası sistemde var" - -# pisi/actionsapi/pisitoolsfunctions.py:46 :59 -#: pisi/actionsapi/pisitoolsfunctions.py:45 -#: pisi/actionsapi/pisitoolsfunctions.py:59 -#: pisi/actionsapi/pisitoolsfunctions.py:72 -msgid "Insufficient arguments." -msgstr "Yetersiz argümanlar" - -#: pisi/actionsapi/pythonmodules.py:66 -msgid "Running %s failed." -msgstr "%s çalıştırılamadı" - -#: pisi/actionsapi/shelltools.py:49 -msgid "Cannot create directory %s" -msgstr "%s dizini yaratılamıyor." - -#: pisi/actionsapi/shelltools.py:57 -msgid "ActionsAPI [echo]: Can't append to file %s." -msgstr "ActionsAPI [echo]: %s dosyasına eklenemiyor." - -#: pisi/actionsapi/shelltools.py:66 -msgid "ActionsAPI [chmod]: Operation not permitted: %s (mode: %s)" -msgstr "ActionsAPI [chmod]: İşleme izin verilmedi: %s (mod: %s)" - -#: pisi/actionsapi/shelltools.py:69 -msgid "ActionsAPI [chmod]: File %s doesn't exists." -msgstr "ActionsAPI [chmod]: %s dosyası bulunamadı." - -#: pisi/actionsapi/shelltools.py:77 -msgid "ActionsAPI [chown]: Operation not permitted: %s (uid: %s, gid: %s)" -msgstr "ActionsAPI [chown]: İşleme izin verilmedi: %s (uid: %s, gid: %s)" - -#: pisi/actionsapi/shelltools.py:80 -msgid "ActionsAPI [chown]: File %s doesn't exists." -msgstr "ActionsAPI [chown]: %s dosyası bulunamadı." - -#: pisi/actionsapi/shelltools.py:87 -msgid "ActionsAPI [sym]: Permission denied: %s to %s" -msgstr "ActionsAPI [sym]: Erişim engellendi: %s -> %s" - -#: pisi/actionsapi/shelltools.py:95 -msgid "ActionsAPI [unlink]: Permission denied: %s." -msgstr "ActionsAPI [unlink]: İzin verilmedi: %s." - -#: pisi/actionsapi/shelltools.py:99 -msgid "ActionsAPI [unlink]: File %s doesn't exists." -msgstr "ActionsAPI [unlink]: %s dosyası bulunamadı." - -#: pisi/actionsapi/shelltools.py:107 -msgid "ActionsAPI [unlinkDir]: Operation not permitted: %s" -msgstr "ActionsAPI [unlinkDir]: İşleme izin verilmedi: %s" - -#: pisi/actionsapi/shelltools.py:111 -msgid "ActionsAPI [unlinkDir]: Directory %s doesn't exists." -msgstr "ActionsAPI [unlinkDir]: %s dizini bulunamadı." - -#: pisi/actionsapi/shelltools.py:120 -msgid "ActionsAPI [move]: Permission denied: %s to %s" -msgstr "ActionsAPI [move]: Erişim engellendi: %s -> %s" - -#: pisi/actionsapi/shelltools.py:122 -msgid "ActionsAPI [move]: File %s doesn't exists." -msgstr "ActionsAPI [move]: %s dosyası bulunamadı." - -#: pisi/actionsapi/shelltools.py:132 -msgid "ActionsAPI [copy]: Permission denied: %s to %s" -msgstr "ActionsAPI [copy]: Erişim engellendi: %s -> %s" - -#: pisi/actionsapi/shelltools.py:148 -msgid "ActionsAPI [copy]: File %s does not exist." -msgstr "ActionsAPI [copy]: %s dosyası bulunamadı." - -#: pisi/actionsapi/shelltools.py:163 -msgid "ActionsAPI [copytree] %s to %s: %s" -msgstr "ActionsAPI [copytree]: %s konumundan %s konumuna: %s" - -#: pisi/actionsapi/shelltools.py:165 -msgid "ActionsAPI [copytree]: Directory %s doesn't exists." -msgstr "ActionsAPI [copytree]: %s dizini bulunamadı." - -#: pisi/actionsapi/shelltools.py:177 -msgid "ActionsAPI [touch]: Permission denied: %s" -msgstr "ActionsAPI [touch]: Erişim engellendi: %s" - -#: pisi/api.py:302 pisi/comariface.py:30 -msgid "comar package is not fully installed" -msgstr "comar paketi tam olarak kurulmamış" - -#: pisi/api.py:314 -msgid "File %s not found" -msgstr "Dosya %s bulunamadı." - -#: pisi/api.py:375 -msgid "Checking /%s " -msgstr "/%s kontrol ediliyor " - -#: pisi/api.py:379 -msgid "" -"\n" -"Corrupt file: %s" -msgstr "" -"\n" -"Bozuk dosya: %s" - -#: pisi/api.py:381 pisi/cli/commands.py:966 -msgid "OK" -msgstr "Tamam" - -#: pisi/api.py:394 -msgid "* Building index of PiSi files under %s" -msgstr "* %s altındaki PiSi dosyalarının bir indeksi yapılıyor" - -#: pisi/api.py:401 -msgid "* Index file written" -msgstr "* İndeks dosyası yazıldı" - -#: pisi/api.py:405 -msgid "Repo %s already present." -msgstr "Depo %s halihazırda var." - -#: pisi/api.py:409 -msgid "Repo %s added to system." -msgstr "%s isimli depo sisteme eklendi." - -#: pisi/api.py:415 -msgid "Repo %s removed from system." -msgstr "%s isimli depo sistemden çıkarıldı." - -#: pisi/api.py:417 -msgid "Repository %s does not exist. Cannot remove." -msgstr "%s deposu yok. Kaldırılamıyor." - -#: pisi/api.py:424 -msgid "* Updating repository: %s" -msgstr "* %s deposu güncelleniyor" - -#: pisi/api.py:432 -msgid "No updates available for repository %s." -msgstr "%s deposu için güncelleme yok." - -#: pisi/api.py:434 -msgid "Updating database at any rate as requested" -msgstr "Veritabanı istek üzerine güncelleniyor" - -#: pisi/api.py:445 -msgid "* Package database updated." -msgstr "* Paket veritabanı güncellendi." - -#: pisi/api.py:447 pisi/api.py:472 -msgid "No repository named %s found." -msgstr "%s adında bir depo bulunamadı." - -#: pisi/api.py:455 -msgid "* Rebuilding '%s' named repo... " -msgstr "* '%s' isimli depo yeniden inşa ediliyor... " - -#: pisi/api.py:468 -msgid "Input/Output error while reading %s: %s" -msgstr "%s okunurken girdi/çıktı hatası: %s" - -#: pisi/api.py:525 -msgid "Rebuilding package database" -msgstr "Paket veritabanı yeniden inşa ediliyor" - -#: pisi/archive.py:36 -msgid "" -"An error has occured while running LZMA:\n" -"%s" -msgstr "" -"LZMA çalıştırılırken bir hata oluştu:\n" -"%s" - -#: pisi/archive.py:101 pisi/archive.py:161 -msgid "Archive type not recognized" -msgstr "Arşiv tipi tanınmadı" - -#: pisi/atomicoperations.py:66 -msgid "Package %s found in repository %s" -msgstr "Paket %s, %s deposunda bulundu" - -#: pisi/atomicoperations.py:78 -msgid "Package URI: %s" -msgstr "Paket adresi: %s" - -#: pisi/atomicoperations.py:82 -msgid "Package %s not found in any active repository." -msgstr "%s isimli paket hiç bir etkin depoda bulunamadı." - -#: pisi/atomicoperations.py:101 -msgid "Installing %s, version %s, release %s, build %s" -msgstr "%s paketi, versiyon %s, sürüm %s, inşa %s kuruluyor" - -#: pisi/atomicoperations.py:146 -msgid "Dependencies for %s not satisfied" -msgstr "%s paketi için bağımlılıklar sağlanmadı" - -#: pisi/atomicoperations.py:148 -msgid "Package not installable" -msgstr "Paket kurulabilir durumda değil" - -#: pisi/atomicoperations.py:166 -msgid "/%s from %s package\n" -msgstr "/%s %s paketinden\n" - -#: pisi/atomicoperations.py:167 -msgid "" -"File conflicts:\n" -"%s" -msgstr "" -"Dosya çakışmaları:\n" -"%s" - -#: pisi/atomicoperations.py:202 -msgid "Re-install same version package?" -msgstr "Aynı versiyona sahip paketi yeniden yerleştireyim mi?" - -#: pisi/atomicoperations.py:203 -msgid "Package re-install declined" -msgstr "Paketi yeniden yerleştirmeye izin verilmedi" - -#: pisi/atomicoperations.py:209 -msgid "Upgrading to new upstream version" -msgstr "Yeni orijinal versiyona yükseltiliyor" - -#: pisi/atomicoperations.py:212 -msgid "Upgrading to new distribution release" -msgstr "Yeni dağıtım sürümüne yukseltiliyor" - -#: pisi/atomicoperations.py:216 -msgid "Upgrading to new distribution build" -msgstr "Yeni dağıtım inşasına yukseltiliyor" - -#: pisi/atomicoperations.py:226 -msgid "Downgrade to old distribution release?" -msgstr "Eski dağıtım sürümüne dönülsün mü?" - -#: pisi/atomicoperations.py:228 -msgid "Downgrade to old distribution build?" -msgstr "Eski dağıtım inşasına dönülsün mü?" - -#: pisi/atomicoperations.py:230 -msgid "Package downgrade declined" -msgstr "Paket eskileştirilmesine izin verilmedi" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/atomicoperations.py:254 -msgid "%s configuration failed." -msgstr "%s yapılandırması başarısızlığa uğradı." - -#: pisi/atomicoperations.py:341 -msgid "Storing %s, " -msgstr "%s saklanıyor, " - -#: pisi/atomicoperations.py:344 -msgid "Storing %s." -msgstr "%s saklanıyor." - -#: pisi/atomicoperations.py:351 -msgid "Storing %s" -msgstr "%s saklanıyor" - -#: pisi/atomicoperations.py:407 -msgid "File list could not be read for package %s, continuing removal." -msgstr "" -"%s paketi için dosya listesi okunamadı, kaldırma işlemine devam ediliyor. " - -#: pisi/atomicoperations.py:413 -msgid "Removing package %s" -msgstr "%s paketi kaldırılıyor" - -#: pisi/atomicoperations.py:416 -msgid "Trying to remove nonexistent package " -msgstr "Varolmayan paket kaldırılmaya çalışıldı" - -#: pisi/atomicoperations.py:455 -msgid "Not removing conflicted file : %s" -msgstr "Çakışan dosya silinmiyor : %s" - -#: pisi/atomicoperations.py:475 -msgid "" -"Installed file %s is not exists on system [Probably you manually deleted]" -msgstr "Kurulmuş dosya %s sistemde bulunmuyor [Muhtemelen el ile silindi]" - -#: pisi/atomicoperations.py:536 -msgid "Metadata XML '%s' cannot be found" -msgstr "'%s' isimli metadata XML bulunamıyor" - -#: pisi/atomicoperations.py:544 -msgid "MetaData format wrong (%s)" -msgstr "MetaData biçimi yanlış (%s)" - -#: pisi/atomicoperations.py:546 -msgid "* Adding '%s' to db... " -msgstr "* '%s' veritabanına ekleniyor... " - -#: pisi/atomicoperations.py:552 -msgid "Files XML '%s' cannot be found" -msgstr "Files XML '%s' bulunamıyor" - -#: pisi/atomicoperations.py:557 pisi/package.py:136 -msgid "Invalid %s" -msgstr "Geçersiz %s" - -#: pisi/atomicoperations.py:566 -msgid "OK." -msgstr "Tamam." - -#: pisi/build.py:88 -msgid "Path %s belongs in multiple packages" -msgstr "Yol %s birden çok pakete ait" - -#: pisi/build.py:114 -msgid "Source URI: %s" -msgstr "Kaynak adresi: %s" - -#: pisi/build.py:118 -msgid "Source %s not found in any active repository." -msgstr "%s isimli kaynak paket hiç bir etkin depoda bulunamadı." - -#: pisi/build.py:183 -msgid "Building PiSi source package: %s" -msgstr "PiSi kaynak paketi %s inşa ediliyor" - -#: pisi/build.py:229 -msgid "IceCream detected. Make sure your daemon is up and running..." -msgstr "" -"IceCream bulundu. Lütfen artalan sürecinizin çalıştığından emin olunuz." - -#: pisi/build.py:234 -msgid "CCache detected..." -msgstr "Derleme zamanını kısaltan ccache bulundu..." - -#: pisi/build.py:287 -msgid "PartOf tag not defined, looking for component" -msgstr "PartOf imi tanımlanmamış, bileşen araştırılyor" - -#: pisi/build.py:297 -msgid "Cannot find component.xml in upper directory" -msgstr "component.xml üst dizinde bulunamıyor" - -#: pisi/build.py:301 -msgid "Source is part of %s component" -msgstr "Kaynak %s bileşeninin parçası" - -#: pisi/build.py:305 -msgid "Fetching source from: %s" -msgstr "Kaynak %s adresinden indiriliyor" - -#: pisi/build.py:307 -msgid "Source archive is stored: %s/%s" -msgstr "Kaynak arşivi saklandı: %s/%s" - -#: pisi/build.py:311 -msgid "Unpacking archive..." -msgstr "Arşiv açılıyor..." - -#: pisi/build.py:313 -msgid " unpacked (%s)" -msgstr " açıldı (%s)" - -#: pisi/build.py:318 -msgid "Setting up source..." -msgstr "Kaynak yapılandırılıyor" - -#: pisi/build.py:323 -msgid "Building source..." -msgstr "Kaynak inşa ediliyor..." - -#: pisi/build.py:328 -msgid "Installing..." -msgstr "Kuruluyor..." - -#: pisi/build.py:370 -msgid "Unable to read Actions Script (%s): %s" -msgstr "Action betiği okunamıyor (%s): %s" - -#: pisi/build.py:372 -msgid "SyntaxError in Actions Script (%s): %s" -msgstr "Action betiğinde sözdizimi hatası (%s): %s" - -#: pisi/build.py:389 -msgid "Unable to read COMAR script (%s): %s" -msgstr "Action betiği okunamıyor (%s): %s" - -#: pisi/build.py:391 -msgid "SyntaxError in COMAR file (%s): %s" -msgstr "Action betiğinde sözdizimi hatası (%s): %s" - -#: pisi/build.py:417 -msgid "unable to call function from actions: %s" -msgstr "fonksiyon eylemlerden çağırılamıyor: %s" - -#: pisi/build.py:433 -msgid "" -"Safety switch: following extra packages in system.devel will be installed: " -msgstr "" -"Emniyet mandalı: taban geliştirme sistemi system.devel içindeki bu paketler " -"ek olarak kurulacak:" - -#: pisi/build.py:438 -msgid "Safety switch: system.devel is already installed" -msgstr "" -"Emniyet mandalı: taban geliştirme sistemi system.devel halihazırda kurulu" - -#: pisi/build.py:440 -msgid "Safety switch: the component system.devel cannot be found" -msgstr "Emniyet mandalı: geliştirme sistemi bileşeni system.devel bulunamadı" - -#: pisi/build.py:449 -msgid "Unsatisfied Build Dependencies:" -msgstr "Sağlanmamış inşa bağımlılıkları" - -#: pisi/build.py:453 -msgid "Cannot build package due to unsatisfied build dependencies" -msgstr "Sağlanmamış inşa bağımlılıkları yüzünden paket inşa edilemiyor" - -#: pisi/build.py:461 -msgid "Build dependency %s cannot be satisfied" -msgstr "İnşa bağımlılığı %s sağlanamadı" - -#: pisi/build.py:463 -msgid "Do you want to install the unsatisfied build dependencies" -msgstr "Sağlanmamış inşa bağımlılıklarını kurmak istiyor musunuz? " - -#: pisi/build.py:464 -msgid "Installing build dependencies." -msgstr "İnşa bağımlılıkları kuruluyor. " - -#: pisi/build.py:469 -msgid "Ignoring build dependencies." -msgstr "İnşa bağımlılıkları yoksayılıyor." - -#: pisi/build.py:479 -msgid "Patch file is missing: %s\n" -msgstr "Yama dosyası eksik: %s\n" - -#: pisi/build.py:492 -msgid "* Applying patch: %s" -msgstr "* Yama uygulanıyor: %s" - -#: pisi/build.py:550 -msgid "Stripping files.." -msgstr "Semboller çıkarılıyor.." - -#: pisi/build.py:656 -msgid "(found old version %s)" -msgstr "(%s numaralı eski versiyon bulundu)" - -#: pisi/build.py:658 -msgid "Skipping %s with wrong pkg name " -msgstr "Yanlış paket adına sahip %s atlanıyor" - -#: pisi/build.py:679 -msgid "(no previous build found, setting build no to 1.)" -msgstr "(önceki bir inşa bulunamadı, inşa numarası 1 yapılıyor)" - -#: pisi/build.py:724 -msgid "(old package lacks a build no, setting build no to 1.)" -msgstr "(önceki paketin bir inşa numarası yok, inşa numarası 1 yapılıyor)" - -#: pisi/build.py:727 -msgid "There are changes, incrementing build no to %d" -msgstr "Değişiklikler var, inşa numarası bir arttırılarak %d yapıldı." - -#: pisi/build.py:730 -msgid "There is no change from previous build %d" -msgstr "Bir önceki %d numaralı inşadan beri bir değişiklik yok." - -#: pisi/build.py:795 -msgid "No user named '%s' found on the system" -msgstr "Sistemde '%s' isminde bir kullanıcı bulunamadı" - -#: pisi/build.py:800 -msgid "No group named '%s' found on the system" -msgstr "Sistemde '%s' isminde bir grup bulunamadı" - -#: pisi/build.py:803 -msgid "** Building package %s" -msgstr "** Paket %s inşa ediliyor" - -# pisi/build.py:503 :506 -#: pisi/build.py:805 pisi/build.py:808 -msgid "Generating %s," -msgstr "%s yaratılıyor," - -#: pisi/build.py:814 -msgid "" -"Build number is not available. For repo builds you must enable buildno in " -"pisi.conf." -msgstr "" -"İnşa (build) sayısı koyulmayacak. Depo inşaları için buildno seçeneğini pisi." -"conf dosyasında etkinleştirmelisiniz." - -#: pisi/build.py:832 -msgid "Creating PiSi package %s." -msgstr "%s adlı PiSi paketi yaratılıyor." - -#: pisi/build.py:877 -msgid "Done." -msgstr "Bitti." - -#: pisi/build.py:883 -msgid "Abandoned files under the install dir (%s):" -msgstr "kurulum dizini (%s) altındaki terkedilmiş dosyalar:" - -#: pisi/build.py:887 -msgid "" -"All of the files under the install dir (%s) has been collected by package(s)" -msgstr "" -"Kurulum dizini (%s) altındaki bütün dosyalar paket(ler) tarafından " -"toplanmıştır" - -#: pisi/build.py:891 -msgid "Cleaning Build Directory..." -msgstr "İnşa dizini siliniyor..." - -#: pisi/build.py:894 -msgid "Keeping Build Directory" -msgstr "İnşa dizini bırakılıyor" - -#: pisi/cli/__init__.py:79 -msgid "Warning: " -msgstr "Uyarı: " - -#: pisi/cli/__init__.py:88 -msgid "Error: " -msgstr "Hata: " - -#: pisi/cli/__init__.py:120 -msgid " (yes/no)" -msgstr " (evet/hayır)" - -#: pisi/cli/__init__.py:141 -msgid " [complete]\n" -msgstr " [bitti]\n" - -#: pisi/cli/__init__.py:151 -msgid "Installed %s" -msgstr "%s paketi kuruldu" - -#: pisi/cli/__init__.py:153 -msgid "Removed %s" -msgstr "%s paketi kaldırıldı" - -#: pisi/cli/__init__.py:155 -msgid "Upgraded %s" -msgstr "%s paketi yükseltildi" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/cli/__init__.py:157 -msgid "Configured %s" -msgstr "%s paketi yapılandırıldı" - -#: pisi/cli/__init__.py:159 -msgid "Extracting the files of %s" -msgstr "%s paketinin dosyaları arşivden çıkartılıyor" - -#: pisi/cli/commands.py:94 -msgid "generic help string for any command" -msgstr "herhangi bir komut yardımı için yer tutucu" - -#: pisi/cli/commands.py:123 pisi/cli/pisicli.py:104 -msgid "Unrecognized command: %s" -msgstr "Tanınmayan komut: %s" - -#: pisi/cli/commands.py:145 -msgid "common options" -msgstr "ortak seçenekler" - -# pisi/build.py:503 :506 -#: pisi/cli/commands.py:148 -msgid "general options" -msgstr "genel seçenekler" - -#: pisi/cli/commands.py:151 -msgid "Change the system root for PiSi commands" -msgstr "Pisi komutları için sistem kök dizinini değiştir" - -#: pisi/cli/commands.py:153 -msgid "Assume yes in all yes/no queries" -msgstr "Bütün evet/hayır sorularında evet varsay" - -#: pisi/cli/commands.py:158 -msgid "Detailed output" -msgstr "Detaylı çıktı" - -#: pisi/cli/commands.py:160 -msgid "Show debugging information" -msgstr "Hata ayıklama bilgisini göster" - -#: pisi/cli/commands.py:162 -msgid "Suppresses all coloring of PiSi's output" -msgstr "PiSi'nin tüm çıktı renklendirmelerini önler" - -#: pisi/cli/commands.py:169 -msgid "" -"This is a fall back function. If the implementer module provides an\n" -" options function it will be called" -msgstr "" - -#: pisi/cli/commands.py:181 -msgid "Destination directory %s does not exist. Creating directory.\n" -msgstr "%s isimli hedef dizini bulunamadı. Dizin yaratılıyor.\n" - -#: pisi/cli/commands.py:203 -msgid "Password: " -msgstr "Parola: " - -#: pisi/cli/commands.py:209 -msgid "initialize PiSi components" -msgstr "PiSi bileşenlerini hazırla" - -#: pisi/cli/commands.py:217 -msgid "do cleanup work for PiSi components" -msgstr "" - -#: pisi/cli/commands.py:231 -msgid "print help for the command" -msgstr "komut için yardım yaz" - -#: pisi/cli/commands.py:237 -msgid "exit program" -msgstr "programdan çık" - -#: pisi/cli/commands.py:239 -msgid "Command terminated abnormally." -msgstr "Komut anormal biçimde sonlandı." - -#: pisi/cli/commands.py:249 -msgid "Command lacks name" -msgstr "Komut adı eksik" - -#: pisi/cli/commands.py:253 -msgid "Duplicate command %s" -msgstr "Aynı adlı komut: %s" - -#: pisi/cli/commands.py:262 -msgid "" -"Prints help for given commands\n" -"\n" -"Usage: help [ ... ]\n" -"\n" -"If run without parameters, it prints the general help." -msgstr "" -"Verilen komutlar için yardım metnini gösterir\n" -"\n" -"Kullanım: help [ ... ]\n" -"\n" -"Eğer parametre verilmezse genel yardımı yazar." - -#: pisi/cli/commands.py:296 -msgid "" -"Clean stale locks\n" -"\n" -"Usage: clean\n" -"\n" -"PiSi uses filesystem locks for managing database access.\n" -"This command deletes unused locks from the database directory." -msgstr "" -"Bayat kilitleri temizler\n" -"\n" -"Kullanım: clean\n" -"\n" -"PiSi veritabanı erişimini yönetmek için dosyasistemi kilitlerini kullanır.\n" -"Bu komut veritabanı dizinindeki kullanılmayan kilitleri siler." - -#: pisi/cli/commands.py:315 -msgid "" -"Delete cache files\n" -"\n" -"Usage: delete-cache\n" -"\n" -"Sources, packages and temporary files are stored\n" -"under /var directory. Since these accumulate they can\n" -"consume a lot of disk space." -msgstr "" -"Önbellek dosyalarını sil\n" -"\n" -"Kullanım: delete-cache\n" -"\n" -"Kaynaklar, paketler ve geçici dosyalar /var dizini altında \n" -"saklanır. Bunlar biriktiğinden çok disk alanı kaplayabilirler." - -#: pisi/cli/commands.py:336 -msgid "" -"Graph package relations\n" -"\n" -"Usage: graph [ ...]\n" -"\n" -"Write a graph of package relations, tracking dependency and\n" -"conflicts relations starting from given packages. By default\n" -"shows the package relations among repository packages, and writes\n" -"the package in graphviz format to 'pgraph.dot'.\n" -msgstr "" -"Paket ilişkilerini çiz\n" -"Kullanım: graph ...\n" -"\n" -"Paket ilişkilerinin bir çizgesini, bağımlılık ve çatışma\n" -"ilişkilerini verilen paketlerden takip ederek yaz.\n" -"Öntanımlı olarak depo paketlerdeki paket ilişkilerini gösterir\n" -"ve paketi graphviz biçiminde 'pgraph.dot' dosyasına yazar.\n" - -#: pisi/cli/commands.py:353 -msgid "graph options" -msgstr "graph seçenekleri" - -#: pisi/cli/commands.py:357 -msgid "Specify a particular repository" -msgstr "Belli bir depoyu belirt" - -#: pisi/cli/commands.py:360 -msgid "Graph of installed packages" -msgstr "Kurulu paketlerin çizgesi" - -#: pisi/cli/commands.py:363 -msgid "Do not show installed packages" -msgstr "Kurulu paketleri gösterme" - -#: pisi/cli/commands.py:366 -msgid "Dot output file" -msgstr "Dot çıktı dosyası" - -#: pisi/cli/commands.py:377 -msgid "Plotting packages in repository %s" -msgstr "%s deposundaki paketler çiziliyor" - -#: pisi/cli/commands.py:383 -msgid "Plotting a graph of relations among all repository packages" -msgstr "Depolardaki bütün paketlerin arasındaki ilişkiler çiziliyor" - -#: pisi/cli/commands.py:390 -msgid "Plotting a graph of relations among all installed packages" -msgstr "Bütün kurulu paketler arasındaki ilişkiler çiziliyor" - -#: pisi/cli/commands.py:402 -msgid "Do not take build no into account." -msgstr "İnşa numarasını dikkate alma" - -#: pisi/cli/commands.py:407 -msgid "Do not take dependency information into account" -msgstr "Bağımlılık bilgilerini dikkate alma" - -#: pisi/cli/commands.py:411 -msgid "" -"Build PiSi packages\n" -"\n" -"Usage: build [ | ] ...\n" -"\n" -"You can give a URI of the pspec.xml file. PiSi will\n" -"fetch all necessary files and build the package for you.\n" -"\n" -"Alternatively, you can give the name of a source package\n" -"to be downloaded from a repository containing sources.\n" -msgstr "" -"PiSi paketlerini inşa et\n" -"\n" -"Kullanım: build [ | ] ...\n" -"\n" -"pspec.xml dosyasının URI'ını verebilirsiniz. PiSi \n" -"gerekli tüm dosyaları sizin için indirip paketleri\n" -"inşa edecektir.\n" -"Yahut, kaynaklar içeren bir depodan indirilmesi için \n" -"kaynak paketinin adını verebilirsiniz. \n" - -#: pisi/cli/commands.py:433 -msgid "build options" -msgstr "inşa seçenekleri" - -#: pisi/cli/commands.py:441 -msgid "Output directory for produced packages" -msgstr "Üretilecek paketler için çıktı dizini" - -#: pisi/cli/commands.py:444 -msgid "Bypass errors from ActionsAPI" -msgstr "ActionsAPI kaynaklı hataları esgeç" - -#: pisi/cli/commands.py:446 pisi/cli/commands.py:554 -msgid "Bypass safety switch" -msgstr "Emniyet mandalını esgeç" - -#: pisi/cli/commands.py:448 -msgid "Create a static package with ar files" -msgstr "Ar dosyaları içeren bir statik paket yarat" - -#: pisi/cli/commands.py:450 -msgid "" -"Do not install build dependencies, fail if a build dependency is present" -msgstr "" -"İnşa bağımlılıklarını kurma, eğer bir inşa bağımlılığı yoksa hatayla çık" - -#: pisi/cli/commands.py:452 -msgid "PiSi binary package formats: '1.0', '1.1' (default)" -msgstr "PiSi ikili paket formatları: '1.0', '1.1' (öntanımlı)" - -#: pisi/cli/commands.py:455 -msgid "build steps" -msgstr "inşa adımları" - -#: pisi/cli/commands.py:457 -msgid "Break build after fetching the source archive" -msgstr "Kaynak arşivini indirdikten sonra inşa'yı sonlandır" - -#: pisi/cli/commands.py:459 -msgid "" -"Break build after unpacking the source archive, checking sha1sum and " -"applying patches" -msgstr "" -"Kaynak arşivini açtıktan, sha1sum kontrolü yaptıktan ve yamaları " -"uyguladıktan sonra inşa'yı sonlandır" - -#: pisi/cli/commands.py:461 -msgid "Break build after running configure step" -msgstr "Yapılandırma adımından sonra inşa'yı sonlandır" - -#: pisi/cli/commands.py:463 -msgid "Break build after running compile step" -msgstr "Derleme adımından sonra inşa'yı sonlandır" - -#: pisi/cli/commands.py:465 -msgid "Break build after running install step" -msgstr "Kurulum adımından sonra inşa'yı sonlandır" - -#: pisi/cli/commands.py:467 -msgid "create PiSi package" -msgstr "PiSi paketini oluştur" - -#: pisi/cli/commands.py:481 -msgid "package_format must be one of %s " -msgstr "package_format, bunlardan birisi olmalı: %s" - -#: pisi/cli/commands.py:484 pisi/cli/commands.py:533 -msgid "Output directory: %s" -msgstr "Çıktı dizini: %s" - -#: pisi/cli/commands.py:486 -msgid "Outputting packages in the working directory." -msgstr "Paketler çalışma dizinine yazılıyor." - -#: pisi/cli/commands.py:497 -msgid "" -"Build and install PiSi source packages from repository\n" -"\n" -"Usage: emerge ...\n" -"\n" -"You should give the name of a source package to be\n" -"downloaded from a repository containing sources.\n" -"\n" -"You can also give the name of a component.\n" -msgstr "" -"Depodan PiSi paketlerini inşa et ve kur\n" -"\n" -"Kullanım: emerge ...\n" -"\n" -"Kaynaklar içeren bir depodan indirilmesi için \n" -"kaynak paketinin adını vermelisiniz. \n" -"\n" -"Bir bileşen adı da verebilirsiniz.\n" - -#: pisi/cli/commands.py:516 -msgid "emerge options" -msgstr "emerge seçenekleri" - -#: pisi/cli/commands.py:519 pisi/cli/commands.py:592 pisi/cli/commands.py:656 -msgid "Ignore file conflicts" -msgstr "Dosya çakışmalarına aldırma" - -#: pisi/cli/commands.py:521 pisi/cli/commands.py:594 pisi/cli/commands.py:658 -msgid "Ignore package conflicts" -msgstr "Paket çakışmalarına aldırma" - -#: pisi/cli/commands.py:523 pisi/cli/commands.py:552 -msgid "Bypass comar configuration agent" -msgstr "Çomar yapılandırma aygıtını kullanma" - -#: pisi/cli/commands.py:535 -msgid "Outputting binary packages in the package cache." -msgstr "İkili paketler paket cebine yazılıyor." - -#: pisi/cli/commands.py:543 -msgid "Abstract package operation command" -msgstr "" - -#: pisi/cli/commands.py:556 -msgid "Do not perform any action, just show what would be done" -msgstr "Hiç bir eylem gerçekleştirme, sadece ne yapılacağını göster" - -#: pisi/cli/commands.py:567 -msgid "" -"Install PiSi packages\n" -"\n" -"Usage: install ... \n" -"\n" -"You may use filenames, URI's or package names for packages. If you have\n" -"specified a package name, it should exist in a specified repository.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"PiSi paketlerini kur\n" -"\n" -"Kullanım: install ... \n" -"\n" -"Paketler için dosya adları, URI'lar veya paket adları kullanabilirsiniz.\n" -"Eğer bir paket adı verdiyseniz, bu paket depoda bulunmalıdır.\n" -"\n" -"Paket adları yerine bileşenler de verebilirsiniz.\n" - -#: pisi/cli/commands.py:585 -msgid "install options" -msgstr "install seçenekleri" - -#: pisi/cli/commands.py:590 -msgid "Reinstall already installed packages" -msgstr "Halihazırda kurulu paketi yeniden kur" - -#: pisi/cli/commands.py:596 -msgid "Install component's and recursive components' packages" -msgstr "Bileşenin ve alt bileşenlerinin paketlerini kur" - -#: pisi/cli/commands.py:598 pisi/cli/commands.py:662 -msgid "Fetch upgrades but do not install." -msgstr "Yükseltilecekleri indir ama kurma" - -#: pisi/cli/commands.py:621 -msgid "" -"Upgrade PiSi packages\n" -"\n" -"Usage: Upgrade [ ... ]\n" -"\n" -": package name\n" -"\n" -"Upgrades the entire system if no package names are given\n" -"\n" -"You may use only package names to specify packages because\n" -"the package upgrade operation is defined only with respect\n" -"to repositories. If you have specified a package name, it\n" -"should exist in the package repositories. If you just want to\n" -"reinstall a package from a PiSi file, use the install command.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"PiSi paketlerini yükselt\n" -"\n" -"Kullanım: Upgrade ... \n" -"\n" -"Paketleri belirtmek için şimdilik sadece paket adları kullanabilirsiniz\n" -"Verdiğiniz paket adları depolarda yer almalıdır. Eğer sadece\n" -"bir dosyayı yeniden kurmak istiyorsanız install komutunu kullanın. \n" -"Paket adları yerine bileşenler de verebilirsiniz.\n" - -#: pisi/cli/commands.py:647 -msgid "upgrade options" -msgstr "upgrade seçenekleri" - -#: pisi/cli/commands.py:652 -msgid "Security related package upgrades only" -msgstr "Sadece güvenlik ile alakalı güncellemeler" - -#: pisi/cli/commands.py:654 -msgid "Do not update repositories" -msgstr "Depoları güncelleme" - -#: pisi/cli/commands.py:660 -msgid "Upgrade component's and recursive components' packages" -msgstr "Bileşenin ve alt bileşenlerinin paketlerini güncelle" - -#: pisi/cli/commands.py:664 -msgid "" -"When upgrading system, ignore packages and components whose basenames match " -"pattern." -msgstr "" -"Sistemi yükseltirken paket ya da bileşen isimlerinden verilen kalıp ile " -"eşleşenleri yok say" - -#: pisi/cli/commands.py:666 -msgid "" -"When upgrading system, ignore packages and components whose " -"basenames match any pattern contained in file." -msgstr "" -"Sistemi yükseltirken paket ya da bileşen isimlerinden dosya içerisinde " -"verilen kalıplardan herhangi birisi ile eşleşenleri yok say" - -#: pisi/cli/commands.py:706 -msgid "Updating repositories" -msgstr "Depolar güncelleniyor" - -#: pisi/cli/commands.py:711 -msgid "Will not update repositories" -msgstr "Depolar güncellenmeyecek" - -#: pisi/cli/commands.py:733 -msgid "" -"Remove PiSi packages\n" -"\n" -"Usage: remove ... \n" -"\n" -"Remove package(s) from your system. Just give the package names to remove.\n" -"\n" -"You can also specify components instead of package names, which will be\n" -"expanded to package names.\n" -msgstr "" -"PiSi paketlerini kaldır\n" -"\n" -"Kullanım: remove ... \n" -"\n" -"Paket(leri) sisteminizden kaldırır. Sadece kaldırılacak paketlerin adlarını " -"verin.\n" -"Paket adları yerine bileşenler de verebilirsiniz.\n" - -#: pisi/cli/commands.py:750 -msgid "remove options" -msgstr "remove seçenekler" - -#: pisi/cli/commands.py:753 -msgid "Remove component's and recursive components' packages" -msgstr "Bileşenin ve alt bileşenlerinin paketlerini kaldır" - -#: pisi/cli/commands.py:775 -msgid "" -"Configure pending packages\n" -"\n" -"If COMAR configuration of some packages were not\n" -"done at installation time, they are added to a list\n" -"of packages waiting to be configured. This command\n" -"configures those packages.\n" -msgstr "" -"Bekleyen paketleri yapılandır\n" -"\n" -"Eğer bazı paketlerin ÇOMAR yapılandırması kurulum zamanında\n" -"yapılmadıysa, yapılandırmayı bekleyen paketler listesine eklenirler.\n" -"Bu komut bekleyen paketleri yapılandırır.\n" - -#: pisi/cli/commands.py:791 -msgid "configure-pending options" -msgstr "configure-pending seçenekleri" - -#: pisi/cli/commands.py:803 -msgid "" -"Display package information\n" -"\n" -"Usage: info ... \n" -"\n" -" is either a package name or a .pisi file,\n" -msgstr "" -"Paket bilgisini göster\n" -"\n" -"Kullanım: info ... \n" -"\n" -" ya bir paket adıdır ya da bir .pisi dosyasıdır.\n" - -#: pisi/cli/commands.py:818 -msgid "info options" -msgstr "info seçenekler" - -#: pisi/cli/commands.py:825 -msgid "Show a list of package files." -msgstr "Paketteki dosyaların bir listesini göster." - -#: pisi/cli/commands.py:827 -msgid "Info about the given component" -msgstr "Verilen bileşen hakkında bilgi" - -#: pisi/cli/commands.py:830 -msgid "Show only paths." -msgstr "Sadece yolları göster" - -#: pisi/cli/commands.py:832 -msgid "Do not show details" -msgstr "Detayları gösterme" - -#: pisi/cli/commands.py:834 -msgid "Output in xml format" -msgstr "Xml biçiminde çıktı" - -#: pisi/cli/commands.py:880 -msgid "Package file: %s" -msgstr "Paket dosyası: %s" - -#: pisi/cli/commands.py:886 -msgid "[inst] " -msgstr "[yüklü]" - -#: pisi/cli/commands.py:888 -msgid "Installed package:" -msgstr "Yüklü paket:" - -#: pisi/cli/commands.py:894 -msgid "[repo] " -msgstr "[depo] " - -#: pisi/cli/commands.py:896 -msgid "Package found in repository:" -msgstr "Paket depoda bulundu:" - -#: pisi/cli/commands.py:900 -msgid "%s is not found in repositories" -msgstr "%s depolarda bulunamadı" - -#: pisi/cli/commands.py:903 -msgid "%s is not installed" -msgstr "%s kurulu değil" - -#: pisi/cli/commands.py:916 -msgid "Reverse Dependencies:" -msgstr "Ters bağımlılıklar:" - -#: pisi/cli/commands.py:919 -msgid "" -"\n" -"Files:" -msgstr "" -"\n" -"Dosyalar:" - -#: pisi/cli/commands.py:927 -msgid "File information not available" -msgstr "Dosya bilgisi bulunamadı" - -#: pisi/cli/commands.py:933 -msgid "" -"Verify installation\n" -"\n" -"Usage: check [ ... ]\n" -"\n" -": package name\n" -"\n" -"A cryptographic checksum is stored for each installed\n" -"file. Check command uses the checksums to verify a package.\n" -"Just give the names of packages.\n" -"\n" -"If no packages are given, checks all installed packages.\n" -msgstr "" -"Kurulumu doğrula\n" -"\n" -"Kurulum: check ... \n" -"\n" -": paket adı \n" -"\n" -"Her kurulu dosya için bir kriptografik kontrol toplamı \n" -"tutulur. Check komutu paket doğrulama işlemi için \n" -"bu kontrol toplamlarını kullanır. \n" -"Eğer paket belirtilmemiş ise tüm paketler üzerinde doğrulama yapar.\n" - -#: pisi/cli/commands.py:957 -msgid "Checking all installed packages" -msgstr "Tüm kurulu paketler denetleniyor" - -#: pisi/cli/commands.py:960 -msgid "* Checking %s... " -msgstr "* %s kontrol ediliyor... " - -#: pisi/cli/commands.py:964 -msgid "" -"\n" -"Package %s is corrupt." -msgstr "" -"\n" -"Paket %s bozuk." - -#: pisi/cli/commands.py:968 -msgid "Package %s not installed" -msgstr "Paket %s kurulmamış" - -#: pisi/cli/commands.py:973 -msgid "" -"Index PiSi files in a given directory\n" -"\n" -"Usage: index ...\n" -"\n" -"This command searches for all PiSi files in a directory, collects PiSi\n" -"tags from them and accumulates the information in an output XML file,\n" -"named by default 'pisi-index.xml'. In particular, it indexes both\n" -"source and binary packages.\n" -"\n" -"If you give multiple directories, the command still works, but puts\n" -"everything in a single index file.\n" -msgstr "" -"Verilen bir dizindeki PiSi dosyalarını indeksle\n" -"\n" -"Kullanım: index \n" -"\n" -"Bu komut bir dizindeki bütün PiSi dosyalarını araştırır, PiSi\n" -"etiketlerini toplar ve bilgiyi çıktı, varsayılan adı 'pisi-index.xml',olan " -"XML dosyasında birleştirir. Özellikle, hem ikili hem kaynak\n" -"paketlerini indeksler.\n" -"\n" -"Eğer birden çok dizin verirseniz, komut hala çalışır, ama herşeyi\n" -"tek bir indeks dosyasına koyar.\n" - -#: pisi/cli/commands.py:994 -msgid "index options" -msgstr "index seçenekleri" - -#: pisi/cli/commands.py:998 -msgid "Store absolute links for indexed files." -msgstr "İndekslenmiş dosyalar için mutlak bağlar sakla." - -#: pisi/cli/commands.py:1001 -msgid "Index output file" -msgstr "İndeks çıktı dosyası" - -#: pisi/cli/commands.py:1004 -msgid "Do not index PiSi spec files." -msgstr "PiSi spec dosyalarını indeksleme." - -#: pisi/cli/commands.py:1007 -msgid "Do not sign index." -msgstr "İndeksi imzalama." - -#: pisi/cli/commands.py:1020 -msgid "Indexing current directory." -msgstr "Şu andaki dizini indeksliyor." - -#: pisi/cli/commands.py:1028 -msgid "" -"Print the list of all installed packages\n" -"\n" -"Usage: list-installed\n" -msgstr "" -"Kurulu paketlerin bir listesini yaz \n" -"\n" -"Kullanım: list-installed\n" - -#: pisi/cli/commands.py:1042 -msgid "list-installed options" -msgstr "list-installed seçenekleri" - -#: pisi/cli/commands.py:1045 pisi/cli/commands.py:1278 -#: pisi/cli/commands.py:1342 pisi/cli/commands.py:1381 -#: pisi/cli/commands.py:1421 pisi/cli/commands.py:1555 -msgid "Show in long format" -msgstr "Uzun biçimde göster" - -#: pisi/cli/commands.py:1047 -msgid "List installed packages under given component" -msgstr "Bileşen altındaki kurulu paketleri listele" - -#: pisi/cli/commands.py:1049 pisi/cli/commands.py:1425 -msgid "Show detailed install info" -msgstr "Detaylı kurulum bilgisi göster" - -# pisi/cli/commands.py:542 :729 -#: pisi/cli/commands.py:1066 pisi/cli/commands.py:1444 -msgid "" -"Package Name |St| Version| Rel.| Build| Distro| Date" -msgstr "" -"Paket Adı |Dm| Versiyon| Sürüm| İnşa| Dağıt.| Tarih" - -#: pisi/cli/commands.py:1081 -msgid "" -"Rebuild Databases\n" -"\n" -"Usage: rebuilddb [ ... ]\n" -"\n" -"Rebuilds the PiSi databases\n" -"\n" -"If package specs are given, they should be the names of package\n" -"dirs under /var/lib/pisi\n" -msgstr "" -"Veritabanlarını yeniden inşa et\n" -"\n" -"Kullanım: rebuilddb [ ... ]\n" -"\n" -"PiSi veritabanlarını yeniden inşa eder\n" -"\n" -"Eğer paket tanımları verildiyse /var/lib/pisi altındaki paket dizinlerinin " -"adları olmalılar\n" - -#: pisi/cli/commands.py:1099 -msgid "rebuild-db options" -msgstr "rebuild-db seçenekleri" - -#: pisi/cli/commands.py:1102 -msgid "Rebuild files database" -msgstr "Dosya veritabanını yeniden inşa et" - -#: pisi/cli/commands.py:1113 -msgid "Rebuild PiSi databases?" -msgstr "PiSi veritabanı yeniden inşa edilsin mi?" - -#: pisi/cli/commands.py:1120 -msgid "" -"Update repository databases\n" -"\n" -"Usage: update-repo [ ... ]\n" -"\n" -": repository name\n" -"\n" -"Synchronizes the PiSi databases with the current repository.\n" -"If no repository is given, all repositories are updated.\n" -msgstr "" -"Depo veritabanlarını güncelle\n" -"\n" -"Kullanım: update-repo [ ... ]\n" -"\n" -": depo adı\n" -"\n" -"PiSi veritabanlarını depo ile eşzamanlı hale getirir.\n" -" Eğer bir depo verilmediyse, bütün depolar güncellenir.\n" - -#: pisi/cli/commands.py:1138 -msgid "update-repo options" -msgstr "update-repo seçenekleri" - -#: pisi/cli/commands.py:1142 -msgid "Update database in any case" -msgstr "Veritabanını her halde güncelle" - -#: pisi/cli/commands.py:1160 -msgid "" -"Add a repository\n" -"\n" -"Usage: add-repo \n" -"\n" -": name of repository to add\n" -": URI of index file\n" -"\n" -"If no repo is given, add-repo pardus-devel repo is added by default\n" -"\n" -"NB: We support only local files (e.g., /a/b/c) and http:// URIs at the " -"moment\n" -msgstr "" -"Bir depo ekle\n" -"\n" -"Kullanım: add-repo \n" -"\n" -": eklenecek deponun adı\n" -": indeks dosyasının URI'ı\n" -"\n" -"Eğer depo verilmezse pardus-devel deposu öntanımlı olarak eklenir. Not: \n" -"Şimdilik sadece yerel dosyalar (örn. /a/b/c) ve http:// veya ftp:// türü \n" -"adresler desteklenir\n" - -#: pisi/cli/commands.py:1180 -msgid "add-repo options" -msgstr "add-repo seçenekler" - -#: pisi/cli/commands.py:1183 -msgid "Add repository at given position (0 is first)" -msgstr "Belirtilen pozisyona depo ekler (0 birinci)" - -#: pisi/cli/commands.py:1197 -msgid "Update PiSi database for repository %s?" -msgstr "%s isimli depo için PiSi veritabanı güncellensin mi?" - -#: pisi/cli/commands.py:1201 -msgid "%s repository could not be reached. Removing %s from system." -msgstr "%s deposuna erişilemedi. %s sistemden kaldırılıyor." - -#: pisi/cli/commands.py:1210 -msgid "" -"Remove repositories\n" -"\n" -"Usage: remove-repo ... \n" -"\n" -"Remove all repository information from the system.\n" -msgstr "" -"Depoları kaldır\n" -"\n" -"Kullanım: remove-repo ... \n" -"\n" -"Sistemden ilgili bütün depo bilgisini kaldır.\n" - -#: pisi/cli/commands.py:1236 -msgid "" -"List repositories\n" -"\n" -"Usage: list-repo\n" -"\n" -"Lists currently tracked repositories.\n" -msgstr "" -"Depoları listele\n" -"\n" -"Kullanım: list-repo\n" -"\n" -"Şu anda izlenen bütün depoları gösterir.\n" - -#: pisi/cli/commands.py:1259 -msgid "" -"List available packages in the repositories\n" -"\n" -"Usage: list-available [ ... repon ]\n" -"\n" -"Gives a brief list of PiSi packages published in the specified\n" -"repositories. If no repository is specified, we list packages in\n" -"all repositories.\n" -msgstr "" -"Depolardaki paketleri göster\n" -"\n" -"Kullanım: list-available [ ... depon ]\n" -"\n" -"Depoda yayımlanmış olan PiSi bileşenlerinin kısa bir listesini verir.\n" -"Eğer bir depo verilmediyse, bütün depolardaki paketleri listeler.\n" - -#: pisi/cli/commands.py:1276 -msgid "list-available options" -msgstr "list-available seçenekleri" - -#: pisi/cli/commands.py:1280 -msgid "List available packages under given component" -msgstr "Bileşen altındaki paketleri listele" - -#: pisi/cli/commands.py:1282 -msgid "Show uninstalled packages only" -msgstr "Sadece kurulu olmayan paketleri göster" - -#: pisi/cli/commands.py:1290 -msgid "Installed packages are shown in this color" -msgstr "Kurulu paketler bu renkle gösterilir" - -#: pisi/cli/commands.py:1298 -msgid "Repository : %s\n" -msgstr "Depo: %s\n" - -#: pisi/cli/commands.py:1325 -msgid "" -"List available components\n" -"\n" -"Usage: list-components\n" -"\n" -"Gives a brief list of PiSi components published in the\n" -"repositories.\n" -msgstr "" -"Depolardaki bileşenleri göster\n" -"\n" -"Kullanım: list-components [ ... depon ]\n" -"\n" -"Depoda yayımlanmış olan PiSi bileşenlerinin kısa bir listesini verir.\n" - -#: pisi/cli/commands.py:1340 -msgid "list-components options" -msgstr "list-components seçenekleri" - -#: pisi/cli/commands.py:1365 -msgid "" -"List available sources\n" -"\n" -"Usage: list-sources\n" -"\n" -"Gives a brief list of sources published in the repositories.\n" -msgstr "" -"Kullanılabilir kaynakları gösterir\n" -"\n" -"Kullanım: list-sources\n" -"\n" -"Depolarda bulunan kaynakların kısa bir listesini verir.\n" - -#: pisi/cli/commands.py:1379 -msgid "list-sources options" -msgstr "list-sources seçenekleri" - -#: pisi/cli/commands.py:1404 -msgid "" -"List packages to be upgraded\n" -"\n" -"Usage: list-upgrades\n" -"\n" -"Lists the packages that will be upgraded.\n" -msgstr "" -"Yükseltilecek paketleri listele\n" -"\n" -"Kullanım: list-upgrades [ ... depon ]\n" - -#: pisi/cli/commands.py:1418 -msgid "list-upgrades options" -msgstr "list-upgrades seçenekleri" - -#: pisi/cli/commands.py:1423 -msgid "List upgradable packages under given component" -msgstr "Bileşen altındaki güncellenebilir paketleri listele" - -#: pisi/cli/commands.py:1440 pisi/operations.py:466 -msgid "No packages to upgrade." -msgstr "Yükseltilecek paket yok." - -#: pisi/cli/commands.py:1460 -msgid "" -"List pending packages\n" -"\n" -"Lists packages waiting to be configured.\n" -msgstr "" -"Bekleyen paketleri göster\n" -"\n" -"Yapılandırmayı bekleyen paketlerin bir listesini verir.\n" - -#: pisi/cli/commands.py:1482 -msgid "There are no packages waiting to be configured" -msgstr "Yapılandırılmayı bekleyen paket yok" - -#: pisi/cli/commands.py:1487 -msgid "" -"Search packages\n" -"\n" -"Usage: search ... \n" -"\n" -"Finds a package containing specified search terms\n" -"in summary, description, and package name fields.\n" -msgstr "" -"Paketleri araştır\n" -"\n" -"Kullanım: search ... \n" -"\n" -"Belirtilen arama terimlerini özet, tanım ve paket adı \n" -"alanlarında içeren paketleri bulur.\n" - -#: pisi/cli/commands.py:1502 -msgid "search options" -msgstr "search seçenekleri" - -#: pisi/cli/commands.py:1505 -msgid "Set search language" -msgstr "Arama dilini seç" - -#: pisi/cli/commands.py:1510 -msgid "Show details" -msgstr "Detayları göster" - -#: pisi/cli/commands.py:1530 -msgid "%s packages found" -msgstr "%s paket bulundu" - -#: pisi/cli/commands.py:1539 -msgid "" -"Search for a file\n" -"\n" -"Usage: search-file ... \n" -"\n" -"Finds the installed package which contains the specified file.\n" -msgstr "" -"Dosya araştır\n" -"\n" -"Kullanım: search-file ... \n" -"\n" -"Belirtilen dosyayı içeren paketi bulur.\n" - -#: pisi/cli/commands.py:1553 -msgid "search-file options" -msgstr "search-file seçenekleri" - -#: pisi/cli/commands.py:1557 -msgid "Fuzzy search" -msgstr "Yaklaşık arama" - -#: pisi/cli/commands.py:1559 -msgid "Show only package name" -msgstr "Sadece paket ismi göster" - -#: pisi/cli/commands.py:1580 -msgid "Package %s has file %s" -msgstr "%s paketi içinde %s dosyası var" - -#: pisi/cli/commands.py:1582 -msgid "Type: %s, Hash: %s" -msgstr "Tip: %s, Hash: %s" - -#: pisi/cli/commands.py:1585 -msgid "Path '%s' does not belong to an installed package" -msgstr "Yol '%s' yerleştirilmiş bir pakete ait değil" - -#: pisi/cli/commands.py:1598 -msgid "Searching for %s" -msgstr "%s'i arıyor" - -#: pisi/cli/commands.py:1608 -msgid "" -"%prog [options] [arguments]\n" -"\n" -"where is one of:\n" -"\n" -msgstr "" -"%prog [seçenekler] [argümanlar]\n" -"\n" -" aşağıdakilerden birisi olabilir:\n" -"\n" - -#: pisi/cli/commands.py:1614 -msgid "" -"\n" -"Use \"%prog help \" for help on a specific command.\n" -msgstr "" -"\n" -"Belirli bir komut hakkında yardım için \"%prog help \"'u kullanınız.\n" - -#: pisi/cli/pisicli.py:56 -msgid "Options must precede non-option arguments" -msgstr "Seçenekler seçenek olmayan argümanlardan önce gelmeli" - -#: pisi/cli/pisicli.py:97 -msgid "No command given" -msgstr "Komut verilmedi" - -#: pisi/cli/pisicli.py:100 -msgid "Command line parsing error" -msgstr "Komut satırı ayrıştırma hatası" - -#: pisi/comariface.py:54 -msgid "cannot connect to comar" -msgstr "comar'a bağlanılamıyor" - -#: pisi/comariface.py:72 -msgid "Could not restart comar" -msgstr "Çomar yeniden başlatılamadı" - -#: pisi/comariface.py:77 -msgid "connection with comar unexpectedly closed" -msgstr "comar ile bağlantı beklenmedik bir şekilde koptu" - -# pisi/actionsapi/autotools.py:75 :85 -#: pisi/comariface.py:90 -msgid "Configuration error: %s" -msgstr "Yapılandırma hatası: %s" - -#: pisi/comariface.py:92 -msgid "Script error: %s" -msgstr "Betik hatası: %s" - -#: pisi/comariface.py:94 -msgid "comar denied our access" -msgstr "comar bize izin vermedi" - -#: pisi/comariface.py:99 -msgid "Configuring %s package" -msgstr "%s paketi yapılandırılıyor" - -#: pisi/comariface.py:104 -msgid "Registering %s comar script" -msgstr "comar betiği %s kayıt ediliyor" - -#: pisi/comariface.py:110 -msgid "Calling post install handlers" -msgstr "Yerleştirme sonrası betikleri çağrılıyor" - -#: pisi/comariface.py:115 -msgid "Running package's post install script" -msgstr "Paketin yerleştirme sonrası betiği çağrılıyor" - -#: pisi/comariface.py:122 -msgid "Configuring %s package for removal" -msgstr "%s paketi kaldırılmak üzere yapılandırılıyor" - -#: pisi/comariface.py:125 -msgid "Running package's pre remove script" -msgstr "Paketin kaldırma öncesi betiği çağrılıyor" - -#: pisi/comariface.py:129 -msgid "Calling pre remove handlers" -msgstr "Kaldırma öncesi betikleri çağrılıyor" - -#: pisi/comariface.py:133 -msgid "Unregistering comar scripts" -msgstr "comar betikleri siliniyor" - -#: pisi/component.py:97 pisi/component.py:103 -msgid "Component %s not found" -msgstr "%s bileşeni bulunamadı" - -#: pisi/component.py:199 pisi/component.py:225 -msgid "Information for component %s not available" -msgstr "Bileşen %s için bilgi bulunamadı" - -#: pisi/config.py:61 -msgid "Destination directory %s does not exist. Creating it." -msgstr "Hedef dizini %s bulunamadı. Yaratılıyor." - -#: pisi/configfile.py:105 -msgid "No section by name '%s'" -msgstr "'%s' diye bir bölüm yok." - -#: pisi/conflict.py:39 pisi/dependency.py:40 -msgid " version >= " -msgstr " versiyon >= " - -#: pisi/conflict.py:41 pisi/dependency.py:42 -msgid " version <= " -msgstr " versiyon <= " - -#: pisi/conflict.py:43 pisi/dependency.py:44 -msgid " release >= " -msgstr " sürüm >= " - -#: pisi/conflict.py:45 pisi/dependency.py:46 -msgid " release <= " -msgstr " sürüm <= " - -#: pisi/constants.py:30 -msgid "Can't rebind constant: %s" -msgstr "Sabit %s değiştirilemez" - -#: pisi/constants.py:36 -msgid "Can't unbind constant: %s" -msgstr "Sabit %s kaldırılamaz" - -#: pisi/dependency.py:103 -msgid "Package %s does not satisfy dependency %s" -msgstr "Paket %s %s bağımlılığını sağlamıyor." - -#: pisi/dependency.py:116 -msgid "Package %s is not present in the package database" -msgstr "Paket %s paket veritabanında bulunmamakta." - -#: pisi/fetcher.py:81 -msgid "Filename error" -msgstr "Dosya adı hatası" - -#: pisi/fetcher.py:84 -msgid "Access denied to write to destination directory: \"%s\"" -msgstr "\"%s\" hedef dizinine yazmaya izin verilmedi." - -#: pisi/fetcher.py:89 -msgid "Access denied to destination file: \"%s\"" -msgstr "\"%s\" hedef dosyasına erişim engellendi." - -#: pisi/fetcher.py:100 -msgid "" -"A problem occured. Please check the archive address and/or permissions again." -msgstr "" -"Bir hata oluştu. Lütfen arşiv adresini ve/veya kullanıcı izinlerini yeniden " -"kontrol edin." - -#: pisi/fetcher.py:158 -msgid "No such file or no permission to read" -msgstr "Öyle bir dosya yok ya da okuma izni yok." - -#: pisi/fetcher.py:183 -msgid "Requested range not satisfiable, starting again." -msgstr "İstenen aralık sağlanamıyor, yeniden başlatılıyor" - -#: pisi/fetcher.py:190 -msgid "Cannot fetch %s; value error: %s" -msgstr "%s indirilemiyor, hata: %s" - -#: pisi/fetcher.py:192 pisi/fetcher.py:194 pisi/fetcher.py:196 -msgid "Cannot fetch %s; %s" -msgstr "%s indirilemiyor; %s" - -#: pisi/fetcher.py:198 -msgid "Cannot fetch %s; (%s): %s" -msgstr "%s indirilemiyor; (%s): %s" - -#: pisi/fetcher.py:244 -msgid "Proxy configuration has been found for '%s' protocol" -msgstr "'%s' protokolü için vekil (proxy) yapılandırması bulundu" - -#: pisi/fetcher.py:328 pisi/fetcher.py:349 pisi/fetcher.py:362 -msgid "ftp error" -msgstr "ftp hatası" - -#: pisi/file.py:66 -msgid "uri must have type either URI or string" -msgstr "uri argümanı ya URI ya da string tipine sahip olmalı" - -#: pisi/file.py:89 -msgid "zip compression not supported yet" -msgstr "zip sıkıştırma henüz desteklenmiyor" - -#: pisi/file.py:117 -msgid "Fetching %s" -msgstr "%s'i indiriyor" - -#: pisi/file.py:122 -msgid "Copying %s to transfer dir" -msgstr "%s aktarım dizinine kopyalanıyor" - -#: pisi/file.py:127 -msgid "File '%s' not found." -msgstr "Dosya '%s' bulunamadı." - -#: pisi/file.py:135 -msgid "File integrity of %s compromised." -msgstr "%s in dosya bütünlüğü bozuk." - -#: pisi/file.py:155 -msgid "File mode must be either File.read or File.write" -msgstr "File modu ya File.read ya da File.write olmalı" - -#: pisi/file.py:160 -msgid "Remote write not implemented" -msgstr "Uzağa yazmalar henüz programlanmadı" - -#: pisi/file.py:187 -msgid "gzip compression not supported yet" -msgstr "gzip sıkıştırma henüz desteklenmiyor" - -#: pisi/file.py:202 pisi/file.py:205 -msgid "ERROR: gpg --detach-sig %s failed" -msgstr "HATA: gpg --detach-sig %s çalışmadı" - -#: pisi/graph.py:31 -msgid "Encountered cycle %s" -msgstr "Çember ile karşılaşıldı: %s" - -#: pisi/index.py:92 -msgid "Adding %s to package index" -msgstr "%s paket indeksine ekleniyor" - -#: pisi/index.py:95 -msgid "Adding %s to component index" -msgstr "%s bileşen indeksine ekleniyor" - -#: pisi/index.py:113 -msgid "Updating package database of %s" -msgstr "%s paket veritabanı güncelleniyor" - -#: pisi/index.py:141 -msgid "Package %s: metadata corrupt, skipping..." -msgstr "Paket %s: metadata bozuk, atlanıyor..." - -#: pisi/index.py:169 -msgid "Adding %s to source index" -msgstr "%s kaynak indeksine ekleniyor" - -#: pisi/installdb.py:58 -msgid "installed" -msgstr "kurulu" - -#: pisi/installdb.py:58 -msgid "installed-pending" -msgstr "kurulu-beklemede" - -#: pisi/installdb.py:59 -msgid "purged" -msgstr "temizlenmiş" - -#: pisi/installdb.py:59 -msgid "removed" -msgstr "kaldırılmış" - -#: pisi/installdb.py:62 -msgid "" -"State: %s\n" -"Version: %s, Release: %s, Build: %s\n" -msgstr "" -"Durum: %s\n" -"Versiyon: %s, Sürüm: %s, İnşa: %s\n" - -#: pisi/installdb.py:67 -msgid "Distribution: %s, Install Time: %s\n" -msgstr "Dağıtım: %s, Yerleştime Zamanı: %s\n" - -#: pisi/installdb.py:154 -msgid "Already installed" -msgstr "Halihazırda yerleştirilmiş." - -#: pisi/itembyrepodb.py:120 -msgid "Invalid repository string" -msgstr "Geçersiz depo adı" - -#: pisi/itembyrepodb.py:142 -msgid "Key %s not found" -msgstr "%s anahtarı bulunamadı" - -#: pisi/itembyrepodb.py:152 -msgid "Key %s in repo %s not found" -msgstr "%s anahtarı %s deposunda bulunamadı" - -#: pisi/lockeddbshelve.py:47 -msgid "Database version for %s insufficient. Please run rebuild-db command." -msgstr "" -"Veritabanı versiyonu %s yetersiz. Lütfen rebuild-db komutunu çalıştırınız." - -#: pisi/lockeddbshelve.py:51 -msgid "" -"Database version for %s greater than PiSi version. You need a newer PiSi." -msgstr "" -"Veritabanı versiyonu %s PiSi versiyonundan büyük. Yeni bir PiSi'ye " -"gereksiniminiz var." - -#: pisi/lockeddbshelve.py:62 -msgid "Cannot attain write access to database environment" -msgstr "Veritabanı ortamına yazma erişimi sağlanamadı" - -#: pisi/lockeddbshelve.py:64 -msgid "Database version %s not present." -msgstr "Veritabanı versiyonu %s bulunamadı." - -#: pisi/lockeddbshelve.py:71 pisi/lockeddbshelve.py:153 -msgid "" -"Another instance of PiSi is running. Only one instance is allowed to modify " -"the PiSi database at a time." -msgstr "" -"Sistemde başka bir yerde daha PiSi çalışıyor. Sadece tek bir PiSi'nin " -"veritabanını değiştirmesine izin verilir." - -#: pisi/lockeddbshelve.py:81 -msgid "Cannot attain read access to database environment" -msgstr "Veritabanı ortamına okuma erişimi sağlanamadı" - -#: pisi/lockeddbshelve.py:95 -msgid "" -"Cannot attain write access to PiSi database. You have to be root for this " -"operation." -msgstr "" -"PiSi veritabanına yazma erişimi sağlanamadı. Bu işlem için root olmalısınız." - -#: pisi/lockeddbshelve.py:113 -msgid "Cannot attain read or write access to database %s" -msgstr "Veritabanı %s için okuma ya da yazma erişimi sağlanamadı" - -#: pisi/lockeddbshelve.py:139 -msgid "" -"Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags" -msgstr "" -"Bayraklar 'r', 'w', 'c' or 'n'den birisi olmalı ya da bsddb.db.DB_* " -"bayraklarını kullanmalı" - -#: pisi/metadata.py:58 -msgid "Distribution: %s, Dist. Release: %s\n" -msgstr "Dağıtım: %s, Dağıtım Sürümü: %s\n" - -#: pisi/metadata.py:60 -msgid "Architecture: %s, Installed Size: %s" -msgstr "Mimari: %s, Yerleşik Boyut: %s" - -#: pisi/mirrors.py:46 -msgid "Mirrors file %s does not exist. Could not resolve mirrors://" -msgstr "Yansı dosyası %s bulunamadı. mirrors:// çözümlenemedi." - -#: pisi/operations.py:114 -msgid "Mixing file names and package names not supported yet." -msgstr "Dosya ve paket adlarını karıştırmak henüz desteklenmiyor." - -#: pisi/operations.py:156 -msgid "" -"The following packages will be installed\n" -"in the respective order to satisfy extra dependencies:\n" -msgstr "" -"Ek bağımlılıkları sağlamak için bu paketler verilen sırada kurulacaktır:\n" - -#: pisi/operations.py:159 pisi/operations.py:621 -msgid "Do you want to continue?" -msgstr "Devam etmek istiyor musunuz?" - -#: pisi/operations.py:160 -msgid "External dependencies not satisfied" -msgstr "Dış bağımlılıklar sağlanamadı" - -# pisi/api.py:168 :215 -#: pisi/operations.py:172 pisi/operations.py:339 -msgid "No packages to install." -msgstr "Kurulacak paket yok." - -#: pisi/operations.py:203 -msgid "Installation order: " -msgstr "Kurulum sırası: " - -#: pisi/operations.py:257 pisi/operations.py:279 -msgid "Conflicts remain" -msgstr "Çakışmalar var" - -#: pisi/operations.py:267 -msgid "Selected packages [%s] are in conflict with each other." -msgstr "Seçili paketler [%s] birbirleriyle çakışıyorlar." - -#: pisi/operations.py:273 -msgid "[%s conflicts with: %s]\n" -msgstr "[%s: %s ile çakışıyor]\n" - -#: pisi/operations.py:275 -msgid "" -"The following packages have conflicts:\n" -"%s" -msgstr "" -"Aşağıdaki paketlerde çakışmalar bulunuyor:\n" -"%s" - -#: pisi/operations.py:278 -msgid "Remove the following conflicting packages?" -msgstr "Bu çakışan paketler kaldırılsın mı?" - -#: pisi/operations.py:305 -msgid "Safety switch: Following packages in system.base will be installed: " -msgstr "Emniyet mandalı: taban sistem system.base'den bu paketler kurulacak:" - -#: pisi/operations.py:311 -msgid "Safety switch: Following packages in system.base will be upgraded: " -msgstr "" -"Emniyet mandalı: taban sistem system.base'den bu paketler yükseltilecek:" - -#: pisi/operations.py:317 pisi/operations.py:597 -msgid "Safety switch: the component system.base cannot be found" -msgstr "Emniyet mandalı: taban sistem bileşeni system.base bulunamadı" - -#: pisi/operations.py:334 -msgid "" -"The following package(s) are already installed and are not going to be " -"installed again:\n" -msgstr "" -"Aşağıdaki paket(ler) zaten sistemde kurulu ve yeniden kurulmayacak(lar):\n" - -#: pisi/operations.py:355 -msgid "" -"Following packages will be installed in the respective order to satisfy " -"dependencies:\n" -msgstr "" -"Bağımlılıkları sağlamak için bu paketler verilen sırada kurulacaktır:\n" - -#: pisi/operations.py:360 pisi/operations.py:491 -msgid "Total size of package(s): %.2f %s" -msgstr "Paket(ler)in toplam boyu: %.2f %s" - -#: pisi/operations.py:366 pisi/operations.py:497 pisi/operations.py:709 -msgid "There are extra packages due to dependencies. Do you want to continue?" -msgstr "Bağımlılıklar yüzünden ek paketler var. Devam etmek istiyor musunuz?" - -#: pisi/operations.py:432 -msgid "Warning: package *name* ends with '.pisi'" -msgstr "Uyarı: paket *adı* '.pisi' ile bitiyor." - -#: pisi/operations.py:435 -msgid "Package %s is not installed." -msgstr "Paket %s kurulmamış." - -#: pisi/operations.py:441 -msgid "Package %s is not available in repositories." -msgstr "Paket %s depolarda mevcut değil." - -#: pisi/operations.py:453 -msgid "Package %s is already at the latest release %s." -msgstr "Paket %s zaten en son sürüm %s'de" - -#: pisi/operations.py:459 -msgid "Package %s is already at the latest build %s." -msgstr "Paket %s zaten en son inşa %s'de." - -#: pisi/operations.py:486 -msgid "The following packages will be upgraded: " -msgstr "Bu paketler yükseltilecektir: " - -#: pisi/operations.py:552 -msgid "Dependency %s of %s cannot be satisfied" -msgstr "İnşa bağımlılığı %s, %s paketi için sağlanamadı" - -#: pisi/operations.py:553 -msgid "Upgrade is not possible." -msgstr "Yükseltme mümkün değil." - -#: pisi/operations.py:568 -msgid "Reverse dependency %s of %s cannot be satisfied" -msgstr "Ters bağımlılık %s, %s paketi için sağlanamadı" - -#: pisi/operations.py:593 -msgid "Safety switch: cannot remove the following packages in system.base: " -msgstr "" -"Emniyet mandalı: taban sistem system.base deki bu paketler kaldırılamıyor: " - -#: pisi/operations.py:604 -msgid "Package %s does not exist. Cannot remove." -msgstr "Olmayan paket %s kaldırılamıyor." - -#: pisi/operations.py:608 -msgid "No packages to remove." -msgstr "Kaldıracak paket yok." - -#: pisi/operations.py:617 -msgid "" -"The following minimal list of packages will be removed\n" -"in the respective order to satisfy dependencies:\n" -msgstr "" -"Bağımlılıkları sağlamak için bu paketler verilen sırada kaldırılacaktır:\n" - -#: pisi/operations.py:622 -msgid "Package removal declined" -msgstr "Paket kaldırmaya izin verilmedi." - -#: pisi/operations.py:634 -msgid "Package %s is not installed. Cannot remove." -msgstr "Paket %s kurulu değil. Kaldırılamıyor." - -#: pisi/operations.py:683 -msgid "No packages to emerge." -msgstr "Derlenip, kurulacak paket yok." - -#: pisi/operations.py:698 -msgid "" -"The following minimal list of packages will be installed\n" -"from repository in the respective order to satisfy dependencies:\n" -msgstr "Bağımlılıkları sağlamak için bu paketler verilen sırada kurulacak:\n" - -#: pisi/operations.py:701 -msgid "" -"The following minimal list of packages will be built and\n" -"installed in the respective order to satisfy dependencies:\n" -msgstr "" -"Bağımlılıkları sağlamak için aşağıdaki paketler verilen sırada derlenip, " -"kurulacak:\n" - -#: pisi/operations.py:743 -msgid "Cannot find source package: %s" -msgstr "Kaynak paket bulunamadı: %s" - -#: pisi/package.py:56 -msgid "" -"There was a problem while fetching '%s'.\n" -"The package may have been upgraded. Please try to upgrade the package." -msgstr "" -"'%s' indirilirken bir hata oluştu.\n" -"Paket yükseltilmiş olabilir. Lütfen paketi yükseltmeyi deneyin." - -#: pisi/package.py:60 pisi/sourcearchive.py:94 -msgid "%s [cached]" -msgstr "%s [önbellekte]" - -#: pisi/package.py:131 -msgid "MetaData format wrong" -msgstr "MetaData biçimi yanlış" - -#: pisi/packagedb.py:66 -msgid "Package %s not found" -msgstr "Paket %s bulunamadı" - -#: pisi/pxml/autoxml.py:77 -msgid "At least one '%s' tag should have local text" -msgstr "En azından bir tane '%s' etiketi yerel metne sahip olmalı" - -#: pisi/pxml/autoxml.py:84 -msgid "'%s' language of tag '%s' is empty" -msgstr "'%s' dili metni, etiket %s içerisinde boş" - -#: pisi/pxml/autoxml.py:112 -msgid "LocalText: unable to get either current or default locale" -msgstr "" -"LocalText: şu andaki ya da ön tanımlı yerelleştirme seçenekleri (locale) " -"bulunamıyor" - -#: pisi/pxml/autoxml.py:118 pisi/pxml/autoxml.py:133 -msgid "" -"Tag should have at least the current locale, or failing that an English or " -"Turkish version" -msgstr "" -"Etiket en azından şu andaki yerelleştirme seçenekleri (locale) için bir " -"girdiye, o olmazsa bir Türkçe ya da İngilizce versiyona sahip olmalı" - -#: pisi/pxml/autoxml.py:368 -msgid "autoxml.check: '%s' errors" -msgstr "autoxml.check: '%s' hatalar" - -#: pisi/pxml/autoxml.py:423 pisi/pxml/autoxml.py:433 -msgid "autoxml.parse: String '%s' has errors" -msgstr "autoxml.read: Dosya '%s' hatalara sahip" - -#: pisi/pxml/autoxml.py:443 pisi/pxml/autoxml.py:453 -msgid "autoxml.read: File '%s' has errors" -msgstr "autoxml.read: Dosya '%s' hatalara sahip" - -#: pisi/pxml/autoxml.py:461 -msgid "autoxml.write: object validation has failed" -msgstr "autoxml.write: nesne doğrulaması başarısızlığa uğradı" - -#: pisi/pxml/autoxml.py:469 -msgid "autoxml.write: File encoding '%s' has errors" -msgstr "autoxml.write: Dosya biçimlendirmesi '%s' hatalara sahip" - -#: pisi/pxml/autoxml.py:519 -msgid "gen_tag: unrecognized tag type %s in spec" -msgstr "gen_tag: tanınmayan im tipi %s" - -#: pisi/pxml/autoxml.py:567 pisi/pxml/autoxml.py:578 -msgid "Mandatory variable %s not available" -msgstr "Gerekli değişken %s bulunamadı" - -#: pisi/pxml/autoxml.py:648 -msgid "Type mismatch: read text cannot be decoded" -msgstr "Tip uyumsuzluğu: okunan metin çözülemedi" - -#: pisi/pxml/autoxml.py:652 pisi/pxml/autoxml.py:661 -msgid "Mandatory token %s not available" -msgstr "Gerekli im %s bulunamadı" - -#: pisi/pxml/autoxml.py:666 -msgid "Type mismatch. Expected %s, got %s" -msgstr "Tip uyumsuzluğu. %s beklerken, %s bulundu" - -# pisi/xmlfile.py:420 :521 -#: pisi/pxml/autoxml.py:696 pisi/pxml/autoxml.py:812 -msgid "Type mismatch: DOM cannot be decoded" -msgstr "Tip uyumsuzluğu: DOM okunamıyor" - -# pisi/xmlfile.py:392 :423 :439 :446 :524 :538 :545 -#: pisi/pxml/autoxml.py:699 pisi/pxml/autoxml.py:715 pisi/pxml/autoxml.py:725 -#: pisi/pxml/autoxml.py:815 pisi/pxml/autoxml.py:829 pisi/pxml/autoxml.py:839 -msgid "Mandatory argument not available" -msgstr "Gerekli argüman bulunamadı" - -# pisi/xmlfile.py:436 :535 -#: pisi/pxml/autoxml.py:712 pisi/pxml/autoxml.py:826 -msgid "Object cannot be encoded" -msgstr "Nesne kodlanamadı" - -#: pisi/pxml/autoxml.py:737 -msgid "List type must contain only one element" -msgstr "List tipi sadece bir eleman içermeli" - -# pisi/xmlfile.py:470 :485 -#: pisi/pxml/autoxml.py:750 pisi/pxml/autoxml.py:771 -msgid "Mandatory list \"%s\" under \"%s\" node is empty." -msgstr "Zorunlu \"%s\" listesi \"%s\" içinde yok." - -#: pisi/pxml/xmlext.py:79 -msgid "getNodeText: Expected text node, got something else!" -msgstr "getNodeText: metin beklenirken başka birşey alındı!" - -#: pisi/pxml/xmlfile.py:64 -msgid "String '%s' has invalid XML" -msgstr "'%s' dosyasının XML sözdizimi geçersiz" - -#: pisi/pxml/xmlfile.py:72 pisi/pxml/xmlfile.py:87 -msgid "File '%s' has invalid XML" -msgstr "'%s' dosyasının XML sözdizimi geçersiz" - -#: pisi/repodb.py:74 -msgid "No repository named %s exists" -msgstr "%s adında bir depo bulunamadı" - -#: pisi/repodb.py:83 -msgid "Repository %s already exists" -msgstr "Depo %s halihazırda var" - -#: pisi/repodb.py:90 -msgid "Cannot add repository at position %s" -msgstr "%s konumundaki depo eklenemiyor" - -#: pisi/scenarioapi/package.py:67 -msgid "No pisi package: %s* found." -msgstr "%s pisi paketi bulunamadı." - -#: pisi/scenarioapi/repoops.py:28 -msgid "Repo already has package named %s." -msgstr "Depo'da %s isimli paket zaten mevcut." - -#: pisi/scenarioapi/repoops.py:52 pisi/scenarioapi/repoops.py:59 -msgid "Repo does not have package named %s." -msgstr "Depo'da %s isminde bir paket yok." - -#: pisi/sourcearchive.py:63 -msgid "Trying fallback address: %s" -msgstr "Geri düşüm adresi %s deneniyor." - -#: pisi/sourcearchive.py:74 -msgid "%s mirrors are not defined." -msgstr "%s yansıları tanımlı değil." - -#: pisi/sourcearchive.py:79 -msgid "Fetching source from mirror: %s" -msgstr "Kaynak, %s yansısından indiriliyor" - -#: pisi/sourcearchive.py:85 -msgid "Could not fetch source from %s mirrors." -msgstr "Kaynak, %s yansılarından indirilemedi." - -#: pisi/sourcearchive.py:103 -msgid "unpack: check_file_hash failed" -msgstr "unpack: check_file_hash başarısızlığa uğradı" - -#: pisi/sourcedb.py:59 pisi/sourcedb.py:65 -msgid "Source package %s not found" -msgstr "Kaynak paketi %s bulunamadı." - -#: pisi/specfile.py:141 -msgid "URI: %s, type: %s, sha1sum: %s" -msgstr "URI: %s, tip: %s, sha1sum: %s" - -#: pisi/specfile.py:208 -msgid "Name: %s, version: %s, release: %s, build %s\n" -msgstr "Ad: %s, versiyon %s, sürüm %s, inşa %s\n" - -#: pisi/specfile.py:210 -msgid "Summary: %s\n" -msgstr "Özet: %s\n" - -#: pisi/specfile.py:211 -msgid "Description: %s\n" -msgstr "Açıklama: %s\n" - -#: pisi/specfile.py:212 -msgid "Component: %s\n" -msgstr "Bileşen: %s\n" - -#: pisi/specfile.py:213 -msgid "Provides: " -msgstr "Sağladıkları: " - -#: pisi/specfile.py:217 -msgid "Dependencies: " -msgstr "Bağımlılıklar:" - -#: pisi/uri.py:80 -msgid "setAuthInfo needs a tuple (user, pass)" -msgstr "setAuthInfo bir (kullanıcı, parola) ikilisi ister" - -#: pisi/util.py:122 pisi/util.py:143 -msgid "Running " -msgstr "Çalışıyor: " - -#: pisi/util.py:126 pisi/util.py:161 -msgid "return value for \"%s\" is %s" -msgstr "\"%s\" için dönüş değeri %s" - -#: pisi/util.py:364 -msgid "Including external link '%s'" -msgstr "'%s' harici bağı ekleniyor" - -#: pisi/util.py:366 -msgid "Including directory '%s'" -msgstr "'%s' dizini içeriliyor" - -#: pisi/util.py:440 -msgid "I/O Error: Cannot calculate SHA1 hash of %s" -msgstr "Girdi/Çıktı hatası: %s dosyasının SHA1 kontrol toplamı hesaplanamıyor" - -#: pisi/util.py:451 -msgid "Cannot calculate SHA1 hash of given data" -msgstr "Verinin SHA1 kontrol toplamı hesaplanamıyor" - -#: pisi/util.py:488 -msgid "ERROR: patch (%s) failed" -msgstr "HATA: Yama (%s) başarısız" - -#: pisi/util.py:490 -msgid "ERROR: patch (%s) failed: %s" -msgstr "HATA: Yama (%s) başarısız: %s" - -#: pisi/util.py:536 -msgid "strip command failed for file '%s'!" -msgstr "strip komutu '%s' dosyası için çalışmadı!" - -#: pisi/util.py:543 -msgid "objcopy (keep-debug) command failed for file '%s'!" -msgstr "objcopy (keep-debug) komutu '%s' dosyası için çalışmadı!" - -#: pisi/util.py:549 -msgid "objcopy (add-debuglink) command failed for file '%s'!" -msgstr "objcopy (add-debuglink) komutu '%s' dosyası için çalışmadı!" - -#: pisi/util.py:610 -msgid "Updating environment..." -msgstr "Çevre güncelleniyor..." - -#: scripts/repostats.py:361 -msgid "" -"Duplicate binary packages:\n" -"%s\n" -"%s\n" -msgstr "" -"Birden çok yerde aynı ikili paket var:\n" -"%s\n" -"%s\n" - -#: scripts/repostats.py:366 -msgid "Unknown file type '%s' in package '%s'" -msgstr "Bilinmeyen dosya tipi '%s', '%s' paketi içinde bulundu. " - -#: scripts/repostats.py:422 -msgid "" -"Duplicate source packages:\n" -"%s\n" -"%s\n" -msgstr "" -"Birden çok yerde aynı kaynak paketi var:\n" -"%s\n" -"%s\n" - -#: scripts/repostats.py:442 -msgid "Source package '%s' has wrong date format '%s'" -msgstr "Kaynak paketi '%s' yanlış tarih biçimlendirmesine sahip: '%s'" - -#: scripts/repostats.py:481 -msgid "" -"Developer '%s <%s>' has another mail address '%s' in source package '%s'" -msgstr "" - -#: scripts/repostats.py:564 -msgid "" -"Cannot parse '%s':\n" -"%s\n" -msgstr "" -"'%s' ayrıştırılamıyor:\n" -"'%s'\n" - -#: scripts/repostats.py:642 -msgid "Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n" -msgstr "" -"Kullanım: repostats.py [SEÇENEKLER] source-repo-path [ikili-depo-adresi]\n" - -#: scripts/repostats.py:643 -msgid "Dont generate the web site.\n" -msgstr "Web sayfasını oluşturma.\n" - -#: scripts/repostats.py:664 -msgid "Scanning source repository...\n" -msgstr "Kaynak deposu taranıyor...\n" - -#: scripts/repostats.py:668 -msgid "Scanning binary packages...\n" -msgstr "İkili dosyalar taranıyor...\n" - -#: scripts/repostats.py:673 -msgid "Encountered %d errors! Fix them immediately!\n" -msgstr "%d hata ile karşılaşıldı. Lütfen bunları en kısa zamanda düzeltin.\n" - -#: scripts/repostats.py:681 -msgid "These dependencies are not available in repository:\n" -msgstr "Bağımlılığa neden olan bu paketler depoda bulunmuyor:\n" diff --git a/tags/pisi-1.1_rc10/scenarios/bug3237scen.py b/tags/pisi-1.1_rc10/scenarios/bug3237scen.py deleted file mode 100644 index 9cc77fa3..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3237scen.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3237scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3237 -# -# Problem : If the revdep of the "upgraded only packages"' dependency is not satisfied -# it is also added to the upgrade list and creates "confusion" -# -# # pisi lu -# amarok - KDE için müzik çalıcısı -# ksynaptics - Synaptics touchpad yapılandırma aracı -# libwmf - Microsoft Word gibi uygulamaların kullan..... -# tunepimp - MusicBrainz uyumluluğu olan uygulamalar....... -# -# pisi up tunepimp libwmf ksynaptics -# Depolar güncelleniyor -# * pardus-1.1 deposu güncelleniyor -# pardus-1.1 deposu için güncelleme yok. -# Aşağıdaki paketlerde çakışmalar bulunuyor: [amarok: lastfm-player ile çakışıyor] -# Bu çakışan paketler kaldırılsın mı? (evet/hayır)hayır -# -# Problem Description: -# -# There appears to be some upgrades needed. We only wanted to upgrade some of the packages. -# But the package we did not include in the list of upgrades also is tried to be upgraded. -# The purpose to not include it in the upgrade list, was, it was conflicting with another -# package. -# -# Expected: -# -# pisi either should not upgrade packages out of the given upgrade list or should show -# all the "to be upgraded" list before the conflict warning. - -from pisi.scenarioapi.scenario import * - -AMAROK = "amarok" -KSYNAPTICS = "ksynaptics" -LIBWMF = "libwmf" -TUNEPIMP = "tunepimp" -LASTFM = "lastfm-player" - -let_repo_had(AMAROK, with_conflicts(LASTFM)) -let_repo_had(LASTFM) -let_repo_had(TUNEPIMP, with_version("0.3.9")) -let_repo_had(KSYNAPTICS) -let_repo_had(LIBWMF) - -let_pisi_had(AMAROK, LASTFM, TUNEPIMP, KSYNAPTICS, LIBWMF) - -def run(): - repo_version_bumped(TUNEPIMP, with_version("0.4.1")) - repo_version_bumped(AMAROK, with_added_dependency(TUNEPIMP, versionFrom="0.4.1")) - repo_version_bumped(KSYNAPTICS) - repo_version_bumped(LIBWMF) - repo_updated_index() - pisi_upgraded(LIBWMF, TUNEPIMP, KSYNAPTICS) diff --git a/tags/pisi-1.1_rc10/scenarios/bug3390scen.py b/tags/pisi-1.1_rc10/scenarios/bug3390scen.py deleted file mode 100644 index 717bf3f2..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3390scen.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3390scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3390 -# -# Problem : Package reverse dependencies are not updated in pisi database -# -# caglar@zangetsu ~ $ pisi info valgrind -# Yüklü paket: -# Ad: valgrind, versiyon 3.2.0, sürüm 5, inşa 4 -# Özet: Valgrind, x86-GNU/Linux ve ppc-GNU/Linux için geliştirilmiş, bellek -# hatalarını ayıklayıcı, açık kaynaklı bir yazılımdır. -# Açıklama: Valgrind, x86-GNU/Linux ve ppc-GNU/Linux için geliştirilmiş, bellek -# hatalarını ayıklayıcı, açık kaynaklı bir yazılımdır. -# Bileşen: programming.tools -# Sağladıkları: -# Bağımlılıklar:xorg openmpi -# Dağıtım: Pardus, Dağıtım Sürümü: 1.1 -# Mimari: Any, Yerleşik Boyut: 19128120 -# Ters bağımlılıklar: kdesdk -# -# Problem Description: -# -# Valgrind package had a dependency of openmpi package. It is version bumped with removed -# dependeny of openmpi at the repository. Also openmpi is version bumped. After upgrading -# pisi repository and trying to remove openmpi, it is seen that openmpi still has a reverse -# dependency of valgrind. -# -# Expected: -# -# Pisi should have updated the reverse dependency informations correctly and should not show -# a reverse dependency of valgrind while removing openmpi, after a succesfull repository upgrade. - -from pisi.scenarioapi.scenario import * - -VALGRIND = "valgrind" -OPENMPI = "openmpi" - -let_repo_had(VALGRIND, with_dependencies(OPENMPI)) -let_repo_had(OPENMPI) -let_pisi_had(VALGRIND, OPENMPI) - -def run(): - repo_version_bumped(VALGRIND, with_removed_dependencies(OPENMPI)) - repo_version_bumped(OPENMPI) - repo_updated_index() - pisi_upgraded() - pisi_removed(OPENMPI) diff --git a/tags/pisi-1.1_rc10/scenarios/bug3465scen.py b/tags/pisi-1.1_rc10/scenarios/bug3465scen.py deleted file mode 100644 index b20e8e93..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3465scen.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3465scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3465 -# -# Problem : Pisi does not warn the user about updated packages in the repository. -# -# sudo pisi it wormux --reinstall -# Bağımlılıkları sağlamak için bu paketler verilen sırada kurulacaktır: -# wormux -# Paketlerin toplam boyu: 17.62 MB -# Paket wormux, pardus-1.1 deposunda bulundu -# Program sonlandırıldı. -# http://paketler.pardus.org.tr/pardus-1.1/wormux-0.7-2-1.pisi indirilemiyor; HTTP -# Error 404: Not Found -# -# Problem Description: -# -# The user had not updated pisi's repository database for some time. Then, when pisi is asked -# to reinstall an installed package, it failed to fetch the requested version of the package. -# Because the package had been upgraded at the repository and the old package has been removed. -# -# Expected: -# -# Pisi should warn the user to update repository. - -from pisi.scenarioapi.scenario import * - -WORMUX = "wormux" - -let_repo_had(WORMUX) -let_pisi_had(WORMUX) - -def run(): - repo_version_bumped(WORMUX) - repo_updated_index() - pisi_reinstalled(WORMUX) diff --git a/tags/pisi-1.1_rc10/scenarios/bug3481scen.py b/tags/pisi-1.1_rc10/scenarios/bug3481scen.py deleted file mode 100644 index 5128a890..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3481scen.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3481scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3481 -# -# Problem : PISI asks if conflicting system.base application to be removed but does not -# allow it without -S -# -# Aşağıdaki paketlerde çakışmalar bulunuyor: [coreutils: hashalot ile çakışıyor] -# Bu çakışan paketler kaldırılsın mı? (evet/hayır)evet -# Emniyet mandalı: taban sistem system.base deki bu paketler kaldırılamıyor: hashalot -# Kaldıracak paket yok. -# Program sonlandırıldı. -# pisi.operations.Error: Çakışmalar var -# Genel yardım için lütfen 'pisi help' komutunu kullanınız. -# -# Problem Description: -# -# PISI upgrade command sees some system.base packages conflict with each other. It asks if you -# want to remove the conflicting package but does not allow it to be removed without -# --bypass-safety parameter. -# -# Expected: -# -# Pisi should remove the package if answered yes. -# - -from pisi.scenarioapi.scenario import * - -HASHALOT="hashalot" -COREUTILS="coreutils" -GLIBC="glibc" -UTIL_LINUX="util-linux" - -let_repo_had(HASHALOT, with_partof("system.base")) -let_repo_had(COREUTILS, with_partof("system.base")) -let_repo_had(GLIBC, with_partof("system.base")) -let_repo_had(UTIL_LINUX, with_partof("system.base")) - -let_pisi_had(COREUTILS, HASHALOT, GLIBC, UTIL_LINUX) - -def run(): - repo_version_bumped(GLIBC) - repo_version_bumped(UTIL_LINUX) - repo_version_bumped(COREUTILS, with_added_conflicts(HASHALOT)) - repo_updated_index() - pisi_upgraded() diff --git a/tags/pisi-1.1_rc10/scenarios/bug3558scen.py b/tags/pisi-1.1_rc10/scenarios/bug3558scen.py deleted file mode 100644 index e2eb03cd..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3558scen.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3558scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3558 -# -# Problem : reverse dependency information disappears -# -# faik@iago scenarios $ pisi info kdelibs -# Yüklü paket: -# Ad: kdelibs, versiyon 3.5.4, sürüm 35, inşa 17 -# Özet: Tüm KDE programlarının ihtiyaç duyduğu KDE kütüphaneleri -# Açıklama: Tüm KDE programlarının ihtiyaç duyduğu KDE kütüphaneleri -# Bileşen: desktop.kde.base -# Sağladıkları: -# Bağımlılıklar:qt arts freetype fontconfig libxslt libxml2 libpcre libart_lgpl libidn utempter alsa-lib cups tiff aspell -# jasper mDNSResponder ghostscript acl zpspell openexr mit-kerberos tulliana2 -# Dağıtım: Pardus, Dağıtım Sürümü: 1.1 -# Mimari: Any, Yerleşik Boyut: 222414685 -# Ters bağımlılıklar: kdebase gwenview -# -# Problem Description: -# -# Package's reverse dependencies disappears unexpectedly. If a package which has reverse dependencies has been upgraded. -# The revdep list is removed from revdep db. So upgraded package will have an empty revdep list. -# -# Expected: -# -# They should not. :) -# - -from pisi.scenarioapi.scenario import * - -FLIGHTGEAR = "flightgear" -FLIGHTGEAR_DATA = "flightgear-data" - -let_repo_had(FLIGHTGEAR, with_dependencies(FLIGHTGEAR_DATA)) -let_repo_had(FLIGHTGEAR_DATA) - -let_pisi_had(FLIGHTGEAR, FLIGHTGEAR_DATA) - -def run(): - pisi_info(FLIGHTGEAR_DATA) - repo_version_bumped(FLIGHTGEAR_DATA) - repo_updated_index() - pisi_upgraded() - pisi_info(FLIGHTGEAR_DATA) diff --git a/tags/pisi-1.1_rc10/scenarios/bug3732scen.py b/tags/pisi-1.1_rc10/scenarios/bug3732scen.py deleted file mode 100644 index 8277d8c5..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3732scen.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3732scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3732 -# -# Problem : If conflicting packages found while upgrading, by removing those prior to -# fetching and installing the desktop may become unusable while upgrading -# process -# -# Problem Description: -# -# This problem appeared in our xorg package split process. The divided packages were -# all marked as conflicting packages to xorg package. But because the xorg package was -# a conflicting package, it is removed before any fetch operation and installing began. -# So some desktop processes could not be started or used properly until the upgrade -# process ends. -# -# Expected: -# -# PiSi should not remove the conflicting packages unless fetching of all the new upgrade -# packages has finished. - -from pisi.scenarioapi.scenario import * - -XORG = "xorg" -QT = "qt" -XORG_SERVER = "xorg-server" -XORG_VIDEO = "xorg-video" -XORG_FONT = "xorg-font" - -let_repo_had(XORG) -let_repo_had(QT, with_dependencies(XORG)) -let_pisi_had(XORG, QT) - -def run(): - repo_added_package(XORG_VIDEO, with_conflicts(XORG)) - repo_added_package(XORG_FONT, with_conflicts(XORG)) - repo_added_package(XORG_SERVER, with_conflicts(XORG), with_dependencies(XORG_VIDEO, XORG_FONT)) - repo_version_bumped(QT, with_removed_dependencies(XORG), with_added_dependencies(XORG_SERVER)) - repo_updated_index() - pisi_upgraded() diff --git a/tags/pisi-1.1_rc10/scenarios/bug3865scen.py b/tags/pisi-1.1_rc10/scenarios/bug3865scen.py deleted file mode 100644 index 7a67dbfc..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug3865scen.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug3865scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=3865 -# -# Problem : A need arised between the packages libmp4v2 and faad2 that libmp4v2 has to -# define that it only conflicts with the faad2 until release 3. -# -# Problem Description: -# -# PiSi is incapable to define conflict versioning info. libmp4v2 only conflicts with faad2 -# package's release no 3. But because PiSi does not understand that, two packages can not -# be installed together. -# -# Expected: -# -# Versioning info can be defined as in dependency informations. - - -from pisi.scenarioapi.scenario import * - -LIBMP4V2 = "libmp4v2" -FAAD2 = "faad2" - -let_repo_had(LIBMP4V2) -let_repo_had(FAAD2, with_version("0.2.1")) - -let_pisi_had(LIBMP4V2, FAAD2) - -def run(): - repo_version_bumped(LIBMP4V2, with_added_conflict(FAAD2, versionTo="0.2.1")) - repo_version_bumped(FAAD2, with_version("0.2.5")) - repo_updated_index() - pisi_upgraded() diff --git a/tags/pisi-1.1_rc10/scenarios/bug4211scen.py b/tags/pisi-1.1_rc10/scenarios/bug4211scen.py deleted file mode 100644 index f36708a9..00000000 --- a/tags/pisi-1.1_rc10/scenarios/bug4211scen.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Scenario : bug4211scen.py -# -# Source : http://bugs.pardus.org.tr/show_bug.cgi?id=4211 -# -# Problem : PISI does not upgrade or install system.base packages before any other package -# -# Bağımlılıkları sağlamak için bu paketler verilen sırada kurulacaktır: -# util-macros xorg-proto xtrans libXdmcp libXau libX11 libXext libXp libICE libSM -# libXt libXprintUtil libXxf86vm ncurses less iputils gettext kbd sysvinit -# findutils popt gdbm 915resolution db3 mingetty splash-theme freetype fontconfig -# bzip2 expat zlib openssl python-fchksum db1 readline db4 python comar-api glib2 -# pwdb cracklib pam shadow libperl perl attr acl coreutils debianutils sysklogd -# comar wireless-tools net-tools sed module-init-tools gawk which hdparm libpcre -# grep tcp-wrappers e2fsprogs util-linux bash baselayout flex unzip libidn cpio -# liblbxutil libdrm dhcpcd libfontenc libXfont libXfontcache libXxf86dga -# libXprintAppUtil libXfixes libXcomposite libXres libXrender libXv libXvMC libdmx -# libXmu libFS libXcursor libXtst libXpm libXaw libAppleWM libxkbfile libxkbui -# libWindowsWM libXi libXevie libXinerama libXdamage libXrandr libXxf86misc -# libXScrnSaver xbitmaps libXft libXTrap liboldX xorg-app xorg-data xorg-util -# xorg-input font-util xorg-font zorg jimmac-xcursor xorg-video xorg-server psmisc -# ddcxinfos texinfo groff groff-utf8 man man-pages coolplug mkinitramfs parted -# grub udev libgcc klibc lzma nss-mdns mudur gzip ncompress tar piksemel file -# python-bsddb3 pisi nano glibc lib-compat miscfiles libpng jpeg libcap -# openldap-client bc dmidecode fbgrab splashutils-misc splashutils pyparted -# openssh sysfsutils pcmciautils zip libusb linux-headers memtest86 procps curl -# vixie-cron slang usbutils pciutils -# Paket(ler)in toplam boyu: 65.91 MB -# Bağımlılıklar yüzünden ek paketler var. Devam etmek istiyor musunuz? (evet/hayır)e -# Paket util-macros, buildfarm deposunda bulundu -# util-macros-1.1.2-2-3.pisi (5.0 KB)100% 0.00 B/s [??:??:??] [bitti] -# util-macros paketi, versiyon 1.1.2, sürüm 2, inşa 3 kuruluyor -# util-macros paketinin dosyaları arşivden çıkartılıyor -# util-macros paketi yapılandırılıyor -# util-macros paketi yapılandırıldı -# util-macros paketi kuruldu -# Paket xorg-proto, buildfarm deposunda bulundu -# xorg-proto-7.2_rc1-2-3.pisi (190.0 KB)100% 77.64 KB/s [00:00:00] [bitti] -# Klavye kesmesi: Çıkıyor... -# -# Problem Description: -# -# In an upgrade or installation PiSi does not upgrade or install system.base packages before any -# other package. -# -# Expected: -# -# PiSi should update or install system.base packages before any other package on the system. -# - -from pisi.scenarioapi.scenario import * - -OPENOFFICE="openoffice" -SUN_JRE="sun-jre" -UTIL_MACROS="util-macros" -XORG_PROTO="xorg-proto" -COMAR="comar" -MUDUR="mudur" - -let_repo_had(COMAR, with_partof("system.base")) -let_repo_had(MUDUR, with_partof("system.base")) -let_repo_had(UTIL_MACROS) -let_repo_had(XORG_PROTO) -let_repo_had(OPENOFFICE, with_dependencies(SUN_JRE)) -let_repo_had(SUN_JRE) - -let_pisi_had(UTIL_MACROS, XORG_PROTO, COMAR, MUDUR, OPENOFFICE, SUN_JRE) - -def run(): - repo_version_bumped(SUN_JRE) - repo_version_bumped(OPENOFFICE) - repo_version_bumped(MUDUR) - repo_version_bumped(COMAR) - repo_version_bumped(XORG_PROTO) - repo_version_bumped(UTIL_MACROS) - - repo_updated_index() - pisi_upgraded(OPENOFFICE, SUN_JRE) - diff --git a/tags/pisi-1.1_rc10/scenarios/run.py b/tags/pisi-1.1_rc10/scenarios/run.py deleted file mode 100755 index cc624856..00000000 --- a/tags/pisi-1.1_rc10/scenarios/run.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/python -#-*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# -# Authors: Faik Uygur - -import os -import shutil -import glob -import sys - -from pisi.scenarioapi.constants import * - -def clean_out(): - for x in glob.glob(consts.repo_path + consts.glob_pisis): - os.unlink(x) - - if os.path.exists(consts.pisi_db): - shutil.rmtree(consts.pisi_db) - -def run_scen(scenario): - scenario() - -def run_all(): - print '** Running all scenarios' - for root, dirs, files in os.walk("."): - scensources = filter(lambda x:x.endswith('scen.py'), files) - for scensource in scensources: - clean_out() - running = "\n* Running scenario in %s\n" % scensource - print running - print len(running) * "=" + "\n" - module = __import__(scensource[:len(scensource)-3]) - run_scen(module.run) - -if __name__ == "__main__": - os.chdir(consts.scenarios_path) - - args = sys.argv - if len(args) > 1: - scens = sys.argv[1:] - for scen in scens: - clean_out() - scen += 'scen.py' - print "\n* Running scenario in %s\n" % scen - module = __import__(scen[:len(scen)-3]) - run_scen(module.run) - else: - run_all() diff --git a/tags/pisi-1.1_rc10/scripts/buildno b/tags/pisi-1.1_rc10/scripts/buildno deleted file mode 100755 index e33b419d..00000000 --- a/tags/pisi-1.1_rc10/scripts/buildno +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -b=/var/lib/pisi/package - -for d in `ls $b`;do - if ! grep "" $b/$d/metadata.xml &>/dev/null ; then - echo "$d" - fi -done diff --git a/tags/pisi-1.1_rc10/scripts/check-newconfigs.py b/tags/pisi-1.1_rc10/scripts/check-newconfigs.py deleted file mode 100755 index c896e8f7..00000000 --- a/tags/pisi-1.1_rc10/scripts/check-newconfigs.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import os -import sys -import exceptions - -import pisi - -def handle_exception(exception, value, tb): - if exception == exceptions.KeyboardInterrupt: - pisi.api.finalize() - print("\n") - sys.exit() - -def ask_action(msg, actions, default): - while True: - s = raw_input(msg) - if len(s) == 0: - return default - else: - if s not in actions: - continue - - return s - -def get_installed_packages(): - return pisi.context.installdb.list_installed() - -def check_changed_config_files(package): - all_files = pisi.context.installdb.files(package) - config_files = filter(lambda x: x.type == 'config', all_files.list) - config_paths = map(lambda x: "/" + str(x.path), config_files) - - newconfig = [] - for path in config_paths: - if os.path.exists(path) and os.path.exists(path + ".newconfig"): - newconfig.append(path) - - return newconfig - -def show_changes(package, changed): - prompt = "%s has new config files. Would you like to see them [Y/n] " % package - if ask_action(prompt, ["y","n"], "y") == "n": - return - - for file in changed: - answer = "?" - while answer == "?" or answer not in ["n", "y"]: - prompt = " %s has changed. Would you like to overwrite new config file [N/y/?] " % file - answer = ask_action(prompt, ["y", "n", "?"], "n") - - if answer == "y": - os.rename(file+".newconfig", file) - if answer == "n": - break - if answer == "?": - os.system("diff -u %s %s | less" % (file, file + ".newconfig")) - -def check_package(package): - changed = check_changed_config_files(package) - if changed: - show_changes(package, changed) - -def check_changes(): - packages = get_installed_packages() - for pkg in packages: - check_package(pkg) - -if __name__ == "__main__": - sys.excepthook = handle_exception - pisi.api.init(write=False) - - if len(sys.argv) == 1: - print "Checking all packages" - check_changes() - if len(sys.argv) == 2: - check_package(sys.argv[1]) - if len(sys.argv) > 2: - for pkg in sys.argv[1:]: - check_package(pkg) - - pisi.api.finalize() diff --git a/tags/pisi-1.1_rc10/scripts/cleanArchives.py b/tags/pisi-1.1_rc10/scripts/cleanArchives.py deleted file mode 100755 index 62261b5d..00000000 --- a/tags/pisi-1.1_rc10/scripts/cleanArchives.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2005, 2006 TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import os -import sys - -import pisi.uri -import pisi.specfile - -def scanPSPEC(folder): - packages = [] - for root, dirs, files in os.walk(folder): - if "pspec.xml" in files: - packages.append(root) - # dont walk into the versioned stuff - if ".svn" in dirs: - dirs.remove(".svn") - return packages - -def cleanArchives(file): - try: - os.remove(file) - except OSError: - print("Permission denied...") - -if __name__ == "__main__": - try: - packages = scanPSPEC(sys.argv[1]) - except: - print "Usage: cleanArchives.py path2repo" - sys.exit(1) - - if "--dry-run" in sys.argv: - clean = False - elif "--clean" in sys.argv: - clean = True - else: - sys.exit(0) - - files = [] - for package in packages: - spec = pisi.specfile.SpecFile() - spec.read(os.path.join(package, "pspec.xml")) - - URI = pisi.uri.URI(spec.source.archive.uri) - files.append(URI.filename()) - - archiveFiles = os.listdir("/var/cache/pisi/archives/") - unneededFiles = filter(lambda x:x not in files, archiveFiles) - - for i in unneededFiles: - if not clean: - print("/var/cache/pisi/archives/%s" % i) - else: - cleanArchives("/var/cache/pisi/archives/%s" % i) diff --git a/tags/pisi-1.1_rc10/scripts/cleanCache.py b/tags/pisi-1.1_rc10/scripts/cleanCache.py deleted file mode 100755 index a03f6ef0..00000000 --- a/tags/pisi-1.1_rc10/scripts/cleanCache.py +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, 2006 TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import os -import sys -import glob -import string -import shutil -import pisi.util as util -from pisi.version import Version - -def findUnneededFiles(listdir): - dict = {} - for f in listdir: - try: - name, version = util.parse_package_name(f) - if dict.has_key(name): - if Version(dict[name]) < Version(version): - dict[name] = version - else: - if version: - dict[name] = version - - except: - pass - - for f in dict: - listdir.remove("%s-%s" % (f, dict[f])) - - return listdir - -def doit(root, listdir, clean, suffix = ""): - for f in listdir: - target = os.path.join(root, "%s%s" % (f, suffix)) - if os.path.exists(target): - print "%s%s" % (f, suffix) - if clean == True: - try: - if os.path.isdir(target): - shutil.rmtree(target) - else: - os.remove(target) - except OSError,e : - usage("Permission denied: %s" % e) - - -def cleanPisis(clean, root = '/var/cache/pisi/packages'): - # pisi packages - list = map(lambda x: os.path.basename(x).split(".pisi")[0], glob.glob("%s/*.pisi" % root)) - list.sort() - l = findUnneededFiles(list) - doit(root, l, clean, ".pisi") - -def cleanBuilds(clean, root = '/var/tmp/pisi'): - # Build remnant - list = [] - for f in os.listdir(root): - if os.path.isdir(os.path.join(root, f)): - list.append(f) - - l = findUnneededFiles(list) - doit(root, l, clean) - -def usage(msg): - print """ -Error: %s - -Usage: - cleanCache --dry-run (Shows unneeded files) - cleanCache --clean (Removes unneeded files) - """ % msg - - sys.exit(1) - -if __name__ == "__main__": - try: - sys.argv[1] - except IndexError: - usage("Unsufficient arguments...") - - if "--dry-run" in sys.argv: - clean = False - elif "--clean" in sys.argv: - clean = True - else: - usage("No command given...") - sys.exit(0) - - if "builds" in sys.argv: - cleanBuilds(clean) - - else: - cleanPisis(clean) - diff --git a/tags/pisi-1.1_rc10/scripts/convert_history.py b/tags/pisi-1.1_rc10/scripts/convert_history.py deleted file mode 100755 index d4a64380..00000000 --- a/tags/pisi-1.1_rc10/scripts/convert_history.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/python - -import sys -import os -import codecs -import xml.dom.minidom as mdom - -def find_pspecs(folder): - paks = [] - for root, dirs, files in os.walk(folder): - if "pspec.xml" in files: - paks.append(root) - # dont walk into the versioned stuff - if ".svn" in dirs: - dirs.remove(".svn") - return paks - -def addText(doc, parent, text): - cdata =doc.createTextNode(text) - parent.appendChild(cdata) - -def getTags(parent, childName): - return [x for x in parent.childNodes if x.nodeType == x.ELEMENT_NODE if x.tagName == childName] - -def getNodeText(node, tag, default=None): - try: - c = getTags(node, tag)[0].firstChild.data - except: - c = default - return c - -def newNode(doc, tag, text): - node = doc.createElement(tag) - cdata = doc.createTextNode(text) - node.appendChild(cdata) - return node - -def fixIndent(doc, node): - for x in node.childNodes: - if x.nodeType == x.ELEMENT_NODE: - if x.tagName == "Update": - fixIndent(doc, x) - else: - x.data = "\n" + x.data[5:] - -def fixTags(doc, hist): - for update in hist.childNodes: - if update.nodeType == update.ELEMENT_NODE: - rno = getNodeText(update, "Release") - update.setAttribute("release", rno) - if rno == "1": - comment = newNode(doc, "Comment", "First release.") - paker = getTags(getTags(doc.documentElement, "Source")[0], "Packager")[0] - name = newNode(doc, "Name", getNodeText(paker, "Name")) - email = newNode(doc, "Email", getNodeText(paker, "Email")) - else: - comment = newNode(doc, "Comment", "FIXHISTORY") - name = newNode(doc, "Name", "FIXHISTORY") - email = newNode(doc, "Email", "FIXHISTORY") - update.replaceChild(comment, getTags(update, "Release")[0]) - addText(doc, update, " ") - update.appendChild(name) - addText(doc, update, "\n ") - update.appendChild(email) - addText(doc, update, "\n ") - -def fixPspec(path): - doc = mdom.parse(path) - pisi = doc.documentElement - source = getTags(pisi, "Source")[0] - history = getTags(source, "History")[0] - item = source.removeChild(history) - addText(doc, pisi, "\n ") - fixIndent(doc, item) - fixTags(doc, item) - pisi.appendChild(item) - addText(doc, pisi, "\n") - f = codecs.open(path,'w', "utf-8") - f.write(doc.toxml()) - f.close() - -pakages = find_pspecs(sys.argv[1]) -for pak in pakages: - fixPspec(os.path.join(pak, "pspec.xml")) diff --git a/tags/pisi-1.1_rc10/scripts/fix_old_metadata_files.py b/tags/pisi-1.1_rc10/scripts/fix_old_metadata_files.py deleted file mode 100755 index ed1305d1..00000000 --- a/tags/pisi-1.1_rc10/scripts/fix_old_metadata_files.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -import xml.dom.minidom as mdom -import codecs -import os - -folder = "/var/lib/pisi" - -def saveMetadata(data, file): - if data: - f = codecs.open(file, 'w', "utf-8") - f.write(data) - f.close() - return True - -def getNodeText(node, tag, default=None): - try : c = getTags(node, tag)[0].firstChild.data - except: c = default - return c - -def getTags(parent, childName): - return [x for x in parent.childNodes if x.nodeType == x.ELEMENT_NODE if x.tagName == childName] - -def addText(dom, parent, text): - cdata = dom.createTextNode(text) - parent.appendChild(cdata) - -def fixMetadata(metadata): - dom = mdom.parse(metadata) - pisi = dom.documentElement - - package = getTags(pisi, "Package")[0] - history = getTags(package, "History")[0] - item = package.removeChild(history) - - for update in history.childNodes: - if update.nodeType == update.ELEMENT_NODE: - try: - rno = getNodeText(update, "Release")[6:-5] - except TypeError: - return None - update.setAttribute("release", rno) - release = getTags(update, "Release")[0] - update.removeChild(release) - - addText(dom, package, " ") - package.appendChild(item) - addText(dom, package, "\n ") - return dom.toxml() - -def findMetadata(): - for root, dirs, files in os.walk(folder): - if "metadata.xml" in files: - yield (root + '/metadata.xml') - -for file in findMetadata(): - if saveMetadata(fixMetadata(file), file): - print "Güncellendi : ", file - else: - print "Hiç bir şey yapılmadı: ", file diff --git a/tags/pisi-1.1_rc10/scripts/lspisi b/tags/pisi-1.1_rc10/scripts/lspisi deleted file mode 100755 index ecc621f5..00000000 --- a/tags/pisi-1.1_rc10/scripts/lspisi +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import os -import sys -import pisi - -def show_info(filename): - pisi.api.init(database=False, comar=False) - metadata, files = pisi.api.info_file(filename) - pisi.api.finalize() - - paths = [fileinfo.path for fileinfo in files.list] - paths.sort() - return paths - -def uniq(alist): - set = {} - return [set.setdefault(e, e) for e in alist if e not in set] - -def usage(errmsg): - print """ - Error: %s - - Usage: - lspisi PiSi_package.PiSi (lists the content of package) - lspisi dirs PiSi_package.PiSi (lists directories in the package for the package developer) - """ % (errmsg) - - sys.exit(1) - - -def main(): - if len(sys.argv) < 2 or ("dirs" in sys.argv and len(sys.argv) < 3): - usage("PiSi package required...") - - if sys.argv[1] == "dirs": - dirlist = [] - for file in show_info(sys.argv[2]): - dirlist.append(os.path.dirname(file)) - - for dir in uniq(dirlist): - print "/%s" % dir - - elif not os.path.exists(sys.argv[1]): - print "File %s not found" % sys.argv[1] - - else: - for file in show_info(sys.argv[1]): - print "/%s" % file - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tags/pisi-1.1_rc10/scripts/newpisipackage b/tags/pisi-1.1_rc10/scripts/newpisipackage deleted file mode 100755 index a6aeec8f..00000000 --- a/tags/pisi-1.1_rc10/scripts/newpisipackage +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# just put a .pisipackager file in your home and fill it like -# -# name = Onur Küçük -# email = onur@pardus.org.tr -# - -import os -import sys -import time -import string - -packagerfile = ".pisipackager" - -data = {"date": time.strftime("%Y-%m-%d")} - -temp_pspec = ''' - - - - %(package)s - - - %(packager_name)s - %(packager_email)s - - GPL-2 - app:gui -

- - - - - - - - - - - - - - - %(package)s - - - - / - - - - - - System.Package - System.Service - - - - - - %(date)s - - First release - %(packager_name)s - %(packager_email)s - - - -''' - -temp_actions = '''#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright 2006 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools -from pisi.actionsapi import get - -# WorkDir = "" -# NoStrip = "/" - -def setup(): - autotools.configure() - -def build(): - autotools.make() - -def install(): - autotools.rawInstall("DESTDIR=%%s" %% get.installDIR()) - - pisitools.dodoc("AUTHORS", "ChangeLog", "README*", "NEWS") -''' - -temp_desktop = '''[Desktop Entry] -Type=Application -Version=1.0 -Encoding=UTF-8 -Name=%(package_cap)s -Name[tr]=%(package_cap)s -GenericName=%(package_cap)s -GenericName[tr]=%(package_cap)s -Icon=%(package)s -Exec=%(package)s -Terminal=false -StartupNotify=false -Categories=Application;Game;ArcadeGame -''' - -temp_service = '''serviceType = "local" -serviceDesc = "%(package_cap)s" -serviceDefault = "off" - -from comar.service import * - -def start(): - if 0 == run('/sbin/start-stop-daemon --quiet --start --exec /usr/bin/%(package)s --pidfile /var/run/%(package)s.pid'): - notify("System.Service.changed", "started") - -def stop(): - if 0 == run("/sbin/start-stop-daemon --stop --pidfile /var/run/%(package)s.pid"): - notify("System.Service.changed", "stopped") - -def status(): - return checkDeamon("/var/run/%(package)s.pid") - -''' - -temp_postscript = '''#/usr/bin/python - -import os - -def postInstall(): - print "FIXME" - -''' - -def write(filename, data): - try: - f = file("%s/%s" % (target, filename), "w") - f.write(data) - f.close() - except: - print "Could not write file %s/%s" % (target, filename) - - -def create_dirs(): - try: - os.makedirs("%s/files" % target) - os.makedirs("%s/comar" % target) - except: - print "Could not make directory %s" % target - sys.exit(1) - -def readConfig(): - home = os.getenv("HOME", "") - cfg = "%s/%s" % (home, packagerfile) - d = {"name": "", "email": ""} - - if home != "" and os.path.exists(cfg): - for line in file(cfg): - if line != "" and not line.startswith("#") and "=" in line: - l, m = line.split("=", 1) - k = l.strip() - v = m.strip() - if k in ["name", "email"]: - if v.startswith('"') or v.startswith("'"): - v = v[1:-1] - d[k.strip()] = v.strip() - - return d["name"], d["email"] - -# some checks -if len(sys.argv) < 2: - print "Usage : %s NewPackageDir" % sys.argv[0] - sys.exit(0) -else: - target = sys.argv[1] - data["packagedir"], data["package"] = os.path.split(target) - data["package_cap"] = string.capitalize(data["package"]) - -if os.path.exists(target): - print "%s already exists, please remove it first" % target - sys.exit(1) -elif " " in data["package"]: - print "You should not use empty space in package name" - sys.exit(1) - -# here we go -data["packager_name"], data["packager_email"] = readConfig() -create_dirs() -write("pspec.xml", temp_pspec % data) -write("actions.py", temp_actions % data) -write("files/%s.desktop" % data["package"], temp_desktop % data) -write("comar/service.py", temp_service % data) -write("comar/package.py", temp_postscript) - diff --git a/tags/pisi-1.1_rc10/scripts/pisisdr b/tags/pisi-1.1_rc10/scripts/pisisdr deleted file mode 100755 index 4aa83fb5..00000000 --- a/tags/pisi-1.1_rc10/scripts/pisisdr +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -# a Simple helper script for PiSi to set default repo - -import os -import sys - -import pisi -import pisi.context as ctx - -def usage(): - print """ - Usage: - pisisdr reponame - """ - sys.exit(1) - -def main(): - if len(sys.argv) < 2: - usage() - - repo = sys.argv[1] - - try: - pisi.api.init(write=True) - ctx.repodb.set_default_repo(repo) - pisi.api.finalize() - except pisi.lockeddbshelve.Error, e: - print e - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tags/pisi-1.1_rc10/scripts/repo-diff.py b/tags/pisi-1.1_rc10/scripts/repo-diff.py deleted file mode 100755 index 5ef5ea8b..00000000 --- a/tags/pisi-1.1_rc10/scripts/repo-diff.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import os -import sys -from pisi.specfile import SpecFile -from pisi.util import join_path - -def findPspec(folder): - pspecList = [] - for root, dirs, files in os.walk(folder): - if "pspec.xml" in files: - pspecList.append(root) - # dont walk into the versioned stuff - if ".svn" in dirs: - dirs.remove(".svn") - return pspecList - -def getVersion(pspecList): - sources = {} - for pspec in pspecList: - specFile = SpecFile(join_path(pspec, "pspec.xml")) - sources[specFile.source.name] = (specFile.source.version, specFile.source.release) - return sources - -def listIntersection(firstRepo, secondRepo): - keys = list(set(firstRepo.keys()).__and__(set(secondRepo.keys()))) - keys.sort() - for i in keys: - if firstRepo[i] != secondRepo[i]: - print " %s: %s (r%s) -> %s (r%s)" % (i, firstRepo[i][0], firstRepo[i][1], secondRepo[i][0], secondRepo[i][1]) - -def listComplement(firstRepo, secondRepo): - keys = list(set(firstRepo.keys()) - set(secondRepo.keys())) - keys.sort() - for i in keys: - print " %s" % i - -def usage(miniMe): - print """Usage: - %s pathToSvn component (ex: %s /home/caglar/svn/pardus/ system/devel) - """ % (miniMe, miniMe) - - sys.exit(1) - -if __name__ == "__main__": - try: - svnRoot = sys.argv[1] - except IndexError: - usage(sys.argv[0]) - - try: - postfix = sys.argv[2] - except IndexError: - postfix = "" - - tag = getVersion(findPspec(join_path(svnRoot, "tags/pardus-1.0/", postfix))) - stable = getVersion(findPspec(join_path(svnRoot,"stable/pardus-1/", postfix))) - devel = getVersion(findPspec(join_path(svnRoot, "devel/", postfix))) - - print "Tag --> Stable" - listIntersection(tag, stable) - print - - print "Tag has, Stable hasn't" - listComplement(tag, stable) - print - - print "Stable has, Tag hasn't" - listComplement(stable, tag) - print - - print "Stable --> Devel" - listIntersection(stable, devel) - print - - print "Stable has, Devel hasn't" - listComplement(stable, devel) - print - - print "Devel has, Stable hasn't" - listComplement(devel, stable) - print diff --git a/tags/pisi-1.1_rc10/scripts/repostats.py b/tags/pisi-1.1_rc10/scripts/repostats.py deleted file mode 100755 index decf3952..00000000 --- a/tags/pisi-1.1_rc10/scripts/repostats.py +++ /dev/null @@ -1,698 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# - -import sys -import os -import codecs -import re -import getopt - -import gettext -__trans = gettext.translation('pisi', fallback=True) -_ = __trans.ugettext - -from svn import core, client - -sys.path.append('.') -import pisi.specfile -import pisi.uri -import pisi.package -import pisi.metadata -import pisi.files -from pisi.cli import printu - -# default html templates - -def_table_html = u""" -%s%s -""" - -def_repo_sizes_html = u""" -

Boyutlar

-

Toplam kurulu boyut %(total)s

-

Dosya tiplerine göre liste:

- -%(sizes)s -
-""" - -def_repo_html = u""" - - Depo istatistikleri - - - -
-
-
- -""" - -def_packager_html = u""" - - Paketçi %(name)s - - - -
-
-
- -

%(name)s <%(email)s>

- -

Paketler:

-

%(sources)s

- -

Güncellemeler:

-

%(updates)s

-
- -""" - -def_package_html = u""" - - İkili paket %(name)s - - - - -
-
-
- -

İkili paket: %(name)s

-

Kaynak versiyon %(version)s, depo sürümü %(release)s

- -

Kaynak paket %(source)s

- -

Derlemek için gerekenler:

-

%(buildDeps)s

- -

Çalıştırmak için gerekenler:

-

%(runtimeDeps)s

- -

Bağımlı paketler (derlenmek için):

-

%(revBuildDeps)s

- -

Bağımlı paketler (çalışmak için):

-

%(revRuntimeDeps)s

-
- -""" - -def_history_html= u""" -
Sürüm %s

-Tarih: %s
-Yapan: %s
-Açıklama: %s -

-""" - -def_source_html = u""" - - Kaynak paket %(name)s - - - - -
-
-
- -

Kaynak paket: %(name)s

-

Kaynak versiyon %(version)s, depo sürümü %(release)s

-

%(homepage)s

- -

Açıklama

-

%(summary)s

- -

Lisanslar:

-

%(license)s

- -

İşlemler:

-

Paket dosyalarına bak

-

-Hata kayıtlarına bak

- -

Bu kaynaktan derlenen ikili paketler:

-

%(packages)s

- -

Tarihçe

-%(history)s - -

Yamalar

-%(patches)s -
- -""" - -def_sources_html = u""" - - Kaynak paketler listesi - - - - -
-
-
- -

Kaynak paketler listesi

-
- -

-%(source_list)s -

-
- -""" - -def_missing_html = u""" - - Eksik ikili paket %(name)s - - - - -
-
-
- -

Eksik ikili paket: %(name)s

- -

Bağımlı paketler (derlenmek için):

-

%(revBuildDeps)s

- -

Bağımlı paketler (çalışmak için):

-

%(revRuntimeDeps)s

-
- -""" - - -def svn_uri(path): - # init - core.apr_initialize() - pool = core.svn_pool_create(None) - core.svn_config_ensure(None, pool) - # get commit date - uri = client.svn_client_url_from_path(path, pool) - # cleanup - core.svn_pool_destroy(pool) - core.apr_terminate() - return uri - - -# FIXME: This check should be in specfile -valid_filetypes = [ - "executable", - "library", - "data", - "config", - "doc", - "man", - "info", - "localedata", - "header", - "all" -] - -def valuesort(x, y): - if x[1] > y[1]: - return -1 - elif x[1] == y[1]: - return 0 - else: - return 1 - -def find_pspecs(folder): - paks = [] - for root, dirs, files in os.walk(folder): - if "pspec.xml" in files: - paks.append(root) - # dont walk into the versioned stuff - if ".svn" in dirs: - dirs.remove(".svn") - return paks - -def template_get(tmpl_name): - try: - f = codecs.open(tmpl_name + ".html", "r", "utf-8") - data = f.read() - f.close() - return data - except: - return globals()["def_" + tmpl_name + "_html"] - -def template_write(filename, tmpl_name, dict): - f = codecs.open(filename, "w", "utf-8") - f.write(template_get(tmpl_name) % dict) - f.close() - -def template_table(tmpl_name, list): - tmpl = template_get(tmpl_name) - data = "" - for item in list: - data += (tmpl % item) - return data - -def mangle_email(email): - return re.sub("@", " [at] ", email) - - -class Histogram: - def __init__(self): - self.list = {} - - def add(self, name, value=None): - if value: - self.list[name] = value - else: - self.list[name] = self.list.get(name, 0) + 1 - - def note(self, name): - if not self.list.has_key(name): - self.list[name] = 0 - - def get_list(self, max=0): - items = self.list.items() - items.sort(valuesort) - if max != 0: - return items[:max] - else: - return items - - -# Dictionary of all source packages keyed by the source name -sources = {} - -# Dictionary of all binary packages keyed by the package name -packages = {} - -# Dictionary of all packagers keyed by the packager name -packagers = {} - -# Dictionary of missing depended binary packages keyed by the package name -missing = {} - -# List of all repository problems -errors = [] - - -class Missing: - def __init__(self, name): - missing[name] = self - self.name = name - self.revBuildDeps = [] - self.revRuntimeDeps = [] - - def report_html(self): - bDeps = map(lambda x: "%s" % (x, x), self.revBuildDeps) - rDeps = map(lambda x: "%s" % (x, x), self.revRuntimeDeps) - dict = { - "name": self.name, - "revBuildDeps": ", ".join(bDeps), - "revRuntimeDeps": ", ".join(rDeps) - } - template_write("paksite/package-%s.html" % self.name, "missing", dict) - - -class Package: - def __init__(self, source, pakspec): - name = pakspec.name - if packages.has_key(name): - errors.append(_("Duplicate binary packages:\n%s\n%s\n") % ( - source.name, packages[name].source.name)) - return - for p in pakspec.files: - if p.fileType not in valid_filetypes: - e = _("Unknown file type '%s' in package '%s'") % ( - p.fileType, source.name) - errors.append(e) - packages[name] = self - self.name = name - self.source = source - self.pakspec = pakspec - self.revBuildDeps = [] - self.revRuntimeDeps = [] - self.installedSize = 0 - - def markDeps(self): - # mark reverse build dependencies - for d in self.source.spec.source.buildDependencies: - p = d.package - if packages.has_key(p): - packages[p].revBuildDeps.append(self.name) - else: - if not missing.has_key(p): - Missing(p) - missing[p].revBuildDeps.append(self.name) - # mark reverse runtime dependencies - for d in self.pakspec.packageDependencies: - p = d.package - if packages.has_key(p): - packages[p].revRuntimeDeps.append(self.name) - else: - if not missing.has_key(p): - Missing(p) - missing[p].revRuntimeDeps.append(self.name) - - def report_html(self): - source = self.source.spec.source - bDeps = map(lambda x: "%s" % (x, x), - (map(lambda x: x.package, source.buildDependencies))) - rDeps = map(lambda x: "%s" % (x, x), - (map(lambda x: x.package, self.pakspec.packageDependencies))) - rbDeps = map(lambda x: "%s" % (x, x), self.revBuildDeps) - rrDeps = map(lambda x: "%s" % (x, x), self.revRuntimeDeps) - dict = { - "name": self.name, - "source": source.name, - "version": source.version, - "release": source.release, - "buildDeps": ", ".join(bDeps), - "runtimeDeps": ", ".join(rDeps), - "revBuildDeps": ", ".join(rbDeps), - "revRuntimeDeps": ", ".join(rrDeps) - } - template_write("paksite/package-%s.html" % self.name, "package", dict) - - -class Source: - def __init__(self, path, spec): - name = spec.source.name - if sources.has_key(name): - errors.append(_("Duplicate source packages:\n%s\n%s\n") % ( - path, sources[name].path)) - return - sources[name] = self - self.spec = spec - self.name = name - self.path = path - self.uri = svn_uri(path) - for p in spec.packages: - Package(self, p) - self.checkRelease() - - def validDate(self, date): - # yyyy-mm-dd - err = 0 - if len(date) != 10: - err = 1 - if date[4] != '-' or date[7] != '-': - err = 1 - if err: - e = _("Source package '%s' has wrong date format '%s'") % (self.name, date) - errors.append(e) - # more checks can be added, i.e. valid day month ranges, etc - - def checkRelease(self): - pass - - def report_html(self): - source = self.spec.source - paks = map(lambda x: "%s" % (x, x), - (map(lambda x: x.name, self.spec.packages))) - histdata = map(lambda x: (x.release, x.date, x.name, x.name, x.comment), self.spec.history) - ptch = map(lambda x: "%s" % (self.uri, - x.filename, x.filename), source.patches) - dict = { - "name": self.name, - "homepage": source.homepage, - "license": ", ".join(source.license), - "version": source.version, - "release": source.release, - "history": template_table("history", histdata), - "packages": "
".join(paks), - "summary": source.summary, - "patches": "
".join(ptch), - "uri": self.uri - } - template_write("paksite/source-%s.html" % self.name, "source", dict) - - -class Packager: - def __init__(self, spec, update=None): - if update: - name = update.name - email = update.email - else: - name = spec.source.packager.name - email = spec.source.packager.email - if packagers.has_key(name): - if email != packagers[name].email: - e = _("Developer '%s <%s>' has another mail address '%s' in source package '%s'") % ( - name, packagers[name].email, email, spec.source.name) - packagers[name].errors.append(e) - errors.append(e) - if update: - packagers[name].updates.append((spec.source.name, update.release, update.comment)) - else: - packagers[name].sources.append(spec.source.name) - else: - packagers[name] = self - self.name = name - self.email = email - if update: - self.sources = [] - self.updates = [(spec.source.name, update.release, update.comment)] - else: - self.sources = [spec.source.name] - self.updates = [] - self.errors = [] - if not update: - for update in spec.history: - Packager(spec, update) - - def report_html(self): - srcs = map(lambda x: "%s" % (x, x), self.sources) - srcs.sort() - upds = map(lambda x: "%s (%s)
%s
" % ( - x[0], x[0], x[1], x[2]), self.updates) - dict = { - "name": self.name, - "email": mangle_email(self.email), - "sources": "
".join(srcs), - "updates": " ".join(upds) - } - template_write("paksite/%s.html" % self.name, "packager", dict) - - -class Repository: - def __init__(self, path): - self.path = path - self.nr_sources = 0 - self.nr_packages = 0 - self.nr_patches = 0 - self.people = Histogram() - self.licenses = Histogram() - self.mostpatched = Histogram() - self.longpy = Histogram() - self.cscripts = Histogram() - self.total_installed_size = 0 - self.installed_sizes = {} - - def processPspec(self, path, spec): - # new classes - Packager(spec) - Source(path, spec) - # update global stats - self.nr_sources += 1 - self.nr_packages += len(spec.packages) - self.nr_patches += len(spec.source.patches) - # update top fives - self.people.add(spec.source.packager.name) - for u in spec.history: - self.people.note(u.name) - for p in spec.packages: - for cs in p.providesComar: - self.cscripts.add(cs.om) - for L in spec.source.license: - self.licenses.add(L) - self.mostpatched.add(spec.source.name, len(spec.source.patches)) - try: - f = file(os.path.join(path, "actions.py")) - L = len(f.readlines()) - self.longpy.add(spec.source.name, L) - f.close() - except: - pass - - def scan(self): - for pak in find_pspecs(self.path): - spec = pisi.specfile.SpecFile() - try: - spec.read(os.path.join(pak, "pspec.xml")) - except Exception, inst: - errors.append(_("Cannot parse '%s':\n%s\n") % (pak, inst.args[0])) - continue - self.processPspec(pak, spec) - for p in packages.values(): - p.markDeps() - - def processPisi(self, path): - p = pisi.package.Package(path) - p.extract_files(["metadata.xml", "files.xml"], ".") - md = pisi.metadata.MetaData() - md.read("metadata.xml") - self.total_installed_size += md.package.installedSize - if packages.has_key(md.package.name): - # FIXME: check version/release match too? - packages[md.package.name].installed_size = md.package.installedSize - else: - printu("Binary package '%s' has no source package in repository %s\n" % (path, self.path)) - fd = pisi.files.Files() - fd.read("files.xml") - for f in fd.list: - if self.installed_sizes.has_key(f.type): - # Emtpy directories and symlinks has None size - if not f.size is None: - self.installed_sizes[f.type] += int(f.size) - else: - self.installed_sizes[f.type] = int(f.size) - - def scan_bins(self, binpath): - for root, dirs, files in os.walk(binpath): - for fn in files: - if fn.endswith(".pisi"): - self.processPisi(os.path.join(root, fn)) - - def report_html(self): - miss = map(lambda x: "%s" % (x, x), missing.keys()) - upeople = [] - for p in self.people.get_list(): - upeople.append(("%s" % (p[0], p[0]), p[1])) - if errors: - e = "
".join(errors) - else: - e = "" - upatch = [] - for p in self.mostpatched.get_list(5): - upatch.append(("%s" % (p[0], p[0]), p[1])) - ulongpy = [] - for p in self.longpy.get_list(5): - ulongpy.append(("%s" % (p[0], p[0]), p[1])) - if self.total_installed_size: - items = self.installed_sizes.items() - items.sort(valuesort) - elts = "".join(map(lambda x: "%s%d" % (x[0], x[1]), items)) - sizes = template_get("repo_sizes") % { "total": self.total_installed_size, "sizes": elts } - else: - sizes = "" - dict = { - "nr_source": self.nr_sources, - "nr_packages": self.nr_packages, - "nr_patches": self.nr_patches, - "most_patched": template_table("table", upatch), - "longpy": template_table("table", ulongpy), - "packagers": template_table("table", upeople), - "missing": "\n".join(miss), - "sizes": sizes, - "errors": e - } - template_write("paksite/index.html", "repo", dict) - srclist = map(lambda x: "%s" % (x, x), sources) - srclist.sort() - dict = { - "source_list": "
".join(srclist) - } - template_write("paksite/sources.html", "sources", dict) - - -# command line driver - -def usage(): - printu(_("Usage: repostats.py [OPTIONS] source-repo-path [binary-repo-path]\n")) - printu(" -t, --test-only: %s" % _("Dont generate the web site.\n")) - sys.exit(0) - -if __name__ == "__main__": - try: - opts, args = getopt.gnu_getopt(sys.argv[1:], "ht", ["help", "test-only"]) - except: - usage() - - if args == []: - usage() - - do_web = True - - for o, v in opts: - if o in ("-h", "--help"): - usage() - if o in ("-t", "--test-only"): - do_web = False - - repo = Repository(args[0]) - printu(_("Scanning source repository...\n")) - repo.scan() - - if len(args) > 1: - printu(_("Scanning binary packages...\n")) - repo.scan_bins(args[1]) - - if errors: - printu("***\n") - printu(_("Encountered %d errors! Fix them immediately!\n") % len(errors)) - for e in errors: - printu(e) - printu("\n") - printu("\n") - printu("***\n") - - if missing: - printu(_("These dependencies are not available in repository:\n")) - for m in missing.keys(): - printu(" %s\n" % m) - - if do_web: - try: - os.mkdir("paksite") - except: - pass - repo.report_html() - for p in packagers.values(): - p.report_html() - for p in missing.values(): - p.report_html() - for p in packages.values(): - p.report_html() - for p in sources.values(): - p.report_html() diff --git a/tags/pisi-1.1_rc10/scripts/revdep-rebuild b/tags/pisi-1.1_rc10/scripts/revdep-rebuild deleted file mode 100755 index 24dac09f..00000000 --- a/tags/pisi-1.1_rc10/scripts/revdep-rebuild +++ /dev/null @@ -1,200 +0,0 @@ -#!/bin/bash - -# revdep-rebuild: Reverse dependency rebuilder. -# Author: Stanislav Brabec - -# Mask of specially evaluated libraries (exactly one space separated). -LD_LIBRARY_MASK="libodbcinst.so libodbc.so libjava.so libjvm.so" - -# List of directories to be searched (feel free to edit it) -# Note /usr/libexec and /usr/local/subprefix cotradicts FHS, but are present -SEARCH_DIRS="/lib /bin /sbin /usr/lib /usr/bin /usr/sbin /usr/libexec /usr/local /usr/qt* /usr/kde/*/bin /usr/lib/MozillaFirefox /usr/kde/*/lib /usr/*-*-linux-gnu /opt" - -# Base of temporary files names. -LIST=~/.revdep-rebuild - -shopt -s nullglob -shopt -s expand_aliases -unalias -a - -NO="\x1b[0;0m" -BR="\x1b[0;01m" -CY="\x1b[36;01m" -GR="\x1b[32;01m" -RD="\x1b[31;01m" -YL="\x1b[33;01m" -BL="\x1b[34;01m" - -alias echo_v=echo - -SONAME="not found" -SONAME_GREP=fgrep -SEARCH_BROKEN=true - -while : ; do - case "$1" in - -h | --help ) - echo "Usage: $0 [OPTIONS] [--]" - echo - echo "Broken reverse dependency rebuilder." - echo - echo - echo " --force" - echo - echo " --soname SONAME recompile packages using library with SONAME instead" - echo " of broken library (SONAME providing library must be" - echo " present in the system)" - echo " --soname-regexp SONAME" - echo " the same as --soname, but accepts grep-style regexp" - echo " -q, --quiet be less verbose" - echo - exit 0 - ;; - -q | --quiet ) - alias echo_v=: - shift - ;; - --soname=* ) - SONAME="${1#*=}" - SEARCH_BROKEN=false - shift - ;; - --soname ) - SONAME="$2" - SEARCH_BROKEN=false - shift 2 - ;; - --soname-regexp=* ) - SONAME="${1#*=}" - SONAME_GREP=grep - SEARCH_BROKEN=false - shift - ;; - --soname-regexp ) - SONAME="$2" - SONAME_GREP=grep - SEARCH_BROKEN=false - shift 2 - ;; - --force ) - FORCE=true - shift - ;; - -- ) - shift - break - ;; - * ) - break - ;; - esac -done - -function set_trap () { - trap "rm_temp $1" SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM -} - -function rm_temp () { - echo " terminated." - echo "Removing incomplete $1." - rm $1 - echo - exit 1 -} - -if $FORCE ; then - rm -f /root/.revdep-rebuild* -fi - -if $SEARCH_BROKEN ; then - SONAME_SEARCH="$SONAME" - LLIST=$LIST - HEAD_TEXT="broken by any package update" - OK_TEXT="Dynamic linking on your system is consistent" - WORKING_TEXT=" consistency" -else - SONAME_SEARCH=" $SONAME " - LLIST=${LIST}_$(echo "$SONAME_SEARCH$SONAME" | md5sum | head -c 8) - HEAD_TEXT="using given shared object name" - OK_TEXT="There are no dynamic links to $SONAME" - WORKING_TEXT="" -fi - -echo -echo "Checking reverse dependencies..." -echo "Packages containing binaries and libraries $HEAD_TEXT," -echo "will be recompiled." - -echo -echo -n -e "${GR}Collecting system binaries and libraries...${NO}" -if [ -f $LIST.1_files ] ; then - echo " using existing $LIST.1_files." -else - set_trap "$LIST.1_files" - find $SEARCH_DIRS -type f \( -perm /+u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null >$LIST.1_files - echo -e " done.\n ($LIST.1_files)" -fi - -if $SEARCH_BROKEN ; then - echo - echo -n -e "${GR}Collecting complete LD_LIBRARY_PATH...${NO}" - if [ -f $LIST.2_ldpath ] ; then - echo " using existing $LIST.2_ldpath." - else - set_trap "$LIST.2_ldpath" - ( - grep '.*\.so\(\|\..*\)$' <$LIST.1_files | sed 's:/[^/]*$::' - sed '/^#/d;s/#.*$//' $LIST.2_ldpath - echo -e " done.\n ($LIST.2_ldpath)" - fi - export COMPLETE_LD_LIBRARY_PATH="$(cat $LIST.2_ldpath)" -fi - -echo -echo -n -e "${GR}Checking dynamic linking$WORKING_TEXT...${NO}" -if [ -f $LLIST.3_rebuild ] ; then - echo " using existing $LLIST.3_rebuild." -else - echo_v - set_trap "$LLIST.3_rebuild" - LD_MASK="\\( $(echo "$LD_LIBRARY_MASK" | sed 's/\./\\./g;s/ / \\| /g') \\)" - echo -n >$LLIST.3_rebuild - cat $LIST.1_files | while read FILE ; do - # Note: double checking seems to be faster than single - # with complete path (special add ons are rare). - if ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" | - $SONAME_GREP -q "$SONAME_SEARCH" ; then - if $SEARCH_BROKEN ; then - if LD_LIBRARY_PATH="$COMPLETE_LD_LIBRARY_PATH" \ - ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" | - $SONAME_GREP -q "$SONAME_SEARCH" ; then - echo "$FILE" >>$LLIST.3_rebuild - echo_v " broken $FILE (requires $(ldd "$FILE" | sed -n 's/ \(.*\) => not found$/\1/p' | tr '\n' ' ' | sed 's/ $//' ))" - fi - else - echo "$FILE" >>$LLIST.3_rebuild - echo_v " found $FILE" - fi - fi - done - echo -e " done.\n ($LLIST.3_rebuild)" -fi - -echo -echo -n -e "${GR}Determining package names$WORKING_TEXT...${NO}" -if [ -f $LLIST.4_names ] ; then - echo " using existing $LLIST.4_names." -else - echo_v - set_trap "$LLIST.4_names" - for i in `cat $LLIST.3_rebuild` - do - /usr/bin/pisi -q search-file $i >> $LLIST.tmp - done - cat $LLIST.tmp | uniq | sort > $LLIST.4_names - rm -f $LLIST.tmp - echo -e " done.\n ($LIST.4_names)" -fi -cat $LLIST.4_names diff --git a/tags/pisi-1.1_rc10/scripts/unpisi b/tags/pisi-1.1_rc10/scripts/unpisi deleted file mode 100755 index ee7478d5..00000000 --- a/tags/pisi-1.1_rc10/scripts/unpisi +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import sys -import os -from zipfile import BadZipfile - -import pisi -from pisi.archive import ArchiveZip, ArchiveTar -import pisi.context as ctx -import pisi.util as util - -def usage(errmsg): - print """ - Error: %s - - Usage: - unpisi PiSi_package.PiSi - """ % (errmsg) - - sys.exit(1) - -def main(): - - if len(sys.argv) < 2: - usage("PiSi package required..") - - pisi.api.init(database=False, options='') - - try: - arc = ArchiveZip(sys.argv[1], 'zip', 'r') - except BadZipfile, e: - print e - sys.exit(1) - - arc.unpack_files(['files.xml', 'metadata.xml'], '.') - arc.unpack_files("install.tar.lzma", ctx.config.tmp_dir()) - arc.unpack_dir_flat('comar','comar') - - tar_file = util.join_path(ctx.config.tmp_dir(), "install.tar.lzma") - tar = ArchiveTar(tar_file, 'tarlzma') - tar.unpack_dir('.') - - os.unlink(tar_file) - os.unlink(tar_file.rstrip('.lzma')) - - pisi.api.finalize() - return 0 - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tags/pisi-1.1_rc10/setup.py b/tags/pisi-1.1_rc10/setup.py deleted file mode 100755 index ec23d5dc..00000000 --- a/tags/pisi-1.1_rc10/setup.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005-2006, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import os -import shutil -import glob -import sys -import inspect -from distutils.core import setup -from distutils.command.install import install - -sys.path.insert(0, '.') -import pisi - -class Install(install): - def run(self): - install.run(self) - self.installi18n() - self.installdoc() - self.generateConfigFile() - - def installi18n(self): - for name in os.listdir('po'): - if not name.endswith('.po'): - continue - lang = name[:-3] - print "Installing '%s' translations..." % lang - os.popen("msgfmt po/%s.po -o po/%s.mo" % (lang, lang)) - if not self.root: - self.root = "/" - destpath = os.path.join(self.root, "usr/share/locale/%s/LC_MESSAGES" % lang) - if not os.path.exists(destpath): - os.makedirs(destpath) - shutil.copy("po/%s.mo" % lang, os.path.join(destpath, "pisi.mo")) - - def installdoc(self): - destpath = os.path.join(self.root, "usr/share/doc/pisi") - if not os.path.exists(destpath): - os.makedirs(destpath) - os.chdir('doc') - for pdf in glob.glob('*.pdf'): - print 'Installing', pdf - shutil.copy(pdf, os.path.join(destpath, pdf)) - os.chdir('..') - - def generateConfigFile(self): - import pisi.configfile - destpath = os.path.join(self.root, "etc/pisi/") - if not os.path.exists(destpath): - os.makedirs(destpath) - pisiconf = open(os.path.join(destpath, "pisi.conf"), "w") - - klasses = inspect.getmembers(pisi.configfile, inspect.isclass) - defaults = [klass for klass in klasses if klass[0].endswith('Defaults')] - - for d in defaults: - section_name = d[0][:-len('Defaults')].lower() - pisiconf.write("[%s]\n" % section_name) - - section_members = [m for m in inspect.getmembers(d[1]) \ - if not m[0].startswith('__') \ - and not m[0].endswith('__')] - - for member in section_members: - pisiconf.write("# %s = %s\n" % (member[0], member[1])) - - pisiconf.write('\n') - - -setup(name="pisi", - version= pisi.__version__, - description="PiSi (Packages Installed Successfully as Intended)", - long_description="PiSi is the package management system of Pardus Linux.", - license="GNU GPL2", - author="Pardus Developers", - author_email="pisi@pardus.org.tr", - url="http://www.pardus.org.tr/eng/pisi/", - package_dir = {'': ''}, - packages = ['pisi', 'pisi.cli', 'pisi.actionsapi', 'pisi.pxml', 'pisi.search', 'pisi.scenarioapi'], - scripts = ['pisi-cli', 'scripts/lspisi', 'scripts/unpisi', 'scripts/check-newconfigs.py', 'scripts/revdep-rebuild'], - cmdclass = {'install' : Install} - ) - -# the below stuff is really nice but we already have a version -# we can use this stuff for svn snapshots in a separate -# script, or with a parameter I don't know -- exa - -PISI_VERSION = pisi.__version__ - -def getRevision(): - import os - try: - p = os.popen("svn info 2> /dev/null") - for line in p.readlines(): - line = line.strip() - if line.startswith("Revision:"): - return line.split(":")[1].strip() - except: - pass - - # doesn't working in a Subversion directory - return None - -def getVersion(): - rev = getRevision() - if rev: - return "-r".join([PISI_VERSION, rev]) - else: - return PISI_VERSION diff --git a/tags/pisi-1.1_rc10/tests/README b/tags/pisi-1.1_rc10/tests/README deleted file mode 100644 index 35feab83..00000000 --- a/tags/pisi-1.1_rc10/tests/README +++ /dev/null @@ -1,11 +0,0 @@ -PISI test suite ---------------- - - -There are python unit tests and shell scripts in this directory. - -Run the python tests with - -$ tests/run.py - -Shell scripts use the CLIs to perform package operations. diff --git a/tags/pisi-1.1_rc10/tests/a.xml b/tags/pisi-1.1_rc10/tests/a.xml deleted file mode 100644 index ee6a6e29..00000000 --- a/tags/pisi-1.1_rc10/tests/a.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - cıvık mantardır bu - Eray Ozkural - 868 - Lazy Tin - Tembel Teneke - pisi - noatun - kdevelop - - 18071976 - AI - - Baris - Gurer - Caglar - Meren - - - diff --git a/tags/pisi-1.1_rc10/tests/actionsapitests.py b/tags/pisi-1.1_rc10/tests/actionsapitests.py deleted file mode 100644 index 53f7335d..00000000 --- a/tags/pisi-1.1_rc10/tests/actionsapitests.py +++ /dev/null @@ -1,155 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import unittest -import zipfile -import shutil -import os - -import testcase - -class ActionsAPITestCase(testcase.TestCase): - def setUp(self): - from pisi.actionsapi.variables import initVariables - - testcase.TestCase.setUp(self) - initVariables() - #FIXME: test incomplete - return - self.f = zipfile.ZipFile("helloworld-0.1-1.pisi", "r") - self.filelist = [] - - for file in self.f.namelist(): - self.filelist.append(file) - - def testFileList(self): - #FIXME: test incomplete - return - fileContent = ["files.xml", \ - "install/bin/helloworld", \ - "install/opt/PARDUS", \ - "install/opt/helloworld/helloworld", \ - "install/opt/uludag", \ - "install/sbin/helloworld", \ - "install/sys/PARDUS", \ - "install/sys/uludag", \ - "install/usr/bin/goodbye", \ - "install/usr/bin/helloworld", \ - "install/usr/lib/helloworld.o", \ - "install/usr/sbin/goodbye", \ - "install/usr/sbin/helloworld", \ - "install/usr/share/doc/helloworld-0.1-1/Makefile.am", \ - "install/usr/share/doc/helloworld-0.1-1/goodbyeworld.cpp", \ - "install/usr/share/info/Makefile.am", \ - "install/usr/share/info/Makefile.cvs", \ - "install/usr/share/info/Makefile.in", \ - "install/var/goodbye", \ - "install/var/hello", \ - "metadata.xml"] - - '''check number of files in package''' - self.assertEqual(fileContent.__len__(), self.filelist.__len__()) - - '''check file content''' - for file in self.filelist: - self.assert_(fileContent.__contains__(file)) - - def testShelltoolsCopy(self): - from pisi.actionsapi.shelltools import copy - - copy('tests/actionsapitests/brokenlink', 'tests/actionsapitests/brokenlink-copy') - self.assertEqual(os.path.islink('tests/actionsapitests/brokenlink-copy'), True) - os.remove('tests/actionsapitests/brokenlink-copy') - - copy('tests/actionsapitests/brokenlink', 'tests/actionsapitests/adirectory') - self.assertEqual(os.path.islink('tests/actionsapitests/adirectory/brokenlink'), True) - - copy('tests/actionsapitests/brokenlink', 'tests/actionsapitests/adirectory/brknlnk') - self.assertEqual(os.path.islink('tests/actionsapitests/adirectory/brknlnk'), True) - os.remove('tests/actionsapitests/adirectory/brknlnk') - - self.assertEqual(os.readlink('tests/actionsapitests/adirectory/brokenlink'), '/no/such/place') - os.remove('tests/actionsapitests/adirectory/brokenlink') - - copy('tests/actionsapitests/linktoadirectory', 'tests/actionsapitests/adirectory/', False) - self.assertEqual(os.path.exists('tests/actionsapitests/adirectory/linktoadirectory/file'), True) - self.assertEqual(os.path.getsize('tests/actionsapitests/adirectory/linktoadirectory/file'), 321) - shutil.rmtree('tests/actionsapitests/adirectory/linktoadirectory') - - copy('tests/actionsapitests/file', 'tests/actionsapitests/adirectory') - self.assertEqual(os.path.isfile('tests/actionsapitests/adirectory/file'), True) - #overwrite.. - copy('tests/actionsapitests/file', 'tests/actionsapitests/adirectory') - os.remove('tests/actionsapitests/adirectory/file') - - copy('tests/actionsapitests/linktoafile', 'tests/actionsapitests/adirectory', False) - ourguy = 'tests/actionsapitests/%s' % os.readlink('tests/actionsapitests/linktoafile') - self.assert_(os.path.exists(ourguy)) - - copy('tests/actionsapitests/file', 'tests/actionsapitests/file-copy') - self.assertEqual(os.path.exists('tests/actionsapitests/file-copy'), True) - os.remove('tests/actionsapitests/file-copy') - - copy('tests/actionsapitests/file', 'tests/actionsapitests/adirectory/filewithanothername') - self.assertEqual(os.path.exists('tests/actionsapitests/adirectory/filewithanothername'), True) - os.remove('tests/actionsapitests/adirectory/filewithanothername') - - copy('tests/actionsapitests/linkeddir', 'tests/actionsapitests/adirectory') - self.assertEqual(os.path.exists('tests/actionsapitests/adirectory/linkeddir/file'), True) - shutil.rmtree('tests/actionsapitests/adirectory/linkeddir') - - copy('tests/actionsapitests/linkeddir', 'tests/actionsapitests/adirectory/withanothername') - self.assertEqual(os.path.exists('tests/actionsapitests/adirectory/withanothername/file'), True) - shutil.rmtree('tests/actionsapitests/adirectory/withanothername') - - def testShelltoolsCanAccessFile(self): - from pisi.actionsapi.shelltools import can_access_file - - self.assert_(can_access_file('tests/actionsapitests/file')) - self.assert_(not can_access_file('tests/actionsapitests/fileX')) - self.assert_(can_access_file('tests/actionsapitests/linktoafile')) - - def testShelltoolsCanAccessDir(self): - from pisi.actionsapi.shelltools import can_access_directory - - self.assert_(can_access_directory('tests/actionsapitests/adirectory')) - self.assert_(not can_access_directory('tests/actionsapitests/adirectoryX')) - self.assert_(can_access_directory('tests/actionsapitests/linktoadirectory')) - - - def testShelltoolsMakedirs(self): - from pisi.actionsapi.shelltools import makedirs - - makedirs('tests/actionsapitests/testdirectory/into/a/directory') - self.assertEqual(os.path.exists('tests/actionsapitests/testdirectory/into/a/directory'), True) - shutil.rmtree('tests/actionsapitests/testdirectory') - - def testShelltoolsEcho(self): - from pisi.actionsapi.shelltools import echo - - echo('tests/actionsapitests/echo-file', 'hububat fiyatları') - self.assertEqual(os.path.exists('tests/actionsapitests/echo-file'), True) - self.assertEqual(open('tests/actionsapitests/echo-file').readlines()[0].strip(), "hububat fiyatları") - echo('tests/actionsapitests/echo-file', 'fiyat hububatları') - self.assertEqual(open('tests/actionsapitests/echo-file').readlines()[1].strip(), "fiyat hububatları") - os.remove('tests/actionsapitests/echo-file') - - - def testShelltoolsSystem(self): - from pisi.actionsapi.shelltools import system as s - - self.assertEqual(os.path.exists('tests/actionsapitests/systest'), False) - s('touch tests/actionsapitests/systest') - self.assertEqual(os.path.exists('tests/actionsapitests/systest'), True) - os.remove('tests/actionsapitests/systest') - - - -suite = unittest.makeSuite(ActionsAPITestCase) diff --git a/tags/pisi-1.1_rc10/tests/actionsapitests/brokenlink b/tags/pisi-1.1_rc10/tests/actionsapitests/brokenlink deleted file mode 120000 index 8f608d48..00000000 --- a/tags/pisi-1.1_rc10/tests/actionsapitests/brokenlink +++ /dev/null @@ -1 +0,0 @@ -/no/such/place \ No newline at end of file diff --git a/tags/pisi-1.1_rc10/tests/actionsapitests/file b/tags/pisi-1.1_rc10/tests/actionsapitests/file deleted file mode 100644 index 2c435ef3..00000000 --- a/tags/pisi-1.1_rc10/tests/actionsapitests/file +++ /dev/null @@ -1,6 +0,0 @@ -toplam 4 -drwxr-xr-x 2 meren users 4096 Mar 10 12:55 adirectory -lrwxrwxrwx 1 meren users 14 Mar 10 12:41 brokenlink -> /no/such/place --rw-r--r-- 1 meren users 0 Mar 10 12:57 file -lrwxrwxrwx 1 meren users 4 Mar 10 12:42 linktoadirectory -> /etc -lrwxrwxrwx 1 meren users 11 Mar 10 12:42 linktoafile -> /etc/passwd diff --git a/tags/pisi-1.1_rc10/tests/actionsapitests/linkeddir/file b/tags/pisi-1.1_rc10/tests/actionsapitests/linkeddir/file deleted file mode 100644 index 2c435ef3..00000000 --- a/tags/pisi-1.1_rc10/tests/actionsapitests/linkeddir/file +++ /dev/null @@ -1,6 +0,0 @@ -toplam 4 -drwxr-xr-x 2 meren users 4096 Mar 10 12:55 adirectory -lrwxrwxrwx 1 meren users 14 Mar 10 12:41 brokenlink -> /no/such/place --rw-r--r-- 1 meren users 0 Mar 10 12:57 file -lrwxrwxrwx 1 meren users 4 Mar 10 12:42 linktoadirectory -> /etc -lrwxrwxrwx 1 meren users 11 Mar 10 12:42 linktoafile -> /etc/passwd diff --git a/tags/pisi-1.1_rc10/tests/actionsapitests/linktoadirectory b/tags/pisi-1.1_rc10/tests/actionsapitests/linktoadirectory deleted file mode 120000 index 38d37cf7..00000000 --- a/tags/pisi-1.1_rc10/tests/actionsapitests/linktoadirectory +++ /dev/null @@ -1 +0,0 @@ -linkeddir/ \ No newline at end of file diff --git a/tags/pisi-1.1_rc10/tests/actionsapitests/linktoafile b/tags/pisi-1.1_rc10/tests/actionsapitests/linktoafile deleted file mode 120000 index 1a010b1c..00000000 --- a/tags/pisi-1.1_rc10/tests/actionsapitests/linktoafile +++ /dev/null @@ -1 +0,0 @@ -file \ No newline at end of file diff --git a/tags/pisi-1.1_rc10/tests/archivetests.py b/tags/pisi-1.1_rc10/tests/archivetests.py deleted file mode 100644 index 53e2e2e5..00000000 --- a/tags/pisi-1.1_rc10/tests/archivetests.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os -from os.path import exists as pathexists -from os.path import basename, islink, join - -import pisi.context as ctx -import pisi.api -from pisi import archive -from pisi import sourcearchive -from pisi import fetcher -from pisi import util -from pisi.specfile import SpecFile -from pisi import uri - -import testcase - -class ArchiveFileTestCase(testcase.TestCase): - - def testUnpackTar(self): - spec = SpecFile("tests/popt/pspec.xml") - targetDir = '/tmp/pisitest' - achv = sourcearchive.SourceArchive(spec, targetDir) - - assert spec.source.archive.type == "targz" - - # skip fetching and directly unpack the previously fetched (by - # fetchertests) archive - if not achv.is_cached(interactive=False): - achv.fetch(interactive=False) - achv.unpack() - - # but testing is hard - # "var/tmp/pisi/popt-1.7-3/work" (targetDir) - assert pathexists(targetDir + "/popt-1.7") - - testfile = targetDir + "/popt-1.7/Makefile.am" - assert pathexists(testfile) - - # check file integrity - self.assertEqual(util.sha1_file(testfile), - "5af9dd7d754f788cf511c57ce0af3d555fed009d") - - def testUnpackZip(self): - spec = SpecFile("tests/pccts/pspec.xml") - targetDir = '/tmp/pisitest' - - assert spec.source.archive.type == "zip" - - achv = sourcearchive.SourceArchive(spec, targetDir) - achv.fetch(interactive=False) - achv.unpack(clean_dir=True) - - assert pathexists(targetDir + "/pccts") - - testfile = targetDir + "/pccts/history.txt" - assert pathexists(testfile) - - # check file integrity - self.assertEqual(util.sha1_file(testfile), - "f2be0f9783e84e98fe4e2b8201a8f506fcc07a4d") - -# TODO: no link file in pccts package. Need to find a ZIP file -# containing a symlink - # check for symbolic links -# testfile = targetDir + "/sandbox/testdir/link1" -# assert islink(testfile) - - def testMakeZip(self): - # first unpack our dear sandbox.zip - spec = SpecFile("tests/pccts/pspec.xml") - targetDir = '/tmp/pisitest' - achv = sourcearchive.SourceArchive(spec, targetDir) - achv.fetch(interactive=False) - achv.unpack(clean_dir=True) - del achv - - newZip = targetDir + "/new.zip" - zip = archive.ArchiveZip(newZip, 'zip', 'w') - sourceDir = targetDir + "/pccts" - zip.add_to_archive(sourceDir) - zip.close() - - #TODO: do some more work to test the integrity of new zip file - - def testUnpackZipCond(self): - spec = SpecFile("tests/pccts/pspec.xml") - targetDir = '/tmp' - achv = sourcearchive.SourceArchive(spec, targetDir) - url = uri.URI(spec.source.archive.uri) - filePath = join(ctx.config.archives_dir(), url.filename()) - - # check cached - if util.sha1_file(filePath) != spec.source.archive.sha1sum: - fetch = fetcher.Fetcher(spec.source.archive.uri, targetDir) - fetch.fetch() - assert spec.source.archive.type == "zip" - - achv = archive.Archive(filePath, spec.source.archive.type) - achv.unpack_files(["pccts/history.txt"], targetDir) - assert pathexists(targetDir + "/pccts") - testfile = targetDir + "/pccts/history.txt" - assert pathexists(testfile) - -suite = unittest.makeSuite(ArchiveFileTestCase) diff --git a/tags/pisi-1.1_rc10/tests/autoxmltests.py b/tags/pisi-1.1_rc10/tests/autoxmltests.py deleted file mode 100644 index c24400f5..00000000 --- a/tags/pisi-1.1_rc10/tests/autoxmltests.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os -import xml.dom.minidom as mdom -from xml.parsers.expat import ExpatError -import types - -import pisi -import pisi.api -from pisi.pxml import xmlfile -from pisi.pxml import autoxml -import pisi.util as util - -class AutoXmlTestCase(unittest.TestCase): - - def setUp(self): - - class OtherInfo: - __metaclass__ = autoxml.autoxml - t_BirthDate = [types.StringType, autoxml.mandatory] - t_Interest = [types.StringType, autoxml.optional] - t_CodesWith = [ [types.StringType], autoxml.optional, 'CodesWith/Person'] - - class A(xmlfile.XmlFile): - __metaclass__ = autoxml.autoxml - t_Name = [types.StringType, autoxml.mandatory] - t_Description = [autoxml.LocalText, autoxml.mandatory] - t_Number = [types.IntType, autoxml.optional] - t_Email = [types.StringType, autoxml.optional] - a_href = [types.StringType, autoxml.mandatory] - t_Projects = [ [types.StringType], autoxml.mandatory, 'Project'] - t_OtherInfo = [ OtherInfo, autoxml.optional ] - s_Comment = [ autoxml.Text, autoxml.mandatory] - - self.A = A - - def testDeclaration(self): - self.assertEqual(len(self.A.decoders), 8) # how many fields in A? - self.assert_(hasattr(self.A, 'encode')) - - def testReadWrite(self): - a = self.A() - - # test initializer - self.assertEqual(a.href, None) - - # test read - a.read('tests/a.xml') - self.assert_(a.href.startswith('http')) - self.assertEqual(a.number, 868) - self.assertEqual(a.name, 'Eray Ozkural') - self.assertEqual(len(a.projects), 3) - self.assertEqual(len(a.otherInfo.codesWith), 4) - - self.assert_(not a.errors()) - - a.print_text(file('/tmp/a', 'w')) - la = file('/tmp/a').readlines() - self.assert_( util.any(lambda x:x.find('18071976')!=-1, la) ) - a.write('/tmp/a.xml') - - def testWriteRead(self): - a = self.A() - a.name = "Baris Metin" - a.email = "baris@uludag.org.tr" - a.description['tr'] = u'Melek, melek' - a.comment = u'Bu da zibidi aslinda ama caktirmiyor' - a.href = 'http://cekirdek.uludag.org.tr/~baris' - a.otherInfo.birthDate = '30101979' - a.projects = [ 'pisi', 'tasma', 'plasma' ] - errs = a.errors() - if errs: - self.fail( 'We got a bunch of errors: ' + str(errs)) - a.write('/tmp/a2.xml') - a2 = self.A() - a2.read('/tmp/a2.xml') - self.assertEqual(a, a2) - -class LocalTextTestCase(unittest.TestCase): - - def setUp(self): - a = autoxml.LocalText() - a['tr'] = u'Zibidi' - a['en'] = u'ingiliz hiyarlari ne anlar zibididen' - self.a = a - - def testStr(self): - s = str(self.a) - self.assert_(s!= None and len(s)>=6) - -suite1 = unittest.makeSuite(AutoXmlTestCase) -suite2 = unittest.makeSuite(LocalTextTestCase) -suite = unittest.TestSuite((suite1, suite2)) diff --git a/tags/pisi-1.1_rc10/tests/build.sh b/tags/pisi-1.1_rc10/tests/build.sh deleted file mode 100755 index a1276006..00000000 --- a/tags/pisi-1.1_rc10/tests/build.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/sh - -echo "beta functionality test script" -echo "working directory:" `pwd` -echo "cleaning destination dir: tmp" -PATH=$PATH:. -set -x # xtrace -set -e # errexit -rm -rf tmp -#echo "*** build tests" -pisi-cli -Dtmp build http://svn.uludag.org.tr/pardus/devel/system/base/zip/pspec.xml http://svn.uludag.org.tr/pardus/devel/system/base/unzip/pspec.xml - -#partial-builds -pisi-cli -Dtmp build --until=setup http://svn.uludag.org.tr/pardus/devel/system/base/hdparm/pspec.xml -pisi-cli -Dtmp build --until=build http://svn.uludag.org.tr/pardus/devel/system/base/hdparm/pspec.xml -pisi-cli -Dtmp build --until=install http://svn.uludag.org.tr/pardus/devel/system/base/hdparm/pspec.xml -pisi-cli -Dtmp build --until=package http://svn.uludag.org.tr/pardus/devel/system/base/hdparm/pspec.xml - -#echo "*** repository tests" - -pisi-cli -Dtmp index . -pisi-cli -Dtmp add-repo repo1 pisi-index.xml -pisi-cli -Dtmp update-repo repo1 -pisi-cli -Dtmp list-repo - -#echo "*** package ops" -pisi-cli -Dtmp info *.pisi -# pisi-cli list-available -pisi-cli -Dtmp install --ignore-comar zip -pisi-cli -Dtmp list-installed -pisi-cli -Dtmp remove --ignore-comar unzip -pisi-cli -Dtmp install --ignore-comar zip*.pisi -pisi-cli -Dtmp install --ignore-comar hdparm*.pisi flex*.pisi grep*.pisi -pisi-cli -Dtmp remove-repo repo1 -# pisi-cli list-available - -echo "*** database contents" -for x in `find tmp -iname '*.bdb'`; do - echo "contents of database " $x; - tools/cat-db.py $x; -done diff --git a/tags/pisi-1.1_rc10/tests/buildtests.py b/tags/pisi-1.1_rc10/tests/buildtests.py deleted file mode 100644 index a90e9236..00000000 --- a/tags/pisi-1.1_rc10/tests/buildtests.py +++ /dev/null @@ -1,59 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - - -import unittest -import shutil -import glob -import os - -import testcase -from pisi.build import * - -class BuildTestCase(testcase.TestCase): - - def cleanOutput(self): - for x in glob.glob('tmp/a*.pisi'): - os.unlink(x) - - def setUp(self): - options = pisi.config.Options() - options.ignore_build_no = False - options.output_dir = 'tmp' - self.cleanOutput() - testcase.TestCase.setUp(self, options = options) - pisi.context.config.values.build.buildno = True - - def testBasicBuild(self): - shutil.copy('tests/buildtests/a/actions.py-1', 'tests/buildtests/a/actions.py') - pspec = 'tests/buildtests/a/pspec.xml' - pb = Builder(pspec) - pb.build() - self.assert_(os.path.exists('tmp/a-1.0-1-1.pisi')) - - def testBuildNumber(self): - self.cleanOutput() - self.testBasicBuild() - - pspec = 'tests/buildtests/a/pspec.xml' - shutil.copy('tests/buildtests/a/actions.py-2', 'tests/buildtests/a/actions.py') - pb = Builder(pspec) - pb.build() - self.assert_(os.path.exists('tmp/a-1.0-1-2.pisi')) - - pb = Builder(pspec) - pb.build() - # because nothing is changed - self.assert_(not os.path.exists('tmp/a-1.0-1-3.pisi')) - - os.remove('tests/buildtests/a/actions.py') - os.remove('tmp/a-1.0-1-2.pisi') - -suite = unittest.makeSuite(BuildTestCase) diff --git a/tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-1 b/tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-1 deleted file mode 100644 index 5a87e4b4..00000000 --- a/tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-1 +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. -# -# A. Murat Eren - -from pisi.actionsapi import pisitools - -WorkDir = "merhaba-pisi-1.0" - -def install(): - pisitools.dobin("merhaba-pisi.py") - - pisitools.rename("/usr/bin/merhaba-pisi.py", "merhaba-pisi") - - pisitools.dosym("./merhaba-pisi", "/usr/bin/justasysmlink") - pisitools.dosym("/thre/is/no/such/place", "/usr/bin/justabrokensymlink") diff --git a/tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-2 b/tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-2 deleted file mode 100644 index c8575662..00000000 --- a/tags/pisi-1.1_rc10/tests/buildtests/a/actions.py-2 +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. -# -# A. Murat Eren - -from pisi.actionsapi import pisitools - -WorkDir = "merhaba-pisi-1.0" - -def install(): - pisitools.dobin("merhaba-pisi.py") - - pisitools.rename("/usr/bin/merhaba-pisi.py", "merhaba-pisi") - - pisitools.dosym("./merhaba-pisi", "/usr/bin/justasysmlink") - pisitools.dosym("/thre/is/no/such", "/usr/bin/justabrokensymlink") diff --git a/tags/pisi-1.1_rc10/tests/buildtests/a/pspec.xml b/tags/pisi-1.1_rc10/tests/buildtests/a/pspec.xml deleted file mode 100644 index cb49b179..00000000 --- a/tags/pisi-1.1_rc10/tests/buildtests/a/pspec.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - a - http://cekirdek.uludag.org.tr/~meren/merhaba-pisi.php - - A. Murat Eren - meren@uludag.org.tr - - As-Is - None - app:console - PiSi Hello World Application.. - PiSi için merhaba dünya uygulaması, süper bir konsol uygulaması - Just a basic application. Nothing to describe. - Sadece basit bir uygulama, açıklayacak bir ÅŸey yok - http://cekirdek.uludag.org.tr/~meren/merhaba-pisi-1.0.tar.gz - - - - a - - /usr/bin/ - - - - - - - 2006-02-01 - 1.0 - First release. - A. Murat Eren - meren@uludag.org.tr - - - diff --git a/tags/pisi-1.1_rc10/tests/configfiletests.py b/tags/pisi-1.1_rc10/tests/configfiletests.py deleted file mode 100644 index 5a136693..00000000 --- a/tags/pisi-1.1_rc10/tests/configfiletests.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest - -from pisi.configfile import ConfigurationFile - -# NB: no need for pisi testcase in these things that do well without pisi init -class ConfigFileTestCase(unittest.TestCase): - - def setUp(self): - self.cf = ConfigurationFile("tests/pisi.conf") - - def testSections(self): - cf = self.cf - if not cf.general: - self.fail("No 'general' section found in ConfigurationFile") - if not cf.build: - self.fail("No 'build' section found in ConfigurationFile") - if not cf.dirs: - self.fail("No 'dirs' section found in ConfigurationFile") - - def testValues(self): - cf = self.cf - - # test values from pisi.conf file - self.assertEqual(cf.general.destinationdirectory, "/testing") - self.assertEqual(cf.dirs.archives_dir, "/disk2/pisi/archives") - - # test default values - self.assertEqual(cf.dirs.tmp_dir, "/var/tmp/pisi") - - def testAccessMethods(self): - cf = self.cf - - self.assertEqual(cf.build.host, cf.build["host"]) - self.assertEqual(cf.dirs.index_dir, cf.dirs["index_dir"]) - - def testFlagsExists(self): - cf = self.cf - - #build - self.assert_(cf.build.cflags) - self.assert_(cf.build.cxxflags) - - #general - self.assert_(cf.general.destinationdirectory) - - #dirs - self.assert_(cf.dirs.index_dir) - self.assert_(cf.dirs.tmp_dir) - self.assert_(cf.dirs.packages_dir) - -suite = unittest.makeSuite(ConfigFileTestCase) diff --git a/tags/pisi-1.1_rc10/tests/constantstests.py b/tags/pisi-1.1_rc10/tests/constantstests.py deleted file mode 100644 index 45a61b1c..00000000 --- a/tags/pisi-1.1_rc10/tests/constantstests.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest - -import pisi.context as ctx - -class ContextTestCase(unittest.TestCase): - - def testConstness(self): - const = ctx.const - - # test if we can get a const attribute? - try: - test = const.package_suffix - self.assertNotEqual(test, "") - except AttributeError: - self.fail("Couldn't get const attribute") - - # test binding a new constant - const.test = "test binding" - - # test re-binding (which is illegal) - try: - const.test = "test rebinding" - # we shouldn't reach here - self.fail("Rebinding a constant works. Something is wrong!") - except: - # we achived our goal with this error. infact, this is a - # ConstError but we can't catch it directly here - pass - - # test unbinding (which is also illegal) - try: - del const.test - # we shouldn't reach here - self.fail("Unbinding a constant works. Something is wrong!") - except: - # we achived our goal with this error. infact, this is a - # ConstError but we can't catch it directly here - pass - - def testConstValues(self): - const = ctx.const - - constDict = { - "actions_file": "actions.py", - "setup_func": "setup", - "metadata_xml": "metadata.xml" - } - - for k in constDict.keys(): - if hasattr(const, k): - value = getattr(const, k) - self.assertEqual(value, constDict[k]) - else: - self.fail("Constants does not have an attribute named %s" % k) - - -suite = unittest.makeSuite(ContextTestCase) diff --git a/tags/pisi-1.1_rc10/tests/dependencytests.py b/tags/pisi-1.1_rc10/tests/dependencytests.py deleted file mode 100644 index 029a2d3d..00000000 --- a/tags/pisi-1.1_rc10/tests/dependencytests.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -import unittest -import os - -from pisi.dependency import * - -class DependencyTestCase(unittest.TestCase): - def setUp(self): - pass - - def testVersionFrom(self): - # a real life story bug #603 - gtkmmdep = Dependency() - gtkmmdep.versionFrom = '1.9.1' - gtkmmdep.package = 'atk' - self.assert_( not gtkmmdep.satisfies('atk', '1.8.0', '1') ) - self.assert_( gtkmmdep.satisfies('atk', '1.9.1', '2') ) - self.assert_( gtkmmdep.satisfies('atk', '1.10.5', '3') ) - - def testReleaseFrom(self): - # releaseFrom isn't taken into account #2294 - dep = Dependency() - dep.releaseFrom = '121' - dep.package = 'dbus' - self.assert_(not dep.satisfies('dbus', '1.2', '2')) - - def testReleaseTo(self): - dep = Dependency() - dep.releaseTo = '22' - dep.package = 'dbus' - self.assert_(not dep.satisfies('dbus', '1.2', '25')) - - def testReleaseIs(self): - dep = Dependency() - dep.release = '42' - dep.package = 'dbus' - self.assert_(dep.satisfies('dbus', '1.2', '42')) - -suite = unittest.makeSuite(DependencyTestCase) diff --git a/tags/pisi-1.1_rc10/tests/distribution.xml b/tags/pisi-1.1_rc10/tests/distribution.xml deleted file mode 100644 index ff3f04d6..00000000 --- a/tags/pisi-1.1_rc10/tests/distribution.xml +++ /dev/null @@ -1,6 +0,0 @@ - - Pardus-Devel - 1.1 - Devel - Core - diff --git a/tags/pisi-1.1_rc10/tests/fetchertests.py b/tags/pisi-1.1_rc10/tests/fetchertests.py deleted file mode 100644 index ed7b2f47..00000000 --- a/tags/pisi-1.1_rc10/tests/fetchertests.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import shutil -import os - -import pisi.context as ctx -import pisi.api -from pisi.specfile import SpecFile -from pisi import fetcher -from pisi import util -from pisi import uri - -import testcase -class FetcherTestCase(testcase.TestCase): - def setUp(self): - testcase.TestCase.setUp(self, database = False) - - self.spec = SpecFile() - self.spec.read("tests/helloworld/pspec.xml") - self.url = uri.URI(self.spec.source.archive.uri) - self.destpath = ctx.config.archives_dir() - self.fetch = fetcher.Fetcher(self.url, self.destpath) - - def testFetch(self): - self.fetch.fetch() - fetchedFile = os.path.join(self.destpath, self.url.filename()) - if os.access(fetchedFile, os.R_OK): - self.assertEqual(util.sha1_file(fetchedFile), - self.spec.source.archive.sha1sum) - os.remove(fetchedFile) - - def testResume(self): - resume_test_file = "tests/helloworld/hello-1.3.tar.gz.part" - shutil.copy(resume_test_file, ctx.config.archives_dir()) - self.fetch.fetch() - fetchedFile = os.path.join(self.destpath, self.url.filename()) - if os.access(fetchedFile, os.R_OK): - self.assertEqual(util.sha1_file(fetchedFile), - self.spec.source.archive.sha1sum) - os.remove(fetchedFile) - -suite = unittest.makeSuite(FetcherTestCase) diff --git a/tags/pisi-1.1_rc10/tests/filestests.py b/tags/pisi-1.1_rc10/tests/filestests.py deleted file mode 100644 index c1fd196b..00000000 --- a/tags/pisi-1.1_rc10/tests/filestests.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.context as ctx -import pisi.api -import pisi.installdb -import pisi.files as files -from pisi import util - -import testcase - -class FilesTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self, database=False) - - def testFileInfo(self): - f1 = files.FileInfo(path = '/usr/bin/zibidi') - f2 = files.FileInfo(path = '/usr/bin/kopus', type='exec', size=13, hash="abugubu") - -suite = unittest.makeSuite(FilesTestCase) diff --git a/tags/pisi-1.1_rc10/tests/filetests.py b/tags/pisi-1.1_rc10/tests/filetests.py deleted file mode 100644 index 3ccde2bd..00000000 --- a/tags/pisi-1.1_rc10/tests/filetests.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -from pisi.file import File - -import testcase - -class FileTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self, database = False) - - def testLocalFile(self): - f = File("tests/popt/pspec.xml", File.read) - x = f.readlines() - self.assert_(len(x)>0) - - def testRemoteRead(self): - f = File("http://uludag.org.tr/haberler/rootfs0.2.html", File.read) - x = f.readlines() - self.assert_(len(x)>0) - -suite = unittest.makeSuite(FileTestCase) diff --git a/tags/pisi-1.1_rc10/tests/graphtests.py b/tags/pisi-1.1_rc10/tests/graphtests.py deleted file mode 100644 index 6249fd31..00000000 --- a/tags/pisi-1.1_rc10/tests/graphtests.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -from pisi import graph - -class GraphTestCase(unittest.TestCase): - def setUp(self): - self.g0 = graph.Digraph() - self.g0.from_list([ (1,2), (1,3), (2,3), (3,4), (4, 5), (4,1)]) - - self.g1 = graph.Digraph() - self.g1.from_list([ (0,2), (0,3), (3,4), (2,4), (0,5), (5,4) ]) - - def testCycle(self): - self.assert_(not self.g0.cycle_free()) - self.assert_(self.g1.cycle_free()) - - def testTopologicalSort(self): - order = self.g1.topological_sort() - self.assertEqual(order[0], 0) - self.assertEqual(order[len(order)-1], 4) - -suite = unittest.makeSuite(GraphTestCase) diff --git a/tags/pisi-1.1_rc10/tests/helloworld/actions.py b/tags/pisi-1.1_rc10/tests/helloworld/actions.py deleted file mode 100644 index 410d41ee..00000000 --- a/tags/pisi-1.1_rc10/tests/helloworld/actions.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools -from pisi.actionsapi import libtools -from pisi.actionsapi import get - -WorkDir = "hello-1.3" - -def setup(): - autotools.configure() - -def build(): - autotools.make() - -def install(): - autotools.install() - - '''/opt/helloworld/''' - pisitools.dodir("/opt/helloworld") - - '''/usr/share/doc/helloworld-0.1-1/Makefile.am''' - pisitools.dodoc("Makefile.am") - - '''/opt/helloworld/helloworld''' - pisitools.doexe("src/helloworld", "/opt/helloworld") - - '''/usr/share/info/Makefile.am''' - '''/usr/share/info/Makefile.cvs''' - '''/usr/share/info/Makefile.in''' - pisitools.doinfo("Makefile.*") - - '''/usr/lib/helloworld.o''' - pisitools.dolib("src/helloworld.o") - - '''/opt/hello''' - pisitools.insinto("/opt/", "src/helloworld", "hello") - '''/opt/hi''' - pisitools.insinto("/opt/", "src/helloworld", "hi") - - '''/opt/hello -> /var/hello''' - pisitools.domove("/opt/hello", "/var/") - '''/opt/hi -> /var/goodbye''' - pisitools.domove("/opt/hi", "/var/", "goodbye") - - '''/usr/bin/helloworld''' - pisitools.dobin("src/helloworld") - '''/bin/helloworld''' - pisitools.dobin("src/helloworld", "/bin") - - '''/usr/sbin/helloworld''' - pisitools.dosbin("src/helloworld") - '''/sbin/helloworld''' - pisitools.dosbin("src/helloworld", "/sbin") - - '''Hello, world! -> Goodbye, world!''' - pisitools.dosed("src/helloworld.cpp", "Hello, world!", "Goodbye, world!") - - '''/usr/sbin/goodbye --> helloworld''' - pisitools.dosym("helloworld", "/usr/sbin/goodbye") - '''/usr/bin/goodbye --> helloworld''' - pisitools.dosym("helloworld", "/usr/bin/goodbye") - - '''/home/pardus/''' - pisitools.dodir("/home/pardus") - '''delete pardus''' - pisitools.removeDir("/home/pardus") - '''delete home''' - pisitools.removeDir("/home") - - '''src/helloworld.cpp --> /usr/share/doc/helloworld-0.1-1/goodbyeworld.cpp''' - pisitools.newdoc("src/helloworld.cpp", "goodbyeworld.cpp") - - '''/opt/pardus''' - shelltools.touch("%s/opt/pardus" % get.installDIR()) - - '''/opt/pardus --> /opt/uludag''' - shelltools.copy("%s/opt/pardus" % get.installDIR(), "%s/opt/uludag" % get.installDIR()) - '''/opt/pardus --> /opt/Pardus''' - shelltools.move("%s/opt/pardus" % get.installDIR(), "%s/opt/PARDUS" % get.installDIR()) - - '''/opt/ --> /sys/''' - shelltools.copytree("%s/opt/" % get.installDIR(), "%s/sys/" % get.installDIR()) - - '''delete /sys/helloworld/helloworld''' - shelltools.unlink("%s/sys/helloworld/helloworld" % get.installDIR()) - '''delete /sys/helloworld''' - shelltools.unlinkDir("%s/sys/helloworld" % get.installDIR()) - - '''generate /usr/lib/helloworld.o''' - libtools.gen_usr_ldscript("helloworld.o") diff --git a/tags/pisi-1.1_rc10/tests/helloworld/hello-1.3.tar.gz.part b/tags/pisi-1.1_rc10/tests/helloworld/hello-1.3.tar.gz.part deleted file mode 100644 index 0ecf0493b3b99450f4595dff4a6ea5d129b87d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11520 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 diff --git a/tags/pisi-1.1_rc10/tests/helloworld/pspec.xml b/tags/pisi-1.1_rc10/tests/helloworld/pspec.xml deleted file mode 100644 index 936871f2..00000000 --- a/tags/pisi-1.1_rc10/tests/helloworld/pspec.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - helloworld - http://www.uludag.org.tr - - S.ÇaÄŸlar Onur - caglar@uludag.org.tr - - GPL-2 - category - component - Dummy HelloWorld for testing ActionsAPI - Dummy HelloWorld for testing ActionsAPI - http://cekirdek.uludag.org.tr/~eray/hello-1.3.tar.gz - - - - helloworld - - / - - - - - - 2005-08-21 - 0.1 - - - - diff --git a/tags/pisi-1.1_rc10/tests/installdbtests.py b/tags/pisi-1.1_rc10/tests/installdbtests.py deleted file mode 100644 index ce66809f..00000000 --- a/tags/pisi-1.1_rc10/tests/installdbtests.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.context as ctx -import pisi.api -import pisi.installdb -from pisi import util - -import testcase -class InstallDBTestCase(testcase.TestCase): - - def testRemoveDummy(self): - ctx.installdb.remove('installtest') - self.assert_(not ctx.installdb.is_installed('installtest')) - - def testInstall(self): - ctx.installdb.purge('installtest') - ctx.installdb.install('installtest', '0.1', '2', '3') - self.assert_(ctx.installdb.is_recorded('installtest')) - self.assert_(ctx.installdb.is_installed('installtest')) - - def testRemovePurge(self): - ctx.installdb.install('installtest', '0.1', '2', '3') - self.assert_(ctx.installdb.is_installed('installtest')) - ctx.installdb.remove('installtest') - self.assert_(ctx.installdb.is_removed('installtest')) - ctx.installdb.purge('installtest') - self.assert_(not ctx.installdb.is_recorded('installtest')) - -suite = unittest.makeSuite(InstallDBTestCase) diff --git a/tags/pisi-1.1_rc10/tests/light.sh b/tags/pisi-1.1_rc10/tests/light.sh deleted file mode 100755 index 37d616a4..00000000 --- a/tags/pisi-1.1_rc10/tests/light.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -pwd -PATH=$PATH:. -set -x -rm -rf tmp -mkdir tmp -set -e -pisi-cli -Dtmp -E --ignore-build-no build tests/zip/pspec.xml tests/unzip/pspec.xml -pisi-cli -Dtmp index . -pisi-cli -Dtmp -d add-repo repo1 pisi-index.xml -pisi-cli -Dtmp list-repo -pisi-cli -Dtmp update-repo repo1 -pisi-cli -Dtmp list-available -pisi-cli -Dtmp --ignore-comar -y install zip -pisi-cli -Dtmp list-installed -pisi-cli -Dtmp --ignore-comar -y remove unzip -pisi-cli -Dtmp info zip*.pisi -pisi-cli -d -Dtmp --ignore-comar -y install zip*.pisi -pisi-cli -Dtmp list-pending -pisi-cli -Dtmp configure-pending -pisi-cli -Dtmp remove-repo repo1 -pisi-cli -Dtmp clean diff --git a/tags/pisi-1.1_rc10/tests/metadatatests.py b/tags/pisi-1.1_rc10/tests/metadatatests.py deleted file mode 100644 index b5514f5c..00000000 --- a/tags/pisi-1.1_rc10/tests/metadatatests.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -from pisi import metadata -from pisi import util - -class MetaDataTestCase(unittest.TestCase): - - def testRead(self): - md = metadata.MetaData() - md.read('tests/popt/metadata.xml') - - self.assertEqual(md.package.license, ["As-Is"]) - - self.assertEqual(md.package.version, "1.7") - - self.assertEqual(md.package.installedSize, 149691) - return md - - def testWrite(self): - md = self.testRead() - md.write('/tmp/metadata-test.xml') - - def testVerify(self): - md = self.testRead() - if md.errors(): - self.fail("Couldn't verify!") - - -suite = unittest.makeSuite(MetaDataTestCase) diff --git a/tags/pisi-1.1_rc10/tests/ootests.py b/tags/pisi-1.1_rc10/tests/ootests.py deleted file mode 100644 index 8bbbde3a..00000000 --- a/tags/pisi-1.1_rc10/tests/ootests.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -from pisi import version -from pisi.oo import * - -class OOTestCase(unittest.TestCase): - def setUp(self): - pass - - def testautosuper(self): - class A: - __metaclass__ = autosuper - def meth(self): - return "A" - class B(A): - def meth(self): - return "B" + self.__super.meth() - class C(A): - def meth(self): - return "C" + self.__super.meth() - class D(C, B): - def meth(self): - return "D" + self.__super.meth() - - self.assert_( D().meth() == "DCBA" ) - -suite = unittest.makeSuite(OOTestCase) - diff --git a/tags/pisi-1.1_rc10/tests/packagedbtests.py b/tags/pisi-1.1_rc10/tests/packagedbtests.py deleted file mode 100644 index e140940d..00000000 --- a/tags/pisi-1.1_rc10/tests/packagedbtests.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.context as ctx -import pisi.api -from pisi.packagedb import PackageDB -from pisi import util -from pisi.specfile import SpecFile - -import testcase -class PackageDBTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self) - self.spec = SpecFile() - self.spec.read('tests/popt/pspec.xml') - self.spec.check() - - def testAdd(self): - if not ctx.repodb.has_repo('test'): - ctx.repodb.add_repo('test', pisi.repodb.Repo(pisi.uri.URI('fakerepo.xml')) ) - ctx.packagedb.add_package(self.spec.packages[1], 'test') - self.assert_(ctx.packagedb.has_package('popt-libs')) - # close the database and remove lock - #self.pdb.close() - - def testRemove(self): - ctx.packagedb.remove_package('popt-libs', 'test') - self.assert_(not ctx.packagedb.has_package('popt-libs', 'test')) - -suite = unittest.makeSuite(PackageDBTestCase) diff --git a/tags/pisi-1.1_rc10/tests/packagetests.py b/tags/pisi-1.1_rc10/tests/packagetests.py deleted file mode 100644 index 638223c8..00000000 --- a/tags/pisi-1.1_rc10/tests/packagetests.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -from pisi import util -import pisi.context as ctx -from pisi import package - -import testcase -class PackageTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self) - self.pkgName = util.package_name("testing", - "5.1", - "2", 3) - - def testAddExtract(self): - cur = os.getcwd() - tmpdir = ctx.config.tmp_dir() - testdir = os.path.join(cur, "tests/popt") - - pkg_path = os.path.join(tmpdir, self.pkgName) - pkg = package.Package(pkg_path, "w") - - os.chdir(testdir) - pkg.add_to_package("files.xml") - pkg.add_to_package("metadata.xml") - os.chdir(cur) - - pkg.close() - - pkg = package.Package(pkg_path) - pkg.extract_file("files.xml", cur) - if not os.path.exists("files.xml"): - self.fail("Package extract error") - - os.remove("files.xml") - os.remove(pkg_path) - -suite = unittest.makeSuite(PackageTestCase) diff --git a/tags/pisi-1.1_rc10/tests/pccts/actions.py b/tags/pisi-1.1_rc10/tests/pccts/actions.py deleted file mode 100644 index 50add5ca..00000000 --- a/tags/pisi-1.1_rc10/tests/pccts/actions.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# Timu EREN - -from pisi.actionsapi import autotools -from pisi.actionsapi import get -from pisi.actionsapi import pisitools -from pisi.actionsapi import shelltools - -WorkDir = "pccts" - -def setup(): - shelltools.export("COPT", get.CFLAGS()) - -def build(): -# autotools.make("COPT=%s" % (get.CFLAGS())) - autotools.make() - -def install(): - #autotools.install("") - - pisitools.dobin("bin/antlr") - pisitools.dobin("bin/dlg") - pisitools.dobin("bin/genmk") - pisitools.dobin("bin/sor") - - pisitools.insinto("/usr/include/pccts","h/*.h") - pisitools.insinto("/usr/include/pccts","h/*.c") - pisitools.insinto("/usr/include/pccts","h/*.cpp") - - - pisitools.insinto("/usr/include/pccts/sorcerer","sorcerer/h/*.h") - pisitools.insinto("/usr/include/pccts/sorcerer","sorcerer/h/*.c") - pisitools.insinto("/usr/include/pccts/sorcerer","sorcerer/h/*.cpp") - - - pisitools.insinto("/usr/include/pccts/sorcerer/lib","sorcerer/lib/*.h") - pisitools.insinto("/usr/include/pccts/sorcerer/lib","sorcerer/lib/*.c") - pisitools.insinto("/usr/include/pccts/sorcerer/lib","sorcerer/lib/*.cpp") - - pisitools.dodoc("CHANGES*", "KNOWN_PROBLEMS*", "README", "RIGHTS", "history.txt", "history.ps") - pisitools.dodoc("sorcerer/README", "sorcerer/UPDATES") - - pisitools.doman("dlg/dlg.1", "antlr/antlr.1") diff --git a/tags/pisi-1.1_rc10/tests/pccts/files/pccts-1.33.33-gentoo.diff b/tags/pisi-1.1_rc10/tests/pccts/files/pccts-1.33.33-gentoo.diff deleted file mode 100644 index 1594cd96..00000000 --- a/tags/pisi-1.1_rc10/tests/pccts/files/pccts-1.33.33-gentoo.diff +++ /dev/null @@ -1,69 +0,0 @@ ---- pccts-1.33.33/support/genmk/genmk.c Fri Aug 3 17:12:51 2001 -+++ pccts-1.33.33/support/genmk/genmk-gentoo.c Fri Aug 3 17:12:14 2001 -@@ -7,6 +7,11 @@ - * U of MN - */ - -+/* modified 20010803 by Peter Kadau -+ * for better fhs-compliance -+ * i.e. from "none" to "hmmm soso" ;-) -+ */ -+ - #include - #include - #include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */ -@@ -65,7 +70,7 @@ - static int nondef_comp = 0; /* 1=compiler is non default */ - static char *compilerCCC="CC"; - static char *compilerCC="cc"; --static char *pccts_path="/usr/local/pccts"; -+static char *pccts_path="/usr/include/pccts"; - - #ifdef __STDC__ - void help(void); -@@ -356,7 +361,7 @@ - { "-cfiles",1,pCFiles, "Additional files in C or C++ to compile"}, - { "-sor",0,pSor, "Start of sorcerer group"}, - { "-pccts_path",1,ppccts_path, -- "Path for $PCCTS directory (default is /usr/local/pccts)"}, -+ "Path for $PCCTS directory (default is /usr/include/pccts)"}, - { "-compiler",1,pCompiler, - "Default compiler (default is CC/cc)"}, - { "*", 0,pFile, "" }, /* anything else is a file */ -@@ -495,13 +500,13 @@ - else printf("SCAN = %s%s\n", DIR(), dlg_class); - - printf("PCCTS = %s\n",pccts_path); -- printf("ANTLR_H = $(PCCTS)%sh\n", DirectorySymbol); -+ printf("ANTLR_H = $(PCCTS)\n"); - if (num_sors>0) { -- printf("SOR_H = $(PCCTS)%ssorcerer%sh\n", DirectorySymbol, DirectorySymbol); -+ printf("SOR_H = $(PCCTS)%ssorcerer\n", DirectorySymbol); - printf("SOR_LIB = $(PCCTS)%ssorcerer%slib\n", - DirectorySymbol, DirectorySymbol); - } -- printf("BIN = $(PCCTS)%sbin\n", DirectorySymbol); -+ printf("BIN = %susr%sbin\n", DirectorySymbol, DirectorySymbol); - printf("ANTLR = $(BIN)%santlr\n", DirectorySymbol); - printf("DLG = $(BIN)%sdlg\n", DirectorySymbol); - if (num_sors>0) printf("SOR = $(BIN)%ssor\n", DirectorySymbol); ---- pccts-1.33.33/sorcerer/lib/sorlist.c 1999-06-30 03:15:56.000000000 +0200 -+++ pccts-1.33.33/sorcerer/lib/sorlist.c.new 2003-05-23 11:11:09.000000000 +0200 -@@ -28,6 +28,7 @@ - */ - #include - #include -+#include "pcctscfg.h" - - #ifdef PCCTS_USE_STDARG - #include ---- pccts-1.33.33/sorcerer/lib/sintstack.c 1999-06-30 15:08:06.000000000 +0200 -+++ pccts-1.33.33/sorcerer/lib/sintstack.c.new 2003-05-23 12:54:26.000000000 +0200 -@@ -28,6 +28,7 @@ - */ - #include - #include -+#include "pcctscfg.h" - - #ifdef PCCTS_USE_STDARG - #include diff --git a/tags/pisi-1.1_rc10/tests/pccts/pspec.xml b/tags/pisi-1.1_rc10/tests/pccts/pspec.xml deleted file mode 100644 index 7bbc03eb..00000000 --- a/tags/pisi-1.1_rc10/tests/pccts/pspec.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - pccts - http://www.polhode.com - - Timu EREN - selamtux@gmail.com - - BSD - category - component - Purdue Compiler Construction Tool Set is an embedded C/C++ parser generator - Purdue Compiler Construction Tool Set is an embedded C/C++ parser generator - http://www.polhode.com/pccts133mr33.zip - - pccts-1.33.33-gentoo.diff - - - unzip - patch - - - - pccts - - /usr/include - /usr/share/doc - /usr/bin - /usr/share/man - - - - - - 2005-09-16 - 1.33.33 - - - - diff --git a/tags/pisi-1.1_rc10/tests/pisi.conf b/tags/pisi-1.1_rc10/tests/pisi.conf deleted file mode 100644 index 560e8567..00000000 --- a/tags/pisi-1.1_rc10/tests/pisi.conf +++ /dev/null @@ -1,6 +0,0 @@ -[general] -destinationdirectory = /testing - -[directories] -archives_dir = /disk2/pisi/archives - diff --git a/tags/pisi-1.1_rc10/tests/popt/actions.py b/tags/pisi-1.1_rc10/tests/popt/actions.py deleted file mode 100644 index c8fc6046..00000000 --- a/tags/pisi-1.1_rc10/tests/popt/actions.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -from pisi.actionsapi import autotools - -WorkDir='popt-1.7' - -def setup(): - autotools.configure( '--with-nls' ) - -def build(): - autotools.make() - -def install(): - autotools.install() diff --git a/tags/pisi-1.1_rc10/tests/popt/files.xml b/tags/pisi-1.1_rc10/tests/popt/files.xml deleted file mode 100644 index 34564b0c..00000000 --- a/tags/pisi-1.1_rc10/tests/popt/files.xml +++ /dev/null @@ -1,507 +0,0 @@ - - - - - usr/share/locale/es/LC_MESSAGES/popt.mo - - - localedata - - - 1593 - - - 29481dbd4051e5c6a0f000436664ba00e47572ae - - - - - usr/share/locale/de/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/is/LC_MESSAGES/popt.mo - - - localedata - - - 1793 - - - edbcbb430b122626216ea9f6bba268d5de8454b6 - - - - - usr/lib/libpopt.la - - - sharedLib - - - 699 - - - 04bac6fce89f2c84d4bb1c5adced729f7d312980 - - - - - usr/share/locale/sl/LC_MESSAGES/popt.mo - - - localedata - - - 514 - - - 2031bdefffcf57121e46f3f68f0747fe6b7f1fcc - - - - - usr/share/locale/fr/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/it/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/eu_ES/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/da/LC_MESSAGES/popt.mo - - - localedata - - - 1599 - - - 3ae14880a8bc2cddd9dd0a03861a55d663ac8b0d - - - - - usr/share/locale/ko/LC_MESSAGES/popt.mo - - - localedata - - - 1916 - - - 2079233b9e3284c866e5d17e5aca001f678d4c23 - - - - - usr/share/locale/ja/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/pt/LC_MESSAGES/popt.mo - - - localedata - - - 1870 - - - 7db5d457fa3cc169fea2f747f25ba0353ed5fb69 - - - - - usr/lib/libpopt.so - - - sharedLib - - - 38532 - - - 617c2afa4e79faee954cb95715470f875c044e5a - - - - - usr/share/locale/no/LC_MESSAGES/popt.mo - - - localedata - - - 1800 - - - b33d41a1fbde6b879f0cce06cf2d8395012cc0ec - - - - - usr/lib/libpopt.a - - - sharedLib - - - 36100 - - - f067421ebdb9a68f89c90526feb64a70763c95cf - - - - - usr/share/locale/wa/LC_MESSAGES/popt.mo - - - localedata - - - 517 - - - 92f1f582ae24dbf5631fee1ace8bfc99cb5c1b66 - - - - - usr/share/locale/tr/LC_MESSAGES/popt.mo - - - localedata - - - 1601 - - - 16e3e8e12af497102c75ccbb52edf8d1783545c3 - - - - - usr/share/locale/zh/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/id/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/ro/LC_MESSAGES/popt.mo - - - localedata - - - 1150 - - - 914729e4200d68e5c55d114e6a083c74e692707b - - - - - usr/share/locale/sr/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/hu/LC_MESSAGES/popt.mo - - - localedata - - - 496 - - - 236bf8c1fea44a5a93c6e18e0c88b3dae1762264 - - - - - usr/share/locale/pt_BR/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/sv/LC_MESSAGES/popt.mo - - - localedata - - - 1844 - - - 63517df43bd74c84496441d8894f2b67533c6060 - - - - - usr/lib/libpopt.so.0.0.0 - - - sharedLib - - - 38532 - - - 1f2d3c41ba8e4d6b1c4979225cdf2dd97d4a0aea - - - - - usr/share/locale/ru/LC_MESSAGES/popt.mo - - - localedata - - - 1955 - - - 4742785bd5235eb437922f76a9faa30ec314d09b - - - - - usr/share/locale/zh_CN.GB2312/LC_MESSAGES/popt.mo - - - localedata - - - 468 - - - 5e0a688794619278a452c851a3fc86b50b7f781e - - - - - usr/lib/libpopt.so.0 - - - sharedLib - - - 38532 - - - 617c2afa4e79faee954cb95715470f875c044e5a - - - - - usr/include/popt.h - - - header - - - 15982 - - - 091692391fd1c539b19298f30e8ae074e3210459 - - - - - usr/share/locale/sk/LC_MESSAGES/popt.mo - - - localedata - - - 510 - - - f7e081a22577eb5429809b7ce999b8b1e2b1f9b3 - - - - - usr/share/locale/pl/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - - - usr/share/locale/uk/LC_MESSAGES/popt.mo - - - localedata - - - 504 - - - f91c695161926679401201fdaf3edcef4664f6ca - - - - - usr/share/locale/cs/LC_MESSAGES/popt.mo - - - localedata - - - 1806 - - - 920f5b99199361f1d169430bf13d2bfac1a02fab - - - - - usr/share/man/man3/popt.3 - - - doc - - - 31011 - - - 5c0014442b4ef38d71733c952884573071978328 - - - - - usr/share/locale/gl/LC_MESSAGES/popt.mo - - - localedata - - - 1636 - - - 8486430a6ecbb006b5d374cbcb109e8303c7d5f8 - - - - - usr/share/locale/fi/LC_MESSAGES/popt.mo - - - localedata - - - 345 - - - 6ceb513b02af4f612a20b49e5d615c158fdcee31 - - - diff --git a/tags/pisi-1.1_rc10/tests/popt/files/popt-1.7-uclibc.patch.gz b/tags/pisi-1.1_rc10/tests/popt/files/popt-1.7-uclibc.patch.gz deleted file mode 100644 index 83bbae58fcb13d6d70a3f408cf7ee02484e4e350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmV->1BCn^iwFqvtfoQ$18{F}bS*J1H!XEzY-wU+E^uLVV`u>FR&8(FHW2zerCsUIZ}hwCI-FQRW;pF9CSNtUP6Q}EmxMS!|e$o9RzlkH?Y003?%vuoK9c1?0o za#GQqV5H%uadP^OvqC|DN!vf088tab{siTB7UAq{-~kN0EjGhU<05LR$@ zMJnDDDobl>454LtFnd4>?S;d3fjt)(1|WH}HCb1b$iX=f^6c_ALf|6|FD}4;20ni7 zG_UV=et{t4*MV%y@(h}SOV_r=JpOsQ1aC2)C%B?27dFO^@J3Txn1xvScJYg z4h_pQJcE%5{@VOBoA|Rnv(4CwoAEH%L>6=t2O~VR?(kj7r>j+HnS$$L8YlNKCEH6{ z;i;hditBXr`-`{1r8R*v!=o7W9JrSO*IXN+Bx&|FPu;fFO3pKc+mc%IT)a=Ey3_U! zy$WqK)q8>oa6?SZSvneiK&@4L8h+5cZ&)2Hrp!to`S8yZB61LoR99e_BMR#=r$nPV>&U4FA&+(EVFr(5sa%qvX z9{Po9_!{Y63k1uxstydA0+kt5bdSk4)|1w?R<#zi=@Kib#(rfSLpI8C!lZj{I^1(( zT1>h%LhkGxh3@{}5)wK>I+(9GdeU1uf}ZrV!aJT7N7OW}RK{xWp{D=kG^eaojFz)1 z`TjT$SN}fF4;T-g=h1SpvV*B#{||#{9z{z#nB4j}m>vhy<6!!Vn(m=D54(rnJWd`T RdJlT&{R522x}2U1004y>xIO>? diff --git a/tags/pisi-1.1_rc10/tests/popt/metadata.xml b/tags/pisi-1.1_rc10/tests/popt/metadata.xml deleted file mode 100644 index 286dfe84..00000000 --- a/tags/pisi-1.1_rc10/tests/popt/metadata.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - popt - - - - Kırmızı kafalar - - - hotmail@redhat.com - - - - - - popt-libs - - - Command line option parsing library - - - library files for popt - - - As-Is - - - library:util:optparser - - - rpm:archive - - - - gettext - - - - - /usr/lib - - - /usr/share/doc - - - /usr/share/man - - - /usr/share/locale - - - /usr/include/popt.h - - - - - 2005-06-14 - 1.7 - - - 2005-06-10 - 1.7 - - - 2005-05-05 - 1.7 - - - - 0 - - - Pardus - - - 0.1 - - - Any - - - 149691 - - - diff --git a/tags/pisi-1.1_rc10/tests/popt/pspec.xml b/tags/pisi-1.1_rc10/tests/popt/pspec.xml deleted file mode 100644 index f74769e1..00000000 --- a/tags/pisi-1.1_rc10/tests/popt/pspec.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - popt - http://www.rpm.org/ - - Kırmızı kafalar - hotmail@redhat.com - - as-is - app:console - system.base - Popt command line option parser - Command line option parsing library. - While it is similiar to getopt(3), it contains a number of enhancements, including: - - 1) popt is fully reentrant - 2) popt can parse arbitrary argv[] style arrays while - getopt(2) makes this quite difficult - 3) popt allows users to alias command line arguments - 4) popt provides convience functions for parsing strings - into argv[] style arrays - - ftp://ftp.pardus.org.tr/pub/pisi/source/popt-1.7.tar.gz - - popt-1.7-uclibc.patch.gz - - - make - - - - - popt - library files for popt - Command line option parsing library - Komut satırı seçenekleri iÅŸleme kütüphanesi - - gettext - - - /usr/lib - /usr/share/doc - /usr/share/man - /usr/share/locale - /usr/include/popt.h - - - - - popt-libs - Command line option parsing library - Komut satırı seçenekleri iÅŸleme kütüphanesi - - gettext - - library files for popt - - /usr/lib - /usr/share/doc - /usr/share/man - /usr/share/locale - /usr/include/popt.h - - - acpid.rc6 - - - - - - 2005-06-14 - 1.7 - First release. - Kırmızı kafalar - hotmail@redhat.com - - - diff --git a/tags/pisi-1.1_rc10/tests/remoterepo.sh b/tags/pisi-1.1_rc10/tests/remoterepo.sh deleted file mode 100755 index 1459ddd1..00000000 --- a/tags/pisi-1.1_rc10/tests/remoterepo.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -export PATH=$PATH:. -set -x # xtrace -set -e # errexit - -echo "beta functionality test script for testing remote repos" -echo "working directory:" `pwd` -echo "cleaning destination dir: tmp" -rm -rf tmp -#echo "*** repository tests" -pisi-cli -Dtmp add-repo pardus http://paketler.uludag.org.tr/pardus-1-test/pisi-index.xml -pisi-cli -Dtmp update-repo pardus -pisi-cli -Dtmp list-repo - -#echo "*** package ops" -pisi-cli -Dtmp list-available -pisi-cli -Dtmp info python -pisi-cli -Dtmp -By install python - -echo "*** database contents" -for x in `find tmp -iname '*.bdb'`; do - echo "contents of database " $x; - tools/cat-db.py $x; -done diff --git a/tags/pisi-1.1_rc10/tests/repodbtests.py b/tags/pisi-1.1_rc10/tests/repodbtests.py deleted file mode 100644 index 04f352e7..00000000 --- a/tags/pisi-1.1_rc10/tests/repodbtests.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.context as ctx -import pisi.api -import pisi.installdb -from pisi import util - -import testcase -class RepoDBTestCase(testcase.TestCase): - - def testAddRemoveCycle(self): - # written by cartman the celebrity, for bug #1909 - - for i in range(2): - print '\nTest %d\n' % (i) - pisi.api.add_repo("foo","bar") - pisi.api.remove_repo("foo") - -suite = unittest.makeSuite(RepoDBTestCase) diff --git a/tags/pisi-1.1_rc10/tests/run.py b/tags/pisi-1.1_rc10/tests/run.py deleted file mode 100755 index 65ca4207..00000000 --- a/tags/pisi-1.1_rc10/tests/run.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import sys -import os -import locale - -sys.path.insert(0, '.') -sys.path.insert(0, '..') - -import pisi.api -import pisi.context as ctx - -def run_test_suite(testsuite): - unittest.TextTestRunner(verbosity=2).run(testsuite) - if ctx.initialized: - pisi.api.finalize() - -def run_all(): - - print '** Running all tests' - #testsuite = unittest.TestSuite() - for root, dirs, files in os.walk('tests'): - testsources = filter(lambda x:x.endswith('tests.py'), files) - for testsource in testsources: - module = __import__(testsource[:len(testsource)-3]) - print '\n* Running tests in', testsource - run_test_suite(module.suite) - -if __name__ == "__main__": - - locale.setlocale(locale.LC_ALL, '') - args = sys.argv - if len(args) > 1: # run modules given from the command line - tests = sys.argv[1:] - for test in tests: - test += 'tests' - module = __import__(test) - print "* Running tests in", test - run_test_suite(module.suite) - else: # run all tests - run_all() diff --git a/tags/pisi-1.1_rc10/tests/searchtests.py b/tags/pisi-1.1_rc10/tests/searchtests.py deleted file mode 100644 index e39829b9..00000000 --- a/tags/pisi-1.1_rc10/tests/searchtests.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.search -import pisi.lockeddbshelve - -import testcase - -class SearchTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self, database = True) - - def testSearch(self): - doc1 = "A set object is an unordered collection of immutable values." - doc2 = "Being an unordered collection, sets do not record element position or order of insertion." - doc3 = "There are currently two builtin set types, set and frozenset" - pisi.search.init(['test'], ['en']) - pisi.search.add_doc('test', 'en', 1, doc1, repo = pisi.itembyrepodb.installed) - pisi.search.add_doc('test', 'en', 2, doc2, repo = pisi.itembyrepodb.installed) - pisi.search.add_doc('test', 'en', 3, doc3, repo = pisi.itembyrepodb.installed) - q1 = pisi.search.query('test', 'en', ['set'], repo = pisi.itembyrepodb.all) - self.assertEqual(q1, set([1,3])) - q2 = pisi.search.query('test', 'en', ['an', 'collection'], repo = pisi.itembyrepodb.all) - self.assertEqual(q2, set([1,2])) - pisi.search.finalize() - -suite = unittest.makeSuite(SearchTestCase) diff --git a/tags/pisi-1.1_rc10/tests/sourcedbtests.py b/tags/pisi-1.1_rc10/tests/sourcedbtests.py deleted file mode 100644 index 7a14c186..00000000 --- a/tags/pisi-1.1_rc10/tests/sourcedbtests.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.context as ctx -import pisi.api -import pisi.sourcedb -from pisi import util -from pisi.specfile import SpecFile - -import testcase -class SourceDBTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self) - - self.sourcedb = pisi.sourcedb.init() - self.spec = SpecFile() - self.spec.read("tests/popt/pspec.xml") - if not ctx.repodb.has_repo('test'): - ctx.repodb.add_repo('test', pisi.repodb.Repo(pisi.uri.URI('fakerepo.xml')) ) - - def testAddRemove(self): - self.sourcedb.add_spec(self.spec, 'test') - self.assert_(self.sourcedb.has_spec("popt")) - self.sourcedb.remove_spec("popt", 'test') - self.assert_(not self.sourcedb.has_spec("popt")) - -suite = unittest.makeSuite(SourceDBTestCase) diff --git a/tags/pisi-1.1_rc10/tests/specfiletests.py b/tags/pisi-1.1_rc10/tests/specfiletests.py deleted file mode 100644 index 5e5ff46f..00000000 --- a/tags/pisi-1.1_rc10/tests/specfiletests.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi.specfile as specfile -import pisi.util as util - -class SpecFileNewTestCase(unittest.TestCase): - - def setUp(self): - self.spec = specfile.SpecFile() - self.spec.read("tests/popt/pspec.xml") - - def testFields(self): - self.assertEqual(self.spec.source.name, "popt") - - self.assertEqual(self.spec.source.version, "1.7") - - self.assertEqual(self.spec.source.release, "1") - - self.assertEqual(self.spec.source.archive.sha1sum, - "66f3c77b87a160951b180447f4a6dce68ad2f71b") - - patches = self.spec.source.patches - self.assertEqual(len(patches), 1) - patch = patches[0] #get first and the only patch - self.assertEqual(patch.filename, "popt-1.7-uclibc.patch.gz") - self.assertEqual(patch.compressionType, "gz") - - packages = self.spec.packages - self.assertEqual(len(packages), 2) - package = packages[1] - self.assertEqual(package.name, "popt-libs") - - # search for a path in package.paths - pn = "/usr/lib" - matched = [p for p in package.files if p.path == pn] - if not matched: - self.fail("Failed to match pathname: %s" %pn) - - def testIsAPartOf(self): - # test existence in Source - if not "app:console" in self.spec.source.isA: - self.fail("Failed to match IsA in Source") - if not isinstance(self.spec.source.isA, list): - self.fail("source.isA is not a list, but it must be...") - - if "system.base" != self.spec.source.partOf: - self.fail("Failed to match PartOf in Source") - - # test existence in Package - pkg = self.spec.packages[0] - if not "app:console" in pkg.isA: - self.fail("Failed to match IsA in Package") - if not isinstance(pkg.isA, list): - self.fail("source.isA is not a list, but it must be...") - - if "system.base" != pkg.partOf: - self.fail("Failed to match PartOf in Package") - - def testVerify(self): - if self.spec.errors(): - self.fail("Failed to verify specfile") - - def testCopy(self): - self.spec.read("tests/popt/pspec.xml") - self.spec.write('/tmp/popt-copy.pspec.xml') - -suite = unittest.makeSuite(SpecFileNewTestCase) diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/actions.py b/tags/pisi-1.1_rc10/tests/stress/comp/ab/actions.py deleted file mode 100644 index 43687b2e..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright © 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools - -WorkDir = "bc-1.06" - -def setup(): - autotools.configure("--with-readline") - -def build(): - autotools.make() - -def install(): - pisitools.dobin("bc/bc") - pisitools.dobin("dc/dc") - pisitools.doman("man/*.1") - pisitools.doinfo("doc/*.info") - pisitools.dodoc("AUTHORS", "FAQ", "NEWS", "README", "ChangeLog") diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/comar/package.py b/tags/pisi-1.1_rc10/tests/stress/comp/ab/comar/package.py deleted file mode 100644 index b38b1bbf..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/comar/package.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/python - -import os - -def postInstall(): - os.system("ls -al > /tmp/SIK") diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-info-fix.diff b/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-info-fix.diff deleted file mode 100644 index e70736c0..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-info-fix.diff +++ /dev/null @@ -1,101 +0,0 @@ -diff -r -C2 bc-1.06.orig/doc/bc.texi bc-1.06/doc/bc.texi -*** bc-1.06.orig/doc/bc.texi Wed Sep 27 20:22:24 2000 ---- bc-1.06/doc/bc.texi Fri Aug 3 16:44:49 2001 -*************** -*** 14,29 **** - @c end tex - -! @titlepage -! @title @command{bc} -! @subtitle an arbitrary precision calculator language -! @subtitle version 1.06 -! -! @author Philip A. Nelson -! @page - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! @sp4 - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ---- 14,26 ---- - @c end tex - -! @ifinfo -! @direntry -! * bc: (bc). An arbitrary precision calculator language. -! @end direntry - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -*************** -*** 33,42 **** - are preserved on all copies. - -! @iftex - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end iftex - - Permission is granted to copy and distribute modified versions of this ---- 30,39 ---- - are preserved on all copies. - -! @ignore - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end ignore - - Permission is granted to copy and distribute modified versions of this -*************** -*** 49,52 **** ---- 46,59 ---- - except that this permission notice may be stated in a translation approved - by the Foundation. -+ @end ifinfo -+ -+ @titlepage -+ @title @command{bc} -+ @subtitle an arbitrary precision calculator language -+ @subtitle version 1.06 -+ -+ @author Philip A. Nelson -+ @page -+ - - You may contact the author by: -diff -r -C2 bc-1.06.orig/doc/dc.texi bc-1.06/doc/dc.texi -*** bc-1.06.orig/doc/dc.texi Thu Aug 31 11:57:43 2000 ---- bc-1.06/doc/dc.texi Fri Aug 3 16:42:34 2001 -*************** -*** 42,47 **** - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -- - @end ignore - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire ---- 42,47 ---- - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). - @end ignore -+ - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire -*************** -*** 86,90 **** - - @end titlepage -- @page - - @node Top, Introduction, (dir), (dir) ---- 86,89 ---- diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-longopts.patch b/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-longopts.patch deleted file mode 100644 index f450e3fa..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-longopts.patch +++ /dev/null @@ -1,28 +0,0 @@ -a bug in the argument processing of 'bc' (v1.06) prevents it from properly -reading long-format options. - -patch by joe bruin - -http://bugs.gentoo.org/show_bug.cgi?id=51525 - ---- bc-1.06.orig/bc/main.c -+++ bc-1.06/bc/main.c -@@ -63,7 +63,7 @@ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", -- " -l --mathlib use the predefine math routnes\n", -+ " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", -@@ -93,6 +93,9 @@ - - switch (optch) - { -+ case 0: /* Long option setting a var. */ -+ break; -+ - case 'c': /* compile only */ - compile_only = TRUE; - break; diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-readline42.diff b/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-readline42.diff deleted file mode 100644 index 97856d58..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-readline42.diff +++ /dev/null @@ -1,12 +0,0 @@ -this lets bc use readline-4.2, borrowed from redhat apparently. :) - ---- bc-1.06/bc/scan.l.sux Fri May 11 14:27:20 2001 -+++ bc-1.06/bc/scan.l Fri May 11 14:27:32 2001 -@@ -143,7 +143,6 @@ - - /* Definitions for readline access. */ - extern FILE *rl_instream; --_PROTOTYPE(char *readline, (char *)); - - /* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-static-save.patch b/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-static-save.patch deleted file mode 100644 index 0ee543b2..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/files/bc-1.06-static-save.patch +++ /dev/null @@ -1,16 +0,0 @@ -ripped from fedora ! - ---- bc-1.06/bc/load.c.s390 Wed Sep 13 20:22:38 2000 -+++ bc-1.06/bc/load.c Wed Sep 5 16:10:18 2001 -@@ -156,7 +156,10 @@ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; -- program_counter save_adr; -+ /* Make save_adr static. Otherwise the whole address save stuff doesn't make -+ any sense at all and break e.g. on S390. -+ 09/05/01 Phil Knirsch */ -+ static program_counter save_adr; - - /* Initialize. */ - str = code; diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/ab/pspec.xml b/tags/pisi-1.1_rc10/tests/stress/comp/ab/pspec.xml deleted file mode 100644 index f9782fef..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/ab/pspec.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - ab - http://www.gnu.org/software/bc/bc.htm - - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - GPL-2 - category - Handy console-based calculator utility - Şık görünümlü bir konsol temelli hesap makinesı - Handy console-based calculator utility - Konsolda çalışan şık görünümlü bir hesap makinesı - ftp://ftp.ulak.net.tr/gnu/gnu/bc/bc-1.06.tar.gz - - bc-1.06-info-fix.diff - bc-1.06-longopts.patch - bc-1.06-readline42.diff - bc-1.06-static-save.patch - - - - - ab - - / - - - System.Package - - - - - - 2005-12-18 - 1.06 - First release. - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - - diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/bc/actions.py b/tags/pisi-1.1_rc10/tests/stress/comp/bc/actions.py deleted file mode 100644 index b7978f35..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/bc/actions.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright © 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools - -def setup(): - autotools.configure("--with-readline") - -def build(): - autotools.make() - -def install(): - pisitools.dobin("bc/bc") - pisitools.dobin("dc/dc") - pisitools.doman("man/*.1") - pisitools.doinfo("doc/*.info") - pisitools.dodoc("AUTHORS", "FAQ", "NEWS", "README", "ChangeLog") diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-info-fix.diff b/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-info-fix.diff deleted file mode 100644 index e70736c0..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-info-fix.diff +++ /dev/null @@ -1,101 +0,0 @@ -diff -r -C2 bc-1.06.orig/doc/bc.texi bc-1.06/doc/bc.texi -*** bc-1.06.orig/doc/bc.texi Wed Sep 27 20:22:24 2000 ---- bc-1.06/doc/bc.texi Fri Aug 3 16:44:49 2001 -*************** -*** 14,29 **** - @c end tex - -! @titlepage -! @title @command{bc} -! @subtitle an arbitrary precision calculator language -! @subtitle version 1.06 -! -! @author Philip A. Nelson -! @page - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! @sp4 - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ---- 14,26 ---- - @c end tex - -! @ifinfo -! @direntry -! * bc: (bc). An arbitrary precision calculator language. -! @end direntry - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -*************** -*** 33,42 **** - are preserved on all copies. - -! @iftex - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end iftex - - Permission is granted to copy and distribute modified versions of this ---- 30,39 ---- - are preserved on all copies. - -! @ignore - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end ignore - - Permission is granted to copy and distribute modified versions of this -*************** -*** 49,52 **** ---- 46,59 ---- - except that this permission notice may be stated in a translation approved - by the Foundation. -+ @end ifinfo -+ -+ @titlepage -+ @title @command{bc} -+ @subtitle an arbitrary precision calculator language -+ @subtitle version 1.06 -+ -+ @author Philip A. Nelson -+ @page -+ - - You may contact the author by: -diff -r -C2 bc-1.06.orig/doc/dc.texi bc-1.06/doc/dc.texi -*** bc-1.06.orig/doc/dc.texi Thu Aug 31 11:57:43 2000 ---- bc-1.06/doc/dc.texi Fri Aug 3 16:42:34 2001 -*************** -*** 42,47 **** - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -- - @end ignore - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire ---- 42,47 ---- - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). - @end ignore -+ - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire -*************** -*** 86,90 **** - - @end titlepage -- @page - - @node Top, Introduction, (dir), (dir) ---- 86,89 ---- diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-longopts.patch b/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-longopts.patch deleted file mode 100644 index f450e3fa..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-longopts.patch +++ /dev/null @@ -1,28 +0,0 @@ -a bug in the argument processing of 'bc' (v1.06) prevents it from properly -reading long-format options. - -patch by joe bruin - -http://bugs.gentoo.org/show_bug.cgi?id=51525 - ---- bc-1.06.orig/bc/main.c -+++ bc-1.06/bc/main.c -@@ -63,7 +63,7 @@ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", -- " -l --mathlib use the predefine math routnes\n", -+ " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", -@@ -93,6 +93,9 @@ - - switch (optch) - { -+ case 0: /* Long option setting a var. */ -+ break; -+ - case 'c': /* compile only */ - compile_only = TRUE; - break; diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-readline42.diff b/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-readline42.diff deleted file mode 100644 index 97856d58..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-readline42.diff +++ /dev/null @@ -1,12 +0,0 @@ -this lets bc use readline-4.2, borrowed from redhat apparently. :) - ---- bc-1.06/bc/scan.l.sux Fri May 11 14:27:20 2001 -+++ bc-1.06/bc/scan.l Fri May 11 14:27:32 2001 -@@ -143,7 +143,6 @@ - - /* Definitions for readline access. */ - extern FILE *rl_instream; --_PROTOTYPE(char *readline, (char *)); - - /* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-static-save.patch b/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-static-save.patch deleted file mode 100644 index 0ee543b2..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/bc/files/bc-1.06-static-save.patch +++ /dev/null @@ -1,16 +0,0 @@ -ripped from fedora ! - ---- bc-1.06/bc/load.c.s390 Wed Sep 13 20:22:38 2000 -+++ bc-1.06/bc/load.c Wed Sep 5 16:10:18 2001 -@@ -156,7 +156,10 @@ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; -- program_counter save_adr; -+ /* Make save_adr static. Otherwise the whole address save stuff doesn't make -+ any sense at all and break e.g. on S390. -+ 09/05/01 Phil Knirsch */ -+ static program_counter save_adr; - - /* Initialize. */ - str = code; diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/bc/pspec.xml b/tags/pisi-1.1_rc10/tests/stress/comp/bc/pspec.xml deleted file mode 100644 index bd02bfca..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/bc/pspec.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - bc - http://www.gnu.org/software/bc/bc.htm - - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - GPL-2 - category - Handy console-based calculator utility - Şık görünümlü bir konsol temelli hesap makinesı - Handy console-based calculator utility - Konsolda çalışan şık görünümlü bir hesap makinesı - ftp://ftp.ulak.net.tr/gnu/gnu/bc/bc-1.06.tar.gz - - ab - - - bc-1.06-info-fix.diff - bc-1.06-longopts.patch - bc-1.06-readline42.diff - bc-1.06-static-save.patch - - - - - bc - - ab - - - / - - - - - - 2005-12-18 - 1.06 - First release. - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - - diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/cd/actions.py b/tags/pisi-1.1_rc10/tests/stress/comp/cd/actions.py deleted file mode 100644 index 43687b2e..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/cd/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright © 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools - -WorkDir = "bc-1.06" - -def setup(): - autotools.configure("--with-readline") - -def build(): - autotools.make() - -def install(): - pisitools.dobin("bc/bc") - pisitools.dobin("dc/dc") - pisitools.doman("man/*.1") - pisitools.doinfo("doc/*.info") - pisitools.dodoc("AUTHORS", "FAQ", "NEWS", "README", "ChangeLog") diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-info-fix.diff b/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-info-fix.diff deleted file mode 100644 index e70736c0..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-info-fix.diff +++ /dev/null @@ -1,101 +0,0 @@ -diff -r -C2 bc-1.06.orig/doc/bc.texi bc-1.06/doc/bc.texi -*** bc-1.06.orig/doc/bc.texi Wed Sep 27 20:22:24 2000 ---- bc-1.06/doc/bc.texi Fri Aug 3 16:44:49 2001 -*************** -*** 14,29 **** - @c end tex - -! @titlepage -! @title @command{bc} -! @subtitle an arbitrary precision calculator language -! @subtitle version 1.06 -! -! @author Philip A. Nelson -! @page - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! @sp4 - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ---- 14,26 ---- - @c end tex - -! @ifinfo -! @direntry -! * bc: (bc). An arbitrary precision calculator language. -! @end direntry - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -*************** -*** 33,42 **** - are preserved on all copies. - -! @iftex - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end iftex - - Permission is granted to copy and distribute modified versions of this ---- 30,39 ---- - are preserved on all copies. - -! @ignore - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end ignore - - Permission is granted to copy and distribute modified versions of this -*************** -*** 49,52 **** ---- 46,59 ---- - except that this permission notice may be stated in a translation approved - by the Foundation. -+ @end ifinfo -+ -+ @titlepage -+ @title @command{bc} -+ @subtitle an arbitrary precision calculator language -+ @subtitle version 1.06 -+ -+ @author Philip A. Nelson -+ @page -+ - - You may contact the author by: -diff -r -C2 bc-1.06.orig/doc/dc.texi bc-1.06/doc/dc.texi -*** bc-1.06.orig/doc/dc.texi Thu Aug 31 11:57:43 2000 ---- bc-1.06/doc/dc.texi Fri Aug 3 16:42:34 2001 -*************** -*** 42,47 **** - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -- - @end ignore - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire ---- 42,47 ---- - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). - @end ignore -+ - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire -*************** -*** 86,90 **** - - @end titlepage -- @page - - @node Top, Introduction, (dir), (dir) ---- 86,89 ---- diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-longopts.patch b/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-longopts.patch deleted file mode 100644 index f450e3fa..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-longopts.patch +++ /dev/null @@ -1,28 +0,0 @@ -a bug in the argument processing of 'bc' (v1.06) prevents it from properly -reading long-format options. - -patch by joe bruin - -http://bugs.gentoo.org/show_bug.cgi?id=51525 - ---- bc-1.06.orig/bc/main.c -+++ bc-1.06/bc/main.c -@@ -63,7 +63,7 @@ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", -- " -l --mathlib use the predefine math routnes\n", -+ " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", -@@ -93,6 +93,9 @@ - - switch (optch) - { -+ case 0: /* Long option setting a var. */ -+ break; -+ - case 'c': /* compile only */ - compile_only = TRUE; - break; diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-readline42.diff b/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-readline42.diff deleted file mode 100644 index 97856d58..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-readline42.diff +++ /dev/null @@ -1,12 +0,0 @@ -this lets bc use readline-4.2, borrowed from redhat apparently. :) - ---- bc-1.06/bc/scan.l.sux Fri May 11 14:27:20 2001 -+++ bc-1.06/bc/scan.l Fri May 11 14:27:32 2001 -@@ -143,7 +143,6 @@ - - /* Definitions for readline access. */ - extern FILE *rl_instream; --_PROTOTYPE(char *readline, (char *)); - - /* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-static-save.patch b/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-static-save.patch deleted file mode 100644 index 0ee543b2..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/cd/files/bc-1.06-static-save.patch +++ /dev/null @@ -1,16 +0,0 @@ -ripped from fedora ! - ---- bc-1.06/bc/load.c.s390 Wed Sep 13 20:22:38 2000 -+++ bc-1.06/bc/load.c Wed Sep 5 16:10:18 2001 -@@ -156,7 +156,10 @@ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; -- program_counter save_adr; -+ /* Make save_adr static. Otherwise the whole address save stuff doesn't make -+ any sense at all and break e.g. on S390. -+ 09/05/01 Phil Knirsch */ -+ static program_counter save_adr; - - /* Initialize. */ - str = code; diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/cd/pspec.xml b/tags/pisi-1.1_rc10/tests/stress/comp/cd/pspec.xml deleted file mode 100644 index 904a8cf4..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/cd/pspec.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - cd - http://www.gnu.org/software/bc/bc.htm - - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - GPL-2 - category - Handy console-based calculator utility - Şık görünümlü bir konsol temelli hesap makinesı - Handy console-based calculator utility - Konsolda çalışan şık görünümlü bir hesap makinesı - ftp://ftp.ulak.net.tr/gnu/gnu/bc/bc-1.06.tar.gz - - ab - bc - - - bc-1.06-info-fix.diff - bc-1.06-longopts.patch - bc-1.06-readline42.diff - bc-1.06-static-save.patch - - - - - cd - - ab - bc - - - / - - - - - - 2005-12-18 - 1.06 - First release. - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - - diff --git a/tags/pisi-1.1_rc10/tests/stress/comp/component.xml b/tags/pisi-1.1_rc10/tests/stress/comp/component.xml deleted file mode 100644 index c8511b01..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/comp/component.xml +++ /dev/null @@ -1,6 +0,0 @@ - - test.comp - ... - ... - ... - diff --git a/tags/pisi-1.1_rc10/tests/stress/component.xml b/tags/pisi-1.1_rc10/tests/stress/component.xml deleted file mode 100644 index 4a3a79fb..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/component.xml +++ /dev/null @@ -1,6 +0,0 @@ - - test - ... - ... - ... - diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/component.xml b/tags/pisi-1.1_rc10/tests/stress/lang/component.xml deleted file mode 100644 index 2f75377a..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/component.xml +++ /dev/null @@ -1,6 +0,0 @@ - - test.lang - ... - ... - ... - diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/de/actions.py b/tags/pisi-1.1_rc10/tests/stress/lang/de/actions.py deleted file mode 100644 index 43687b2e..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/de/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright © 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools - -WorkDir = "bc-1.06" - -def setup(): - autotools.configure("--with-readline") - -def build(): - autotools.make() - -def install(): - pisitools.dobin("bc/bc") - pisitools.dobin("dc/dc") - pisitools.doman("man/*.1") - pisitools.doinfo("doc/*.info") - pisitools.dodoc("AUTHORS", "FAQ", "NEWS", "README", "ChangeLog") diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-info-fix.diff b/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-info-fix.diff deleted file mode 100644 index e70736c0..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-info-fix.diff +++ /dev/null @@ -1,101 +0,0 @@ -diff -r -C2 bc-1.06.orig/doc/bc.texi bc-1.06/doc/bc.texi -*** bc-1.06.orig/doc/bc.texi Wed Sep 27 20:22:24 2000 ---- bc-1.06/doc/bc.texi Fri Aug 3 16:44:49 2001 -*************** -*** 14,29 **** - @c end tex - -! @titlepage -! @title @command{bc} -! @subtitle an arbitrary precision calculator language -! @subtitle version 1.06 -! -! @author Philip A. Nelson -! @page - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! @sp4 - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ---- 14,26 ---- - @c end tex - -! @ifinfo -! @direntry -! * bc: (bc). An arbitrary precision calculator language. -! @end direntry - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -*************** -*** 33,42 **** - are preserved on all copies. - -! @iftex - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end iftex - - Permission is granted to copy and distribute modified versions of this ---- 30,39 ---- - are preserved on all copies. - -! @ignore - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end ignore - - Permission is granted to copy and distribute modified versions of this -*************** -*** 49,52 **** ---- 46,59 ---- - except that this permission notice may be stated in a translation approved - by the Foundation. -+ @end ifinfo -+ -+ @titlepage -+ @title @command{bc} -+ @subtitle an arbitrary precision calculator language -+ @subtitle version 1.06 -+ -+ @author Philip A. Nelson -+ @page -+ - - You may contact the author by: -diff -r -C2 bc-1.06.orig/doc/dc.texi bc-1.06/doc/dc.texi -*** bc-1.06.orig/doc/dc.texi Thu Aug 31 11:57:43 2000 ---- bc-1.06/doc/dc.texi Fri Aug 3 16:42:34 2001 -*************** -*** 42,47 **** - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -- - @end ignore - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire ---- 42,47 ---- - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). - @end ignore -+ - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire -*************** -*** 86,90 **** - - @end titlepage -- @page - - @node Top, Introduction, (dir), (dir) ---- 86,89 ---- diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-longopts.patch b/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-longopts.patch deleted file mode 100644 index f450e3fa..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-longopts.patch +++ /dev/null @@ -1,28 +0,0 @@ -a bug in the argument processing of 'bc' (v1.06) prevents it from properly -reading long-format options. - -patch by joe bruin - -http://bugs.gentoo.org/show_bug.cgi?id=51525 - ---- bc-1.06.orig/bc/main.c -+++ bc-1.06/bc/main.c -@@ -63,7 +63,7 @@ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", -- " -l --mathlib use the predefine math routnes\n", -+ " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", -@@ -93,6 +93,9 @@ - - switch (optch) - { -+ case 0: /* Long option setting a var. */ -+ break; -+ - case 'c': /* compile only */ - compile_only = TRUE; - break; diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-readline42.diff b/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-readline42.diff deleted file mode 100644 index 97856d58..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-readline42.diff +++ /dev/null @@ -1,12 +0,0 @@ -this lets bc use readline-4.2, borrowed from redhat apparently. :) - ---- bc-1.06/bc/scan.l.sux Fri May 11 14:27:20 2001 -+++ bc-1.06/bc/scan.l Fri May 11 14:27:32 2001 -@@ -143,7 +143,6 @@ - - /* Definitions for readline access. */ - extern FILE *rl_instream; --_PROTOTYPE(char *readline, (char *)); - - /* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-static-save.patch b/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-static-save.patch deleted file mode 100644 index 0ee543b2..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/de/files/bc-1.06-static-save.patch +++ /dev/null @@ -1,16 +0,0 @@ -ripped from fedora ! - ---- bc-1.06/bc/load.c.s390 Wed Sep 13 20:22:38 2000 -+++ bc-1.06/bc/load.c Wed Sep 5 16:10:18 2001 -@@ -156,7 +156,10 @@ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; -- program_counter save_adr; -+ /* Make save_adr static. Otherwise the whole address save stuff doesn't make -+ any sense at all and break e.g. on S390. -+ 09/05/01 Phil Knirsch */ -+ static program_counter save_adr; - - /* Initialize. */ - str = code; diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/de/pspec.xml b/tags/pisi-1.1_rc10/tests/stress/lang/de/pspec.xml deleted file mode 100644 index a381fd1e..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/de/pspec.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - de - http://www.gnu.org/software/bc/bc.htm - - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - GPL-2 - category - Handy console-based calculator utility - Şık görünümlü bir konsol temelli hesap makinesı - Handy console-based calculator utility - Konsolda çalışan şık görünümlü bir hesap makinesı - ftp://ftp.ulak.net.tr/gnu/gnu/bc/bc-1.06.tar.gz - - cd - - - bc-1.06-info-fix.diff - bc-1.06-longopts.patch - bc-1.06-readline42.diff - bc-1.06-static-save.patch - - - - - de - - ab - - - / - - - - - - 2005-12-18 - 1.06 - First release. - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - - diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/ef/actions.py b/tags/pisi-1.1_rc10/tests/stress/lang/ef/actions.py deleted file mode 100644 index 43687b2e..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/ef/actions.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright © 2005 TUBITAK/UEKAE -# Licensed under the GNU General Public License, version 2. -# See the file http://www.gnu.org/copyleft/gpl.txt. - -from pisi.actionsapi import autotools -from pisi.actionsapi import pisitools - -WorkDir = "bc-1.06" - -def setup(): - autotools.configure("--with-readline") - -def build(): - autotools.make() - -def install(): - pisitools.dobin("bc/bc") - pisitools.dobin("dc/dc") - pisitools.doman("man/*.1") - pisitools.doinfo("doc/*.info") - pisitools.dodoc("AUTHORS", "FAQ", "NEWS", "README", "ChangeLog") diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-info-fix.diff b/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-info-fix.diff deleted file mode 100644 index e70736c0..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-info-fix.diff +++ /dev/null @@ -1,101 +0,0 @@ -diff -r -C2 bc-1.06.orig/doc/bc.texi bc-1.06/doc/bc.texi -*** bc-1.06.orig/doc/bc.texi Wed Sep 27 20:22:24 2000 ---- bc-1.06/doc/bc.texi Fri Aug 3 16:44:49 2001 -*************** -*** 14,29 **** - @c end tex - -! @titlepage -! @title @command{bc} -! @subtitle an arbitrary precision calculator language -! @subtitle version 1.06 -! -! @author Philip A. Nelson -! @page - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! @sp4 - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ---- 14,26 ---- - @c end tex - -! @ifinfo -! @direntry -! * bc: (bc). An arbitrary precision calculator language. -! @end direntry - - This manual documents @command{bc}, an arbitrary precision calculator language. - - This manual is part of GNU @command{bc}.@* -! - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. -*************** -*** 33,42 **** - are preserved on all copies. - -! @iftex - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end iftex - - Permission is granted to copy and distribute modified versions of this ---- 30,39 ---- - are preserved on all copies. - -! @ignore - Permission is granted to process this file through TeX and print the - results, provided the printed document carries copying permission - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -! @end ignore - - Permission is granted to copy and distribute modified versions of this -*************** -*** 49,52 **** ---- 46,59 ---- - except that this permission notice may be stated in a translation approved - by the Foundation. -+ @end ifinfo -+ -+ @titlepage -+ @title @command{bc} -+ @subtitle an arbitrary precision calculator language -+ @subtitle version 1.06 -+ -+ @author Philip A. Nelson -+ @page -+ - - You may contact the author by: -diff -r -C2 bc-1.06.orig/doc/dc.texi bc-1.06/doc/dc.texi -*** bc-1.06.orig/doc/dc.texi Thu Aug 31 11:57:43 2000 ---- bc-1.06/doc/dc.texi Fri Aug 3 16:42:34 2001 -*************** -*** 42,47 **** - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). -- - @end ignore - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire ---- 42,47 ---- - notice identical to this one except for the removal of this paragraph - (this paragraph not being relevant to the printed manual). - @end ignore -+ - Permission is granted to copy and distribute modified versions of this - manual under the conditions for verbatim copying, provided that the entire -*************** -*** 86,90 **** - - @end titlepage -- @page - - @node Top, Introduction, (dir), (dir) ---- 86,89 ---- diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-longopts.patch b/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-longopts.patch deleted file mode 100644 index f450e3fa..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-longopts.patch +++ /dev/null @@ -1,28 +0,0 @@ -a bug in the argument processing of 'bc' (v1.06) prevents it from properly -reading long-format options. - -patch by joe bruin - -http://bugs.gentoo.org/show_bug.cgi?id=51525 - ---- bc-1.06.orig/bc/main.c -+++ bc-1.06/bc/main.c -@@ -63,7 +63,7 @@ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", -- " -l --mathlib use the predefine math routnes\n", -+ " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", -@@ -93,6 +93,9 @@ - - switch (optch) - { -+ case 0: /* Long option setting a var. */ -+ break; -+ - case 'c': /* compile only */ - compile_only = TRUE; - break; diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-readline42.diff b/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-readline42.diff deleted file mode 100644 index 97856d58..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-readline42.diff +++ /dev/null @@ -1,12 +0,0 @@ -this lets bc use readline-4.2, borrowed from redhat apparently. :) - ---- bc-1.06/bc/scan.l.sux Fri May 11 14:27:20 2001 -+++ bc-1.06/bc/scan.l Fri May 11 14:27:32 2001 -@@ -143,7 +143,6 @@ - - /* Definitions for readline access. */ - extern FILE *rl_instream; --_PROTOTYPE(char *readline, (char *)); - - /* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-static-save.patch b/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-static-save.patch deleted file mode 100644 index 0ee543b2..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/ef/files/bc-1.06-static-save.patch +++ /dev/null @@ -1,16 +0,0 @@ -ripped from fedora ! - ---- bc-1.06/bc/load.c.s390 Wed Sep 13 20:22:38 2000 -+++ bc-1.06/bc/load.c Wed Sep 5 16:10:18 2001 -@@ -156,7 +156,10 @@ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; -- program_counter save_adr; -+ /* Make save_adr static. Otherwise the whole address save stuff doesn't make -+ any sense at all and break e.g. on S390. -+ 09/05/01 Phil Knirsch */ -+ static program_counter save_adr; - - /* Initialize. */ - str = code; diff --git a/tags/pisi-1.1_rc10/tests/stress/lang/ef/pspec.xml b/tags/pisi-1.1_rc10/tests/stress/lang/ef/pspec.xml deleted file mode 100644 index d422dd74..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/lang/ef/pspec.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - ef - http://www.gnu.org/software/bc/bc.htm - - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - GPL-2 - category - Handy console-based calculator utility - Şık görünümlü bir konsol temelli hesap makinesı - Handy console-based calculator utility - Konsolda çalışan şık görünümlü bir hesap makinesı - ftp://ftp.ulak.net.tr/gnu/gnu/bc/bc-1.06.tar.gz - - de - - - bc-1.06-info-fix.diff - bc-1.06-longopts.patch - bc-1.06-readline42.diff - bc-1.06-static-save.patch - - - - - ef - - de - - - / - - - - - - 2005-12-18 - 1.06 - First release. - Pardus TestcioÄŸlu - bilgi@uludag.org.tr - - - diff --git a/tags/pisi-1.1_rc10/tests/stress/stress.sh b/tags/pisi-1.1_rc10/tests/stress/stress.sh deleted file mode 100755 index b2eb802a..00000000 --- a/tags/pisi-1.1_rc10/tests/stress/stress.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -rm -rf minime -mkdir minime -rm -f *.pisi - -pisi build comp/ab/pspec.xml -D./minime -pisi it ab-1.06-1.pisi -D./minime - -pisi build comp/bc/pspec.xml -D./minime -pisi it bc-1.06-1.pisi -D./minime - -pisi build comp/cd/pspec.xml -D./minime -pisi it cd-1.06-1.pisi -D./minime - -for i in `seq 1 10` -do - pisi it ab-1.06-1.pisi -D./minime --yes-all -done - -for i in `seq 1 10` -do - pisi remove cd -D./minime - pisi it cd-1.06-1.pisi -D./minime -done - -pisi build lang/de/pspec.xml -D./minime -pisi it de-1.06-1.pisi -D./minime - -pisi build lang/ef/pspec.xml -D./minime -pisi it ef-1.06-1.pisi -D./minime - -pisi rebuild-db -D./minime --yes-all - -pisi remove ab -D./minime --yes-all - -pisi li -D./minime diff --git a/tags/pisi-1.1_rc10/tests/testcase.py b/tags/pisi-1.1_rc10/tests/testcase.py deleted file mode 100644 index d861d4ec..00000000 --- a/tags/pisi-1.1_rc10/tests/testcase.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi -import pisi.api -import pisi.util -import pisi.config - -class TestCase(unittest.TestCase): - - def setUp(self, comar = False, database = True, options = None): - if not options: - options = pisi.config.Options() - options.ignore_build_no = False - options.destdir = 'tmp' - pisi.api.init(options = options, comar = comar, - database = database, write = database) - - def tearDown(self, ): - pisi.api.finalize() diff --git a/tags/pisi-1.1_rc10/tests/unzip/actions.py b/tags/pisi-1.1_rc10/tests/unzip/actions.py deleted file mode 100644 index ed12a90d..00000000 --- a/tags/pisi-1.1_rc10/tests/unzip/actions.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -from pisi.actionsapi import autotools -from pisi.actionsapi import get -from pisi.actionsapi import pisitools - -def setup(): - pisitools.dosed("unix/Makefile", "-O3", get.CFLAGS()) - pisitools.dosed("unix/Makefile", "CC=gcc LD=gcc", "CC=${CC:-gcc} LD=${CC:-gcc}") - pisitools.dosed("unix/Makefile", "-O ", get.CFLAGS()) - pass - -def build(): - autotools.make("-f unix/Makefile linux") - -def install(): - pisitools.insinto("/usr/bin/", "unzip") - pisitools.insinto("/usr/bin/", "funzip") - pisitools.insinto("/usr/bin/", "unzipsfx") - pisitools.insinto("/usr/bin/", "unix/zipgrep") - - pisitools.dosym("/usr/bin/unzip", "/usr/bin/zipinfo") - pisitools.doman("man/*.1") - pisitools.dodoc("BUGS", "History*", "README", "ToDo", "WHERE") diff --git a/tags/pisi-1.1_rc10/tests/unzip/files/unzip-5.50-dotdot.patch b/tags/pisi-1.1_rc10/tests/unzip/files/unzip-5.50-dotdot.patch deleted file mode 100644 index 73441f7b..00000000 --- a/tags/pisi-1.1_rc10/tests/unzip/files/unzip-5.50-dotdot.patch +++ /dev/null @@ -1,85 +0,0 @@ -Only in unzip-5.50-lhh/: cscope.files -Only in unzip-5.50-lhh/: cscope.out -diff -ur unzip-5.50/unix/unix.c unzip-5.50-lhh/unix/unix.c ---- unzip-5.50/unix/unix.c 2002-01-21 17:54:42.000000000 -0500 -+++ unzip-5.50-lhh/unix/unix.c 2003-06-11 18:35:38.000000000 -0400 -@@ -421,7 +421,8 @@ - */ - { - char pathcomp[FILNAMSIZ]; /* path-component buffer */ -- char *pp, *cp=(char *)NULL; /* character pointers */ -+ char *pp, *cp=(char *)NULL, /* character pointers */ -+ *dp=(char *)NULL; - char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ - #ifdef ACORN_FTYPE_NFS - char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ -@@ -429,6 +430,7 @@ - #endif - int quote = FALSE; /* flags */ - int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ -+ int snarf_ddot = FALSE; /* Is set while scanning for "../" */ - int error = MPN_OK; - register unsigned workch; /* hold the character being tested */ - -@@ -467,6 +469,9 @@ - while ((workch = (uch)*cp++) != 0) { - - if (quote) { /* if character quoted, */ -+ if ((pp == pathcomp) && (workch == '.')) -+ /* Oh no you don't... */ -+ goto ddot_hack; - *pp++ = (char)workch; /* include it literally */ - quote = FALSE; - } else -@@ -481,15 +486,44 @@ - break; - - case '.': -- if (pp == pathcomp) { /* nothing appended yet... */ -+ if (pp == pathcomp) { -+ddot_hack: -+ /* nothing appended yet... */ - if (*cp == '/') { /* don't bother appending "./" to */ - ++cp; /* the path: skip behind the '/' */ - break; -- } else if (!uO.ddotflag && *cp == '.' && cp[1] == '/') { -- /* "../" dir traversal detected */ -- cp += 2; /* skip over behind the '/' */ -- killed_ddot = TRUE; /* set "show message" flag */ -- break; -+ } else if (!uO.ddotflag) { -+ -+ /* -+ * SECURITY: Skip past control characters if the user -+ * didn't OK use of absolute pathnames. lhh - this is -+ * a very quick, ugly, inefficient fix. -+ */ -+ dp = cp; -+ do { -+ workch = (uch)(*dp); -+ if (workch == '/' && snarf_ddot) { -+ /* "../" dir traversal detected */ -+ cp = dp + 1; /* skip past the '/' */ -+ killed_ddot = TRUE; /* set "show msg" flag */ -+ break; -+ } else if (workch == '.' && !snarf_ddot) { -+ snarf_ddot = TRUE; -+ } else if (isprint(workch) || -+ ((workch > 127) && (workch <= 254))) { -+ /* -+ * Since we found a printable, non-ctrl char, -+ * we can stop looking for '../', the amount -+ * in ../! -+ */ -+ break; -+ } -+ -+ dp++; -+ } while (*dp != 0); -+ -+ if (killed_ddot) -+ break; - } - } - *pp++ = '.'; -Only in unzip-5.50-lhh/unix: .unix.c.swp diff --git a/tags/pisi-1.1_rc10/tests/unzip/pspec.xml b/tags/pisi-1.1_rc10/tests/unzip/pspec.xml deleted file mode 100644 index ed4188a0..00000000 --- a/tags/pisi-1.1_rc10/tests/unzip/pspec.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - unzip - ftp://ftp.info-zip.org/pub/infozip/UnZip.html - - A. Murat Eren - meren@uludag.org.tr - - Info-ZIP - category - component - Unzipper for pkzip-compressed files - Unzipper for pkzip-compressed files - ftp://ftp.linux.org.tr/pub/mirrors/gentoo/distfiles/unzip550.tar.gz - - unzip-5.50-dotdot.patch - - - libc - sed - patch - - - - - unzip - - - - - /usr/bin - /usr/share/doc - /usr/share/man - - - - - 2005-07-15 - 5.50 - - - - - diff --git a/tags/pisi-1.1_rc10/tests/unzip2/actions.py b/tags/pisi-1.1_rc10/tests/unzip2/actions.py deleted file mode 100644 index 09b91126..00000000 --- a/tags/pisi-1.1_rc10/tests/unzip2/actions.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -from pisi.actionsapi import autotools -from pisi.actionsapi import get -from pisi.actionsapi import pisitools - -WorkDir="unzip-5.50" - -def setup(): - pisitools.dosed("unix/Makefile", "-O3", get.CFLAGS()) - pisitools.dosed("unix/Makefile", "CC=gcc LD=gcc", "CC=${CC:-gcc} LD=${CC:-gcc}") - pisitools.dosed("unix/Makefile", "-O ", get.CFLAGS()) - pass - -def build(): - autotools.make("-f unix/Makefile linux") - -def install(): - pisitools.insinto("/usr/bin/", "unzip") - pisitools.insinto("/usr/bin/", "funzip") - pisitools.insinto("/usr/bin/", "unzipsfx") - pisitools.insinto("/usr/bin/", "unix/zipgrep") - - pisitools.dosym("/usr/bin/unzip", "/usr/bin/zipinfo") - pisitools.doman("man/*.1") - pisitools.dodoc("BUGS", "History*", "README", "ToDo", "WHERE") diff --git a/tags/pisi-1.1_rc10/tests/unzip2/files/unzip-5.50-dotdot.patch b/tags/pisi-1.1_rc10/tests/unzip2/files/unzip-5.50-dotdot.patch deleted file mode 100644 index 73441f7b..00000000 --- a/tags/pisi-1.1_rc10/tests/unzip2/files/unzip-5.50-dotdot.patch +++ /dev/null @@ -1,85 +0,0 @@ -Only in unzip-5.50-lhh/: cscope.files -Only in unzip-5.50-lhh/: cscope.out -diff -ur unzip-5.50/unix/unix.c unzip-5.50-lhh/unix/unix.c ---- unzip-5.50/unix/unix.c 2002-01-21 17:54:42.000000000 -0500 -+++ unzip-5.50-lhh/unix/unix.c 2003-06-11 18:35:38.000000000 -0400 -@@ -421,7 +421,8 @@ - */ - { - char pathcomp[FILNAMSIZ]; /* path-component buffer */ -- char *pp, *cp=(char *)NULL; /* character pointers */ -+ char *pp, *cp=(char *)NULL, /* character pointers */ -+ *dp=(char *)NULL; - char *lastsemi=(char *)NULL; /* pointer to last semi-colon in pathcomp */ - #ifdef ACORN_FTYPE_NFS - char *lastcomma=(char *)NULL; /* pointer to last comma in pathcomp */ -@@ -429,6 +430,7 @@ - #endif - int quote = FALSE; /* flags */ - int killed_ddot = FALSE; /* is set when skipping "../" pathcomp */ -+ int snarf_ddot = FALSE; /* Is set while scanning for "../" */ - int error = MPN_OK; - register unsigned workch; /* hold the character being tested */ - -@@ -467,6 +469,9 @@ - while ((workch = (uch)*cp++) != 0) { - - if (quote) { /* if character quoted, */ -+ if ((pp == pathcomp) && (workch == '.')) -+ /* Oh no you don't... */ -+ goto ddot_hack; - *pp++ = (char)workch; /* include it literally */ - quote = FALSE; - } else -@@ -481,15 +486,44 @@ - break; - - case '.': -- if (pp == pathcomp) { /* nothing appended yet... */ -+ if (pp == pathcomp) { -+ddot_hack: -+ /* nothing appended yet... */ - if (*cp == '/') { /* don't bother appending "./" to */ - ++cp; /* the path: skip behind the '/' */ - break; -- } else if (!uO.ddotflag && *cp == '.' && cp[1] == '/') { -- /* "../" dir traversal detected */ -- cp += 2; /* skip over behind the '/' */ -- killed_ddot = TRUE; /* set "show message" flag */ -- break; -+ } else if (!uO.ddotflag) { -+ -+ /* -+ * SECURITY: Skip past control characters if the user -+ * didn't OK use of absolute pathnames. lhh - this is -+ * a very quick, ugly, inefficient fix. -+ */ -+ dp = cp; -+ do { -+ workch = (uch)(*dp); -+ if (workch == '/' && snarf_ddot) { -+ /* "../" dir traversal detected */ -+ cp = dp + 1; /* skip past the '/' */ -+ killed_ddot = TRUE; /* set "show msg" flag */ -+ break; -+ } else if (workch == '.' && !snarf_ddot) { -+ snarf_ddot = TRUE; -+ } else if (isprint(workch) || -+ ((workch > 127) && (workch <= 254))) { -+ /* -+ * Since we found a printable, non-ctrl char, -+ * we can stop looking for '../', the amount -+ * in ../! -+ */ -+ break; -+ } -+ -+ dp++; -+ } while (*dp != 0); -+ -+ if (killed_ddot) -+ break; - } - } - *pp++ = '.'; -Only in unzip-5.50-lhh/unix: .unix.c.swp diff --git a/tags/pisi-1.1_rc10/tests/unzip2/pspec.xml b/tags/pisi-1.1_rc10/tests/unzip2/pspec.xml deleted file mode 100644 index b8841dcb..00000000 --- a/tags/pisi-1.1_rc10/tests/unzip2/pspec.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - unzip - ftp://ftp.info-zip.org/pub/infozip/UnZip.html - - A. Murat Eren - meren@uludag.org.tr - - Info-ZIP - category - component - Unzipper for pkzip-compressed files - Unzipper for pkzip-compressed files - ftp://ftp.linux.org.tr/pub/mirrors/gentoo/distfiles/unzip550.tar.gz - - unzip-5.50-dotdot.patch - - - libc - sed - patch - - - - - unzip - - - - - /usr/bin - /usr/share/doc - /usr/share/man - - - - - 2005-08-10 - 5.52 - - - - - diff --git a/tags/pisi-1.1_rc10/tests/upgrade.sh b/tags/pisi-1.1_rc10/tests/upgrade.sh deleted file mode 100755 index 6241c301..00000000 --- a/tags/pisi-1.1_rc10/tests/upgrade.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -pwd -PATH=$PATH:. -set -x -e - -pisi-cli -Dtmp -E --ignore-build-no build tests/zip/pspec.xml tests/unzip/pspec.xml -pisi-cli -Dtmp --yes-all --ignore-comar install unzip-5.50-1.pisi zip-2.3-1.pisi - -mkdir -p myrepo -cd myrepo -mkdir -p tmp -../pisi-cli -Dtmp -E --ignore-build-no build ../tests/zip2/pspec.xml ../tests/unzip2/pspec.xml -cd .. -pisi-cli -Dtmp --absolute-uris index myrepo -pisi-cli -Dtmp remove-repo repo1 -pisi-cli -Dtmp add-repo repo1 pisi-index.xml -pisi-cli -Dtmp list-repo -pisi-cli -Dtmp update-repo repo1 -pisi-cli -Dtmp list-available -pisi-cli -Dtmp --install-info list-installed -pisi-cli -Dtmp list-upgrades -pisi-cli -Dtmp --ignore-comar upgrade zip -pisi-cli -Dtmp --install-info list-installed diff --git a/tags/pisi-1.1_rc10/tests/utilfiles/arfilewithtimestamps.a b/tags/pisi-1.1_rc10/tests/utilfiles/arfilewithtimestamps.a deleted file mode 100644 index cf93fc0fd5637ea83a403c67e32c6f3c6a375321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74536 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 diff --git a/tags/pisi-1.1_rc10/tests/utilfiles/directory/file_74536 b/tags/pisi-1.1_rc10/tests/utilfiles/directory/file_74536 deleted file mode 100644 index 9f46a5728cea7129aa9830be9cec7df9cda12ff4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74536 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 -1: - svn_paths.append(os.path.join(root, d)) - continue - continue - return svn_paths - -def move_svn_paths(paths): - [shutil.move(d, '/tmp/' + os.path.dirname(d).replace('/', '_')) for d in paths] - -def restore_svn_paths(paths): - [shutil.move('/tmp/' + os.path.dirname(d).replace('/', '_'), d) for d in paths] - - -class UtilTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self, database = False) - - def testSubPath(self): - self.assert_(subpath('usr', 'usr')) - self.assert_(subpath('usr', 'usr/local/src')) - self.assert_(not subpath('usr/local', 'usr')) - - def testRemovePathPrefix(self): - a = removepathprefix('usr/local', 'usr/local/lib') - self.assertEqual(a, 'lib') - - a = removepathprefix('usr/local/', 'usr/local/lib') - self.assertEqual(a, 'lib') - - def testCleanArTimestamp(self): - shutil.copy('tests/utilfiles/arfilewithtimestamps.a', 'tests/utilfiles/cleanedarfile.a') - clean_ar_timestamps('tests/utilfiles/cleanedarfile.a') - for line in open('tests/utilfiles/cleanedarfile.a').readlines(): - pos = line.rfind(chr(32) + chr(96)) - if pos > -1 and line[pos-57:pos + 2].find(chr(47)) > -1: - self.assertEqual(line[pos-41:pos].split()[0], "0000000000") - - os.remove('tests/utilfiles/cleanedarfile.a') - - def testDirSize(self): - svn_paths = get_svn_paths('tests/utilfiles') - move_svn_paths(svn_paths) - self.assertEqual(dir_size('tests/utilfiles/arfilewithtimestamps.a'), 74536) - self.assertEqual(dir_size('tests/utilfiles/linktonowhere'), 23) - self.assertEqual(dir_size('tests/utilfiles/directory'), 74536) - self.assertEqual(dir_size('tests/utilfiles/linktoarfile'), 22) - self.assertEqual(dir_size('tests/utilfiles/'), 149117) - restore_svn_paths(svn_paths) - - def testGetFileHashes(self): - svn_paths = get_svn_paths('tests/utilfiles') - move_svn_paths(svn_paths) - self.assertEqual(len([x for x in get_file_hashes('tests/utilfiles/')]), 4) - for tpl in get_file_hashes('tests/utilfiles/'): - if os.path.basename(tpl[0]) == 'linktonowhere': - self.assertEqual(tpl[1], '2d3732ababb24b5dd040a192dc72841cb9684d4e') - if os.path.basename(tpl[0]) == 'linktoarfile': - self.assertEqual(tpl[1], '8be108bc4bfb7d18a10da6d6b76060f0409dc7c6') - restore_svn_paths(svn_paths) - -suite = unittest.makeSuite(UtilTestCase) diff --git a/tags/pisi-1.1_rc10/tests/versiontests.py b/tags/pisi-1.1_rc10/tests/versiontests.py deleted file mode 100644 index cae9ef1e..00000000 --- a/tags/pisi-1.1_rc10/tests/versiontests.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -from pisi.version import Version - -class VersionTestCase(unittest.TestCase): - def setUp(self): - pass - - def testSingle(self): - v1 = Version("103") - v2 = Version("90") - self.assert_(v1 > v2) - - def testOpsNumerical(self): - v1 = Version("0.3.1") - v2 = Version("0.3.5") - v3 = Version("1.5.2-4") - v4 = Version("0.3.1-1") - v5 = Version("2.07") - self.assert_(v1 < v2) - self.assert_(v3 > v2) - self.assert_(v1 <= v3) - self.assert_(v4 >= v4) - self.assert_(v5 > v3) - - def testOpsKeywords(self): - # with keywords - v1 = Version("2.23_pre10") - v2 = Version("2.23") - v3 = Version("2.21") - v4 = Version("2.23_p1") - v5 = Version("2.23_beta1") - v6 = Version("2.23_m1") - v7 = Version("2.23_rc1") - v8 = Version("2.23_rc2") - self.assert_(v1 < v2) - self.assert_(v1 > v3) - self.assert_(v1 < v4) - self.assert_(v1 > v5) - self.assert_(v2 < v4) - self.assert_(v2 > v5) - self.assert_(v6 < v4) - self.assert_(v6 > v5) - self.assert_(v7 > v5) - self.assert_(v8 > v7) - - v1 = Version("1.0_alpha1") - v2 = Version("1.0_alpha2") - self.assert_(v2 > v1) - - def testOpsCharacters(self): - # with character - v1 = Version("2.10a") - v2 = Version("2.10") - v3 = Version("2.10d") - self.assert_(v1 > v2) - self.assert_(v1 < v3) - self.assert_(v2 < v3) - - def testGeBug(self): - # bug 603 - v1 = Version('1.8.0') - v2 = Version('1.9.1') - self.assert_( not v1 > v2 ) - self.assert_( not v1 >= v2 ) - -suite = unittest.makeSuite(VersionTestCase) diff --git a/tags/pisi-1.1_rc10/tests/xmlexttests.py b/tags/pisi-1.1_rc10/tests/xmlexttests.py deleted file mode 100644 index 0d5ccb7d..00000000 --- a/tags/pisi-1.1_rc10/tests/xmlexttests.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -import unittest -import os - -import pisi -import pisi.api -import pisi.context as ctx -import pisi.util as util -from pisi.pxml import xmlext - -import testcase - -class XmlExtTestCase(testcase.TestCase): - - def setUp(self): - testcase.TestCase.setUp(self, database=False) - - def testGet(self): - self.doc = xmlext.parse('tests/a.xml') - #self.doc = self.a.documentElement - self.assertEqual(xmlext.getNodeText(self.doc, 'Number'), '868') - self.assertEqual(xmlext.getNodeText(self.doc, 'OtherInfo/BirthDate'), '18071976') - codeswith = xmlext.getAllNodes(self.doc, 'OtherInfo/CodesWith/Person') - self.assertEqual(len(codeswith), 4) - self.assertEqual(xmlext.getNodeText(codeswith[2]), 'Caglar') - - def testAdd(self): - node = xmlext.newDocument('pardus') - #node = a.documentElement - xmlext.addText(node, 'team/coder', 'zibidi1') - xmlext.addText(node, 'team/coder', 'zibidi2') - xmlext.addText(node, 'team/coder', 'zibidi3') - reada = xmlext.getAllNodes(node, 'team/coder') - self.assertEqual(len(reada), 3) - -suite = unittest.makeSuite(XmlExtTestCase) diff --git a/tags/pisi-1.1_rc10/tests/zip/actions.py b/tags/pisi-1.1_rc10/tests/zip/actions.py deleted file mode 100644 index 730924b4..00000000 --- a/tags/pisi-1.1_rc10/tests/zip/actions.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -from pisi.actionsapi import autotools -from pisi.actionsapi import get -from pisi.actionsapi import pisitools - -def setup(): - pisitools.dosed("unix/Makefile", "-O2", get.CFLAGS()) - -def build(): - autotools.make("-f unix/Makefile CC=%s CPP=%s generic" % (get.CC(), get.CXX())) - -def install(): - pisitools.dobin("zip") - pisitools.dobin("zipcloak") - pisitools.dobin("zipnote") - pisitools.dobin("zipsplit") - - pisitools.doman("man/*.1") - pisitools.dodoc("BUGS", "CHANGES", "MANUAL", "README", "TODO", "WHATSNEW", "WHERE") - diff --git a/tags/pisi-1.1_rc10/tests/zip/files/zcrypt.patch b/tags/pisi-1.1_rc10/tests/zip/files/zcrypt.patch deleted file mode 100644 index 6b696af5..00000000 --- a/tags/pisi-1.1_rc10/tests/zip/files/zcrypt.patch +++ /dev/null @@ -1,752 +0,0 @@ -diff -ur zip-2.3.orig/crypt.c zip-2.3/crypt.c ---- zip-2.3.orig/crypt.c 1999-10-09 23:09:26.000000000 +0300 -+++ zip-2.3/crypt.c 2005-07-15 16:19:00.000000000 +0300 -@@ -1,20 +1,577 @@ - /* -- Copyright (c) 1990-1999 Info-ZIP. All rights reserved. -+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - -- See the accompanying file LICENSE, version 1999-Oct-05 or later -+ See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. -- If, for some reason, both of these files are missing, the Info-ZIP license -- also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html -+ If, for some reason, all these files are missing, the Info-ZIP license -+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html - */ - /* -- crypt.c (dummy version) by Info-ZIP. Last revised: 15 Aug 98 -+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] - -- This is a non-functional version of Info-ZIP's crypt.c encryption/ -- decryption code for Zip, ZipCloak, UnZip and fUnZip. This file is -- not copyrighted and may be distributed freely. :-) See the "WHERE" -- file for sites from which to obtain the full encryption/decryption -- sources (zcrypt28.zip or later). -+ The encryption/decryption parts of this source code (as opposed to the -+ non-echoing password parts) were originally written in Europe. The -+ whole source package can be freely distributed, including from the USA. -+ (Prior to January 2000, re-export from the US was a violation of US law.) - */ - -+/* -+ This encryption code is a direct transcription of the algorithm from -+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This -+ file (appnote.txt) is distributed with the PKZIP program (even in the -+ version without encryption capabilities). -+ */ -+ -+#define ZCRYPT_INTERNAL -+#include "zip.h" -+#include "crypt.h" -+#include "ttyio.h" -+ -+#if CRYPT -+ -+#ifndef FALSE -+# define FALSE 0 -+#endif -+ -+#ifdef ZIP -+ /* For the encoding task used in Zip (and ZipCloak), we want to initialize -+ the crypt algorithm with some reasonably unpredictable bytes, see -+ the crypthead() function. The standard rand() library function is -+ used to supply these `random' bytes, which in turn is initialized by -+ a srand() call. The srand() function takes an "unsigned" (at least 16bit) -+ seed value as argument to determine the starting point of the rand() -+ pseudo-random number generator. -+ This seed number is constructed as "Seed = Seed1 .XOR. Seed2" with -+ Seed1 supplied by the current time (= "(unsigned)time()") and Seed2 -+ as some (hopefully) nondeterministic bitmask. On many (most) systems, -+ we use some "process specific" number, as the PID or something similar, -+ but when nothing unpredictable is available, a fixed number may be -+ sufficient. -+ NOTE: -+ 1.) This implementation requires the availability of the following -+ standard UNIX C runtime library functions: time(), rand(), srand(). -+ On systems where some of them are missing, the environment that -+ incorporates the crypt routines must supply suitable replacement -+ functions. -+ 2.) It is a very bad idea to use a second call to time() to set the -+ "Seed2" number! In this case, both "Seed1" and "Seed2" would be -+ (almost) identical, resulting in a (mostly) "zero" constant seed -+ number passed to srand(). -+ -+ The implementation environment defined in the "zip.h" header should -+ supply a reasonable definition for ZCR_SEED2 (an unsigned number; for -+ most implementations of rand() and srand(), only the lower 16 bits are -+ significant!). An example that works on many systems would be -+ "#define ZCR_SEED2 (unsigned)getpid()". -+ The default definition for ZCR_SEED2 supplied below should be regarded -+ as a fallback to allow successful compilation in "beta state" -+ environments. -+ */ -+# include /* time() function supplies first part of crypt seed */ -+ /* "last resort" source for second part of crypt seed pattern */ -+# ifndef ZCR_SEED2 -+# define ZCR_SEED2 (unsigned)3141592654L /* use PI as default pattern */ -+# endif -+# ifdef GLOBAL /* used in Amiga system headers, maybe others too */ -+# undef GLOBAL -+# endif -+# define GLOBAL(g) g -+#else /* !ZIP */ -+# define GLOBAL(g) G.g -+#endif /* ?ZIP */ -+ -+ -+#ifdef UNZIP -+ /* char *key = (char *)NULL; moved to globals.h */ -+# ifndef FUNZIP -+ local int testp OF((__GPRO__ ZCONST uch *h)); -+ local int testkey OF((__GPRO__ ZCONST uch *h, ZCONST char *key)); -+# endif -+#endif /* UNZIP */ -+ -+#ifndef UNZIP /* moved to globals.h for UnZip */ -+ local ulg keys[3]; /* keys defining the pseudo-random sequence */ -+#endif /* !UNZIP */ -+ -+#ifndef Trace -+# ifdef CRYPT_DEBUG -+# define Trace(x) fprintf x -+# else -+# define Trace(x) -+# endif -+#endif -+ -+#ifndef CRC_32_TAB -+# define CRC_32_TAB crc_32_tab -+#endif -+ -+#define CRC32(c, b) (CRC_32_TAB[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8)) -+ -+/*********************************************************************** -+ * Return the next byte in the pseudo-random sequence -+ */ -+int decrypt_byte(__G) -+ __GDEF -+{ -+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an -+ * unpredictable manner on 16-bit systems; not a problem -+ * with any known compiler so far, though */ -+ -+ temp = ((unsigned)GLOBAL(keys[2]) & 0xffff) | 2; -+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); -+} -+ -+/*********************************************************************** -+ * Update the encryption keys with the next byte of plain text -+ */ -+int update_keys(__G__ c) -+ __GDEF -+ int c; /* byte of plain text */ -+{ -+ GLOBAL(keys[0]) = CRC32(GLOBAL(keys[0]), c); -+ GLOBAL(keys[1]) += GLOBAL(keys[0]) & 0xff; -+ GLOBAL(keys[1]) = GLOBAL(keys[1]) * 134775813L + 1; -+ { -+ register int keyshift = (int)(GLOBAL(keys[1]) >> 24); -+ GLOBAL(keys[2]) = CRC32(GLOBAL(keys[2]), keyshift); -+ } -+ return c; -+} -+ -+ -+/*********************************************************************** -+ * Initialize the encryption keys and the random header according to -+ * the given password. -+ */ -+void init_keys(__G__ passwd) -+ __GDEF -+ ZCONST char *passwd; /* password string with which to modify keys */ -+{ -+ GLOBAL(keys[0]) = 305419896L; -+ GLOBAL(keys[1]) = 591751049L; -+ GLOBAL(keys[2]) = 878082192L; -+ while (*passwd != '\0') { -+ update_keys(__G__ (int)*passwd); -+ passwd++; -+ } -+} -+ -+ -+#ifdef ZIP -+ -+/*********************************************************************** -+ * Write encryption header to file zfile using the password passwd -+ * and the cyclic redundancy check crc. -+ */ -+void crypthead(passwd, crc, zfile) -+ ZCONST char *passwd; /* password string */ -+ ulg crc; /* crc of file being encrypted */ -+ FILE *zfile; /* where to write header */ -+{ -+ int n; /* index in random header */ -+ int t; /* temporary */ -+ int c; /* random byte */ -+ int ztemp; /* temporary for zencoded value */ -+ uch header[RAND_HEAD_LEN-2]; /* random header */ -+ static unsigned calls = 0; /* ensure different random header each time */ -+ -+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the -+ * output of rand() to get less predictability, since rand() is -+ * often poorly implemented. -+ */ -+ if (++calls == 1) { -+ srand((unsigned)time(NULL) ^ ZCR_SEED2); -+ } -+ init_keys(passwd); -+ for (n = 0; n < RAND_HEAD_LEN-2; n++) { -+ c = (rand() >> 7) & 0xff; -+ header[n] = (uch)zencode(c, t); -+ } -+ /* Encrypt random header (last two bytes is high word of crc) */ -+ init_keys(passwd); -+ for (n = 0; n < RAND_HEAD_LEN-2; n++) { -+ ztemp = zencode(header[n], t); -+ putc(ztemp, zfile); -+ } -+ ztemp = zencode((int)(crc >> 16) & 0xff, t); -+ putc(ztemp, zfile); -+ ztemp = zencode((int)(crc >> 24) & 0xff, t); -+ putc(ztemp, zfile); -+} -+ -+ -+#ifdef UTIL -+ -+/*********************************************************************** -+ * Encrypt the zip entry described by z from file source to file dest -+ * using the password passwd. Return an error code in the ZE_ class. -+ */ -+int zipcloak(z, source, dest, passwd) -+ struct zlist far *z; /* zip entry to encrypt */ -+ FILE *source, *dest; /* source and destination files */ -+ ZCONST char *passwd; /* password string */ -+{ -+ int c; /* input byte */ -+ int res; /* result code */ -+ ulg n; /* holds offset and counts size */ -+ ush flag; /* previous flags */ -+ int t; /* temporary */ -+ int ztemp; /* temporary storage for zencode value */ -+ -+ /* Set encrypted bit, clear extended local header bit and write local -+ header to output file */ -+ if ((n = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP; -+ z->off = n; -+ flag = z->flg; -+ z->flg |= 1, z->flg &= ~8; -+ z->lflg |= 1, z->lflg &= ~8; -+ z->siz += RAND_HEAD_LEN; -+ if ((res = putlocal(z, dest)) != ZE_OK) return res; -+ -+ /* Initialize keys with password and write random header */ -+ crypthead(passwd, z->crc, dest); -+ -+ /* Skip local header in input file */ -+ if (fseek(source, (long)(4 + LOCHEAD + (ulg)z->nam + (ulg)z->ext), -+ SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ -+ /* Encrypt data */ -+ for (n = z->siz - RAND_HEAD_LEN; n; n--) { -+ if ((c = getc(source)) == EOF) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ ztemp = zencode(c, t); -+ putc(ztemp, dest); -+ } -+ /* Skip extended local header in input file if there is one */ -+ if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ if (fflush(dest) == EOF) return ZE_TEMP; -+ return ZE_OK; -+} -+ -+/*********************************************************************** -+ * Decrypt the zip entry described by z from file source to file dest -+ * using the password passwd. Return an error code in the ZE_ class. -+ */ -+int zipbare(z, source, dest, passwd) -+ struct zlist far *z; /* zip entry to encrypt */ -+ FILE *source, *dest; /* source and destination files */ -+ ZCONST char *passwd; /* password string */ -+{ -+ int c0, c1; /* last two input bytes */ -+ ulg offset; /* used for file offsets */ -+ ulg size; /* size of input data */ -+ int r; /* size of encryption header */ -+ int res; /* return code */ -+ ush flag; /* previous flags */ -+ -+ /* Save position and skip local header in input file */ -+ if ((offset = (ulg)ftell(source)) == (ulg)-1L || -+ fseek(source, (long)(4 + LOCHEAD + (ulg)z->nam + (ulg)z->ext), -+ SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ /* Initialize keys with password */ -+ init_keys(passwd); -+ -+ /* Decrypt encryption header, save last two bytes */ -+ c1 = 0; -+ for (r = RAND_HEAD_LEN; r; r--) { -+ c0 = c1; -+ if ((c1 = getc(source)) == EOF) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ Trace((stdout, " (%02x)", c1)); -+ zdecode(c1); -+ Trace((stdout, " %02x", c1)); -+ } -+ Trace((stdout, "\n")); -+ -+ /* If last two bytes of header don't match crc (or file time in the -+ * case of an extended local header), back up and just copy. For -+ * pkzip 2.0, the check has been reduced to one byte only. -+ */ -+#ifdef ZIP10 -+ if ((ush)(c0 | (c1<<8)) != -+ (z->flg & 8 ? (ush) z->tim & 0xffff : (ush)(z->crc >> 16))) { -+#else -+ c0++; /* avoid warning on unused variable */ -+ if ((ush)c1 != (z->flg & 8 ? (ush) z->tim >> 8 : (ush)(z->crc >> 24))) { -+#endif -+ if (fseek(source, offset, SEEK_SET)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ if ((res = zipcopy(z, source, dest)) != ZE_OK) return res; -+ return ZE_MISS; -+ } -+ -+ /* Clear encrypted bit and local header bit, and write local header to -+ output file */ -+ if ((offset = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP; -+ z->off = offset; -+ flag = z->flg; -+ z->flg &= ~9; -+ z->lflg &= ~9; -+ z->siz -= RAND_HEAD_LEN; -+ if ((res = putlocal(z, dest)) != ZE_OK) return res; -+ -+ /* Decrypt data */ -+ for (size = z->siz; size; size--) { -+ if ((c1 = getc(source)) == EOF) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ zdecode(c1); -+ putc(c1, dest); -+ } -+ /* Skip extended local header in input file if there is one */ -+ if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ if (fflush(dest) == EOF) return ZE_TEMP; -+ -+ return ZE_OK; -+} -+ -+ -+#else /* !UTIL */ -+ -+/*********************************************************************** -+ * If requested, encrypt the data in buf, and in any case call fwrite() -+ * with the arguments to zfwrite(). Return what fwrite() returns. -+ */ -+unsigned zfwrite(buf, item_size, nb, f) -+ zvoid *buf; /* data buffer */ -+ extent item_size; /* size of each item in bytes */ -+ extent nb; /* number of items */ -+ FILE *f; /* file to write to */ -+{ -+ int t; /* temporary */ -+ -+ if (key != (char *)NULL) { /* key is the global password pointer */ -+ ulg size; /* buffer size */ -+ char *p = (char*)buf; /* steps through buffer */ -+ -+ /* Encrypt data in buffer */ -+ for (size = item_size*(ulg)nb; size != 0; p++, size--) { -+ *p = (char)zencode(*p, t); -+ } -+ } -+ /* Write the buffer out */ -+ return fwrite(buf, item_size, nb, f); -+} -+ -+#endif /* ?UTIL */ -+#endif /* ZIP */ -+ -+ -+#if (defined(UNZIP) && !defined(FUNZIP)) -+ -+/*********************************************************************** -+ * Get the password and set up keys for current zipfile member. -+ * Return PK_ class error. -+ */ -+int decrypt(__G__ passwrd) -+ __GDEF -+ ZCONST char *passwrd; -+{ -+ ush b; -+ int n, r; -+ uch h[RAND_HEAD_LEN]; -+ -+ Trace((stdout, "\n[incnt = %d]: ", GLOBAL(incnt))); -+ -+ /* get header once (turn off "encrypted" flag temporarily so we don't -+ * try to decrypt the same data twice) */ -+ GLOBAL(pInfo->encrypted) = FALSE; -+ defer_leftover_input(__G); -+ for (n = 0; n < RAND_HEAD_LEN; n++) { -+ b = NEXTBYTE; -+ h[n] = (uch)b; -+ Trace((stdout, " (%02x)", h[n])); -+ } -+ undefer_input(__G); -+ GLOBAL(pInfo->encrypted) = TRUE; -+ -+ if (GLOBAL(newzip)) { /* this is first encrypted member in this zipfile */ -+ GLOBAL(newzip) = FALSE; -+ if (passwrd != (char *)NULL) { /* user gave password on command line */ -+ if (!GLOBAL(key)) { -+ if ((GLOBAL(key) = (char *)malloc(strlen(passwrd)+1)) == -+ (char *)NULL) -+ return PK_MEM2; -+ strcpy(GLOBAL(key), passwrd); -+ GLOBAL(nopwd) = TRUE; /* inhibit password prompting! */ -+ } -+ } else if (GLOBAL(key)) { /* get rid of previous zipfile's key */ -+ free(GLOBAL(key)); -+ GLOBAL(key) = (char *)NULL; -+ } -+ } -+ -+ /* if have key already, test it; else allocate memory for it */ -+ if (GLOBAL(key)) { -+ if (!testp(__G__ h)) -+ return PK_COOL; /* existing password OK (else prompt for new) */ -+ else if (GLOBAL(nopwd)) -+ return PK_WARN; /* user indicated no more prompting */ -+ } else if ((GLOBAL(key) = (char *)malloc(IZ_PWLEN+1)) == (char *)NULL) -+ return PK_MEM2; -+ -+ /* try a few keys */ -+ n = 0; -+ do { -+ r = (*G.decr_passwd)((zvoid *)&G, &n, GLOBAL(key), IZ_PWLEN+1, -+ GLOBAL(zipfn), GLOBAL(filename)); -+ if (r == IZ_PW_ERROR) { /* internal error in fetch of PW */ -+ free (GLOBAL(key)); -+ GLOBAL(key) = NULL; -+ return PK_MEM2; -+ } -+ if (r != IZ_PW_ENTERED) { /* user replied "skip" or "skip all" */ -+ *GLOBAL(key) = '\0'; /* We try the NIL password, ... */ -+ n = 0; /* and cancel fetch for this item. */ -+ } -+ if (!testp(__G__ h)) -+ return PK_COOL; -+ if (r == IZ_PW_CANCELALL) /* User replied "Skip all" */ -+ GLOBAL(nopwd) = TRUE; /* inhibit any further PW prompt! */ -+ } while (n > 0); -+ -+ return PK_WARN; -+ -+} /* end function decrypt() */ -+ -+ -+ -+/*********************************************************************** -+ * Test the password. Return -1 if bad, 0 if OK. -+ */ -+local int testp(__G__ h) -+ __GDEF -+ ZCONST uch *h; -+{ -+ int r; -+ char *key_translated; -+ -+ /* On systems with "obscure" native character coding (e.g., EBCDIC), -+ * the first test translates the password to the "main standard" -+ * character coding. */ -+ -+#ifdef STR_TO_CP1 -+ /* allocate buffer for translated password */ -+ if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL) -+ return -1; -+ /* first try, test password translated "standard" charset */ -+ r = testkey(__G__ h, STR_TO_CP1(key_translated, GLOBAL(key))); -+#else /* !STR_TO_CP1 */ -+ /* first try, test password as supplied on the extractor's host */ -+ r = testkey(__G__ h, GLOBAL(key)); -+#endif /* ?STR_TO_CP1 */ -+ -+#ifdef STR_TO_CP2 -+ if (r != 0) { -+#ifndef STR_TO_CP1 -+ /* now prepare for second (and maybe third) test with translated pwd */ -+ if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL) -+ return -1; -+#endif -+ /* second try, password translated to alternate ("standard") charset */ -+ r = testkey(__G__ h, STR_TO_CP2(key_translated, GLOBAL(key))); -+#ifdef STR_TO_CP3 -+ if (r != 0) -+ /* third try, password translated to another "standard" charset */ -+ r = testkey(__G__ h, STR_TO_CP3(key_translated, GLOBAL(key))); -+#endif -+#ifndef STR_TO_CP1 -+ free(key_translated); -+#endif -+ } -+#endif /* STR_TO_CP2 */ -+ -+#ifdef STR_TO_CP1 -+ free(key_translated); -+ if (r != 0) { -+ /* last resort, test password as supplied on the extractor's host */ -+ r = testkey(__G__ h, GLOBAL(key)); -+ } -+#endif /* STR_TO_CP1 */ -+ -+ return r; -+ -+} /* end function testp() */ -+ -+ -+local int testkey(__G__ h, key) -+ __GDEF -+ ZCONST uch *h; /* decrypted header */ -+ ZCONST char *key; /* decryption password to test */ -+{ -+ ush b; -+#ifdef ZIP10 -+ ush c; -+#endif -+ int n; -+ uch *p; -+ uch hh[RAND_HEAD_LEN]; /* decrypted header */ -+ -+ /* set keys and save the encrypted header */ -+ init_keys(__G__ key); -+ memcpy(hh, h, RAND_HEAD_LEN); -+ -+ /* check password */ -+ for (n = 0; n < RAND_HEAD_LEN; n++) { -+ zdecode(hh[n]); -+ Trace((stdout, " %02x", hh[n])); -+ } -+ -+ Trace((stdout, -+ "\n lrec.crc= %08lx crec.crc= %08lx pInfo->ExtLocHdr= %s\n", -+ GLOBAL(lrec.crc32), GLOBAL(pInfo->crc), -+ GLOBAL(pInfo->ExtLocHdr) ? "true":"false")); -+ Trace((stdout, " incnt = %d unzip offset into zipfile = %ld\n", -+ GLOBAL(incnt), -+ GLOBAL(cur_zipfile_bufstart)+(GLOBAL(inptr)-GLOBAL(inbuf)))); -+ -+ /* same test as in zipbare(): */ -+ -+#ifdef ZIP10 /* check two bytes */ -+ c = hh[RAND_HEAD_LEN-2], b = hh[RAND_HEAD_LEN-1]; -+ Trace((stdout, -+ " (c | (b<<8)) = %04x (crc >> 16) = %04x lrec.time = %04x\n", -+ (ush)(c | (b<<8)), (ush)(GLOBAL(lrec.crc32) >> 16), -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff)))); -+ if ((ush)(c | (b<<8)) != (GLOBAL(pInfo->ExtLocHdr) ? -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff) : -+ (ush)(GLOBAL(lrec.crc32) >> 16))) -+ return -1; /* bad */ -+#else -+ b = hh[RAND_HEAD_LEN-1]; -+ Trace((stdout, " b = %02x (crc >> 24) = %02x (lrec.time >> 8) = %02x\n", -+ b, (ush)(GLOBAL(lrec.crc32) >> 24), -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff)); -+ if (b != (GLOBAL(pInfo->ExtLocHdr) ? -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff : -+ (ush)(GLOBAL(lrec.crc32) >> 24))) -+ return -1; /* bad */ -+#endif -+ /* password OK: decrypt current buffer contents before leaving */ -+ for (n = (long)GLOBAL(incnt) > GLOBAL(csize) ? -+ (int)GLOBAL(csize) : GLOBAL(incnt), -+ p = GLOBAL(inptr); n--; p++) -+ zdecode(*p); -+ return 0; /* OK */ -+ -+} /* end function testkey() */ -+ -+#endif /* UNZIP && !FUNZIP */ -+ -+#else /* !CRYPT */ -+ - /* something "externally visible" to shut up compiler/linker warnings */ - int zcr_dummy; -+ -+#endif /* ?CRYPT */ -diff -ur zip-2.3.orig/crypt.h zip-2.3/crypt.h ---- zip-2.3.orig/crypt.h 1999-10-09 23:10:00.000000000 +0300 -+++ zip-2.3/crypt.h 2005-07-15 16:19:00.000000000 +0300 -@@ -1,19 +1,13 @@ - /* -- Copyright (c) 1990-1999 Info-ZIP. All rights reserved. -+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - -- See the accompanying file LICENSE, version 1999-Oct-05 or later -+ See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. -- If, for some reason, both of these files are missing, the Info-ZIP license -- also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html -+ If, for some reason, all these files are missing, the Info-ZIP license -+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html - */ - /* -- crypt.h (dummy version) by Info-ZIP. Last revised: 15 Aug 98 -- -- This is a non-functional version of Info-ZIP's crypt.h encryption/ -- decryption header file for Zip, ZipCloak, UnZip and fUnZip. This -- file is not copyrighted and may be distributed without restriction. -- See the "WHERE" file for sites from which to obtain the full crypt -- sources (zcrypt28.zip or later). -+ crypt.h (full version) by Info-ZIP. Last revised: [see CR_VERSION_DATE] - */ - - #ifndef __crypt_h /* don't include more than once */ -@@ -22,11 +16,131 @@ - #ifdef CRYPT - # undef CRYPT - #endif --#define CRYPT 0 /* dummy version */ -+ -+#if !defined(NO_CRYPT) -+# define CRYPT 1 /* full version */ -+#else -+# define CRYPT 0 /* dummy version */ -+#endif -+ -+#if CRYPT -+/* full version */ -+ -+#ifdef CR_BETA -+# undef CR_BETA /* this is not a beta release */ -+#endif -+ -+#define CR_MAJORVER 2 -+#define CR_MINORVER 9 -+#ifdef CR_BETA -+# define CR_BETA_VER "a BETA" -+# define CR_VERSION_DATE "9 April 2000" /* last real code change */ -+#else -+# define CR_BETA_VER "" -+# define CR_VERSION_DATE "22 April 2000" /* last public release date */ -+# define CR_RELEASE -+#endif -+ -+#ifndef __G /* UnZip only, for now (DLL stuff) */ -+# define __G -+# define __G__ -+# define __GDEF -+# define __GPRO void -+# define __GPRO__ -+#endif -+ -+#if defined(MSDOS) || defined(OS2) || defined(WIN32) -+# ifndef DOS_OS2_W32 -+# define DOS_OS2_W32 -+# endif -+#endif -+ -+#if defined(DOS_OS2_W32) || defined(__human68k__) -+# ifndef DOS_H68_OS2_W32 -+# define DOS_H68_OS2_W32 -+# endif -+#endif -+ -+#if defined(VM_CMS) || defined(MVS) -+# ifndef CMS_MVS -+# define CMS_MVS -+# endif -+#endif -+ -+/* To allow combining of Zip and UnZip static libraries in a single binary, -+ * the Zip and UnZip versions of the crypt core functions have to be named -+ * differently. -+ */ -+#ifdef ZIP -+# ifdef REALLY_SHORT_SYMS -+# define decrypt_byte zdcrby -+# else -+# define decrypt_byte zp_decrypt_byte -+# endif -+# define update_keys zp_update_keys -+# define init_keys zp_init_keys -+#else /* !ZIP */ -+# ifdef REALLY_SHORT_SYMS -+# define decrypt_byte dcrbyt -+# endif -+#endif /* ?ZIP */ -+ -+#define IZ_PWLEN 80 /* input buffer size for reading encryption key */ -+#ifndef PWLEN /* for compatibility with previous zcrypt release... */ -+# define PWLEN IZ_PWLEN -+#endif -+#define RAND_HEAD_LEN 12 /* length of encryption random header */ -+ -+/* the crc_32_tab array has to be provided externally for the crypt calculus */ -+#ifndef CRC_32_TAB /* UnZip provides this in globals.h */ -+# if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB)) -+ extern ZCONST ulg near *crc_32_tab; -+# else -+ extern ZCONST ulg Far *crc_32_tab; -+# endif -+#endif /* !CRC_32_TAB */ -+ -+/* encode byte c, using temp t. Warning: c must not have side effects. */ -+#define zencode(c,t) (t=decrypt_byte(__G), update_keys(c), t^(c)) -+ -+/* decode byte c in place */ -+#define zdecode(c) update_keys(__G__ c ^= decrypt_byte(__G)) -+ -+int decrypt_byte OF((__GPRO)); -+int update_keys OF((__GPRO__ int c)); -+void init_keys OF((__GPRO__ ZCONST char *passwd)); -+ -+#ifdef ZIP -+ void crypthead OF((ZCONST char *, ulg, FILE *)); -+# ifdef UTIL -+ int zipcloak OF((struct zlist far *, FILE *, FILE *, ZCONST char *)); -+ int zipbare OF((struct zlist far *, FILE *, FILE *, ZCONST char *)); -+# else -+ unsigned zfwrite OF((zvoid *, extent, extent, FILE *)); -+ extern char *key; -+# endif -+#endif /* ZIP */ -+ -+#if (defined(UNZIP) && !defined(FUNZIP)) -+ int decrypt OF((__GPRO__ ZCONST char *passwrd)); -+#endif -+ -+#ifdef FUNZIP -+ extern int encrypted; -+# ifdef NEXTBYTE -+# undef NEXTBYTE -+# endif -+# define NEXTBYTE \ -+ (encrypted? update_keys(__G__ getc(G.in)^decrypt_byte(__G)) : getc(G.in)) -+#endif /* FUNZIP */ -+ -+#else /* !CRYPT */ -+/* dummy version */ - - #define zencode - #define zdecode - - #define zfwrite fwrite - -+#endif /* ?CRYPT */ - #endif /* !__crypt_h */ diff --git a/tags/pisi-1.1_rc10/tests/zip/files/zip-2.3-unix_configure-pic.patch b/tags/pisi-1.1_rc10/tests/zip/files/zip-2.3-unix_configure-pic.patch deleted file mode 100644 index 45b137b0..00000000 --- a/tags/pisi-1.1_rc10/tests/zip/files/zip-2.3-unix_configure-pic.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- unix/configure.orig 2004-09-28 06:45:33.000000000 +0000 -+++ unix/configure 2004-09-28 06:54:53.000000000 +0000 -@@ -29,6 +29,9 @@ - - echo Check if we can use asm code - OBJA="" -+piclib="$(echo | $CPP -dM $CFLAGS - | grep -i __pic__)" -+echo "Checking if compiler wants to create pic code" -+[ "$piclib" == "" ] && \ - if eval "$CPP match.S > _match.s 2>/dev/null"; then - if test ! -s _match.s || grep error < _match.s > /dev/null; then - : diff --git a/tags/pisi-1.1_rc10/tests/zip/files/zip-CAN-2004-1010.patch b/tags/pisi-1.1_rc10/tests/zip/files/zip-CAN-2004-1010.patch deleted file mode 100644 index 150d6407..00000000 --- a/tags/pisi-1.1_rc10/tests/zip/files/zip-CAN-2004-1010.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- zip-2.3/unix/unix.c.orig 2004-11-05 15:44:41.000000000 -0500 -+++ zip-2.3/unix/unix.c 2004-11-05 15:50:28.000000000 -0500 -@@ -319,8 +319,8 @@ iztimes *t; /* return value: - a file size of -1 */ - { - struct stat s; /* results of stat() */ -- char name[FNMAX]; -- int len = strlen(f); -+ char *name; -+ size_t len = strlen(f); - - if (f == label) { - if (a != NULL) -@@ -331,6 +331,11 @@ iztimes *t; /* return value: - t->atime = t->mtime = t->ctime = label_utim; - return label_time; - } -+ -+ name = malloc(len+1); -+ if (!name) -+ return 0; -+ - strcpy(name, f); - if (name[len - 1] == '/') - name[len - 1] = '\0'; diff --git a/tags/pisi-1.1_rc10/tests/zip/pspec.xml b/tags/pisi-1.1_rc10/tests/zip/pspec.xml deleted file mode 100644 index 513655ba..00000000 --- a/tags/pisi-1.1_rc10/tests/zip/pspec.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - zip - ftp://ftp.freesoftware.com/pub/infozip/Zip.html - - zibidi - himini@gmail.com - - Info-ZIP - category - component - Info ZIP (encryption support) - Info ZIP (ÅŸifre ÅŸeysi) - Info ZIP (encryption support) - ftp://ftp.linux.org.tr/pub/mirrors/gentoo/distfiles/zip23.tar.gz - - zip-2.3-unix_configure-pic.patch - zip-CAN-2004-1010.patch - zcrypt.patch - - - patch - - - - - zip - - unzip - - - /usr/bin - /usr/share/doc - /usr/share/man - - - - - 2005-07-15 - 2.3 - - - - - diff --git a/tags/pisi-1.1_rc10/tests/zip2/actions.py b/tags/pisi-1.1_rc10/tests/zip2/actions.py deleted file mode 100644 index a2c1b060..00000000 --- a/tags/pisi-1.1_rc10/tests/zip2/actions.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright (C) 2005, TUBITAK/UEKAE -# -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free -# Software Foundation; either version 2 of the License, or (at your option) -# any later version. -# -# Please read the COPYING file. -# - -from pisi.actionsapi import autotools -from pisi.actionsapi import get -from pisi.actionsapi import pisitools - -WorkDir="zip-2.3" - -def setup(): - pisitools.dosed("unix/Makefile", "-O2", get.CFLAGS()) - -def build(): - autotools.make("-f unix/Makefile CC=%s CPP=%s generic" % (get.CC(), get.CXX())) - -def install(): - pisitools.dobin("zip") - pisitools.dobin("zipcloak") - pisitools.dobin("zipnote") - pisitools.dobin("zipsplit") - - pisitools.doman("man/*.1") - pisitools.dodoc("BUGS", "CHANGES", "MANUAL", "README", "TODO", "WHATSNEW", "WHERE") - diff --git a/tags/pisi-1.1_rc10/tests/zip2/files/zcrypt.patch b/tags/pisi-1.1_rc10/tests/zip2/files/zcrypt.patch deleted file mode 100644 index 6b696af5..00000000 --- a/tags/pisi-1.1_rc10/tests/zip2/files/zcrypt.patch +++ /dev/null @@ -1,752 +0,0 @@ -diff -ur zip-2.3.orig/crypt.c zip-2.3/crypt.c ---- zip-2.3.orig/crypt.c 1999-10-09 23:09:26.000000000 +0300 -+++ zip-2.3/crypt.c 2005-07-15 16:19:00.000000000 +0300 -@@ -1,20 +1,577 @@ - /* -- Copyright (c) 1990-1999 Info-ZIP. All rights reserved. -+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - -- See the accompanying file LICENSE, version 1999-Oct-05 or later -+ See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. -- If, for some reason, both of these files are missing, the Info-ZIP license -- also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html -+ If, for some reason, all these files are missing, the Info-ZIP license -+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html - */ - /* -- crypt.c (dummy version) by Info-ZIP. Last revised: 15 Aug 98 -+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] - -- This is a non-functional version of Info-ZIP's crypt.c encryption/ -- decryption code for Zip, ZipCloak, UnZip and fUnZip. This file is -- not copyrighted and may be distributed freely. :-) See the "WHERE" -- file for sites from which to obtain the full encryption/decryption -- sources (zcrypt28.zip or later). -+ The encryption/decryption parts of this source code (as opposed to the -+ non-echoing password parts) were originally written in Europe. The -+ whole source package can be freely distributed, including from the USA. -+ (Prior to January 2000, re-export from the US was a violation of US law.) - */ - -+/* -+ This encryption code is a direct transcription of the algorithm from -+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This -+ file (appnote.txt) is distributed with the PKZIP program (even in the -+ version without encryption capabilities). -+ */ -+ -+#define ZCRYPT_INTERNAL -+#include "zip.h" -+#include "crypt.h" -+#include "ttyio.h" -+ -+#if CRYPT -+ -+#ifndef FALSE -+# define FALSE 0 -+#endif -+ -+#ifdef ZIP -+ /* For the encoding task used in Zip (and ZipCloak), we want to initialize -+ the crypt algorithm with some reasonably unpredictable bytes, see -+ the crypthead() function. The standard rand() library function is -+ used to supply these `random' bytes, which in turn is initialized by -+ a srand() call. The srand() function takes an "unsigned" (at least 16bit) -+ seed value as argument to determine the starting point of the rand() -+ pseudo-random number generator. -+ This seed number is constructed as "Seed = Seed1 .XOR. Seed2" with -+ Seed1 supplied by the current time (= "(unsigned)time()") and Seed2 -+ as some (hopefully) nondeterministic bitmask. On many (most) systems, -+ we use some "process specific" number, as the PID or something similar, -+ but when nothing unpredictable is available, a fixed number may be -+ sufficient. -+ NOTE: -+ 1.) This implementation requires the availability of the following -+ standard UNIX C runtime library functions: time(), rand(), srand(). -+ On systems where some of them are missing, the environment that -+ incorporates the crypt routines must supply suitable replacement -+ functions. -+ 2.) It is a very bad idea to use a second call to time() to set the -+ "Seed2" number! In this case, both "Seed1" and "Seed2" would be -+ (almost) identical, resulting in a (mostly) "zero" constant seed -+ number passed to srand(). -+ -+ The implementation environment defined in the "zip.h" header should -+ supply a reasonable definition for ZCR_SEED2 (an unsigned number; for -+ most implementations of rand() and srand(), only the lower 16 bits are -+ significant!). An example that works on many systems would be -+ "#define ZCR_SEED2 (unsigned)getpid()". -+ The default definition for ZCR_SEED2 supplied below should be regarded -+ as a fallback to allow successful compilation in "beta state" -+ environments. -+ */ -+# include /* time() function supplies first part of crypt seed */ -+ /* "last resort" source for second part of crypt seed pattern */ -+# ifndef ZCR_SEED2 -+# define ZCR_SEED2 (unsigned)3141592654L /* use PI as default pattern */ -+# endif -+# ifdef GLOBAL /* used in Amiga system headers, maybe others too */ -+# undef GLOBAL -+# endif -+# define GLOBAL(g) g -+#else /* !ZIP */ -+# define GLOBAL(g) G.g -+#endif /* ?ZIP */ -+ -+ -+#ifdef UNZIP -+ /* char *key = (char *)NULL; moved to globals.h */ -+# ifndef FUNZIP -+ local int testp OF((__GPRO__ ZCONST uch *h)); -+ local int testkey OF((__GPRO__ ZCONST uch *h, ZCONST char *key)); -+# endif -+#endif /* UNZIP */ -+ -+#ifndef UNZIP /* moved to globals.h for UnZip */ -+ local ulg keys[3]; /* keys defining the pseudo-random sequence */ -+#endif /* !UNZIP */ -+ -+#ifndef Trace -+# ifdef CRYPT_DEBUG -+# define Trace(x) fprintf x -+# else -+# define Trace(x) -+# endif -+#endif -+ -+#ifndef CRC_32_TAB -+# define CRC_32_TAB crc_32_tab -+#endif -+ -+#define CRC32(c, b) (CRC_32_TAB[((int)(c) ^ (b)) & 0xff] ^ ((c) >> 8)) -+ -+/*********************************************************************** -+ * Return the next byte in the pseudo-random sequence -+ */ -+int decrypt_byte(__G) -+ __GDEF -+{ -+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an -+ * unpredictable manner on 16-bit systems; not a problem -+ * with any known compiler so far, though */ -+ -+ temp = ((unsigned)GLOBAL(keys[2]) & 0xffff) | 2; -+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); -+} -+ -+/*********************************************************************** -+ * Update the encryption keys with the next byte of plain text -+ */ -+int update_keys(__G__ c) -+ __GDEF -+ int c; /* byte of plain text */ -+{ -+ GLOBAL(keys[0]) = CRC32(GLOBAL(keys[0]), c); -+ GLOBAL(keys[1]) += GLOBAL(keys[0]) & 0xff; -+ GLOBAL(keys[1]) = GLOBAL(keys[1]) * 134775813L + 1; -+ { -+ register int keyshift = (int)(GLOBAL(keys[1]) >> 24); -+ GLOBAL(keys[2]) = CRC32(GLOBAL(keys[2]), keyshift); -+ } -+ return c; -+} -+ -+ -+/*********************************************************************** -+ * Initialize the encryption keys and the random header according to -+ * the given password. -+ */ -+void init_keys(__G__ passwd) -+ __GDEF -+ ZCONST char *passwd; /* password string with which to modify keys */ -+{ -+ GLOBAL(keys[0]) = 305419896L; -+ GLOBAL(keys[1]) = 591751049L; -+ GLOBAL(keys[2]) = 878082192L; -+ while (*passwd != '\0') { -+ update_keys(__G__ (int)*passwd); -+ passwd++; -+ } -+} -+ -+ -+#ifdef ZIP -+ -+/*********************************************************************** -+ * Write encryption header to file zfile using the password passwd -+ * and the cyclic redundancy check crc. -+ */ -+void crypthead(passwd, crc, zfile) -+ ZCONST char *passwd; /* password string */ -+ ulg crc; /* crc of file being encrypted */ -+ FILE *zfile; /* where to write header */ -+{ -+ int n; /* index in random header */ -+ int t; /* temporary */ -+ int c; /* random byte */ -+ int ztemp; /* temporary for zencoded value */ -+ uch header[RAND_HEAD_LEN-2]; /* random header */ -+ static unsigned calls = 0; /* ensure different random header each time */ -+ -+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the -+ * output of rand() to get less predictability, since rand() is -+ * often poorly implemented. -+ */ -+ if (++calls == 1) { -+ srand((unsigned)time(NULL) ^ ZCR_SEED2); -+ } -+ init_keys(passwd); -+ for (n = 0; n < RAND_HEAD_LEN-2; n++) { -+ c = (rand() >> 7) & 0xff; -+ header[n] = (uch)zencode(c, t); -+ } -+ /* Encrypt random header (last two bytes is high word of crc) */ -+ init_keys(passwd); -+ for (n = 0; n < RAND_HEAD_LEN-2; n++) { -+ ztemp = zencode(header[n], t); -+ putc(ztemp, zfile); -+ } -+ ztemp = zencode((int)(crc >> 16) & 0xff, t); -+ putc(ztemp, zfile); -+ ztemp = zencode((int)(crc >> 24) & 0xff, t); -+ putc(ztemp, zfile); -+} -+ -+ -+#ifdef UTIL -+ -+/*********************************************************************** -+ * Encrypt the zip entry described by z from file source to file dest -+ * using the password passwd. Return an error code in the ZE_ class. -+ */ -+int zipcloak(z, source, dest, passwd) -+ struct zlist far *z; /* zip entry to encrypt */ -+ FILE *source, *dest; /* source and destination files */ -+ ZCONST char *passwd; /* password string */ -+{ -+ int c; /* input byte */ -+ int res; /* result code */ -+ ulg n; /* holds offset and counts size */ -+ ush flag; /* previous flags */ -+ int t; /* temporary */ -+ int ztemp; /* temporary storage for zencode value */ -+ -+ /* Set encrypted bit, clear extended local header bit and write local -+ header to output file */ -+ if ((n = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP; -+ z->off = n; -+ flag = z->flg; -+ z->flg |= 1, z->flg &= ~8; -+ z->lflg |= 1, z->lflg &= ~8; -+ z->siz += RAND_HEAD_LEN; -+ if ((res = putlocal(z, dest)) != ZE_OK) return res; -+ -+ /* Initialize keys with password and write random header */ -+ crypthead(passwd, z->crc, dest); -+ -+ /* Skip local header in input file */ -+ if (fseek(source, (long)(4 + LOCHEAD + (ulg)z->nam + (ulg)z->ext), -+ SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ -+ /* Encrypt data */ -+ for (n = z->siz - RAND_HEAD_LEN; n; n--) { -+ if ((c = getc(source)) == EOF) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ ztemp = zencode(c, t); -+ putc(ztemp, dest); -+ } -+ /* Skip extended local header in input file if there is one */ -+ if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ if (fflush(dest) == EOF) return ZE_TEMP; -+ return ZE_OK; -+} -+ -+/*********************************************************************** -+ * Decrypt the zip entry described by z from file source to file dest -+ * using the password passwd. Return an error code in the ZE_ class. -+ */ -+int zipbare(z, source, dest, passwd) -+ struct zlist far *z; /* zip entry to encrypt */ -+ FILE *source, *dest; /* source and destination files */ -+ ZCONST char *passwd; /* password string */ -+{ -+ int c0, c1; /* last two input bytes */ -+ ulg offset; /* used for file offsets */ -+ ulg size; /* size of input data */ -+ int r; /* size of encryption header */ -+ int res; /* return code */ -+ ush flag; /* previous flags */ -+ -+ /* Save position and skip local header in input file */ -+ if ((offset = (ulg)ftell(source)) == (ulg)-1L || -+ fseek(source, (long)(4 + LOCHEAD + (ulg)z->nam + (ulg)z->ext), -+ SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ /* Initialize keys with password */ -+ init_keys(passwd); -+ -+ /* Decrypt encryption header, save last two bytes */ -+ c1 = 0; -+ for (r = RAND_HEAD_LEN; r; r--) { -+ c0 = c1; -+ if ((c1 = getc(source)) == EOF) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ Trace((stdout, " (%02x)", c1)); -+ zdecode(c1); -+ Trace((stdout, " %02x", c1)); -+ } -+ Trace((stdout, "\n")); -+ -+ /* If last two bytes of header don't match crc (or file time in the -+ * case of an extended local header), back up and just copy. For -+ * pkzip 2.0, the check has been reduced to one byte only. -+ */ -+#ifdef ZIP10 -+ if ((ush)(c0 | (c1<<8)) != -+ (z->flg & 8 ? (ush) z->tim & 0xffff : (ush)(z->crc >> 16))) { -+#else -+ c0++; /* avoid warning on unused variable */ -+ if ((ush)c1 != (z->flg & 8 ? (ush) z->tim >> 8 : (ush)(z->crc >> 24))) { -+#endif -+ if (fseek(source, offset, SEEK_SET)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ if ((res = zipcopy(z, source, dest)) != ZE_OK) return res; -+ return ZE_MISS; -+ } -+ -+ /* Clear encrypted bit and local header bit, and write local header to -+ output file */ -+ if ((offset = (ulg)ftell(dest)) == (ulg)-1L) return ZE_TEMP; -+ z->off = offset; -+ flag = z->flg; -+ z->flg &= ~9; -+ z->lflg &= ~9; -+ z->siz -= RAND_HEAD_LEN; -+ if ((res = putlocal(z, dest)) != ZE_OK) return res; -+ -+ /* Decrypt data */ -+ for (size = z->siz; size; size--) { -+ if ((c1 = getc(source)) == EOF) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ zdecode(c1); -+ putc(c1, dest); -+ } -+ /* Skip extended local header in input file if there is one */ -+ if ((flag & 8) != 0 && fseek(source, 16L, SEEK_CUR)) { -+ return ferror(source) ? ZE_READ : ZE_EOF; -+ } -+ if (fflush(dest) == EOF) return ZE_TEMP; -+ -+ return ZE_OK; -+} -+ -+ -+#else /* !UTIL */ -+ -+/*********************************************************************** -+ * If requested, encrypt the data in buf, and in any case call fwrite() -+ * with the arguments to zfwrite(). Return what fwrite() returns. -+ */ -+unsigned zfwrite(buf, item_size, nb, f) -+ zvoid *buf; /* data buffer */ -+ extent item_size; /* size of each item in bytes */ -+ extent nb; /* number of items */ -+ FILE *f; /* file to write to */ -+{ -+ int t; /* temporary */ -+ -+ if (key != (char *)NULL) { /* key is the global password pointer */ -+ ulg size; /* buffer size */ -+ char *p = (char*)buf; /* steps through buffer */ -+ -+ /* Encrypt data in buffer */ -+ for (size = item_size*(ulg)nb; size != 0; p++, size--) { -+ *p = (char)zencode(*p, t); -+ } -+ } -+ /* Write the buffer out */ -+ return fwrite(buf, item_size, nb, f); -+} -+ -+#endif /* ?UTIL */ -+#endif /* ZIP */ -+ -+ -+#if (defined(UNZIP) && !defined(FUNZIP)) -+ -+/*********************************************************************** -+ * Get the password and set up keys for current zipfile member. -+ * Return PK_ class error. -+ */ -+int decrypt(__G__ passwrd) -+ __GDEF -+ ZCONST char *passwrd; -+{ -+ ush b; -+ int n, r; -+ uch h[RAND_HEAD_LEN]; -+ -+ Trace((stdout, "\n[incnt = %d]: ", GLOBAL(incnt))); -+ -+ /* get header once (turn off "encrypted" flag temporarily so we don't -+ * try to decrypt the same data twice) */ -+ GLOBAL(pInfo->encrypted) = FALSE; -+ defer_leftover_input(__G); -+ for (n = 0; n < RAND_HEAD_LEN; n++) { -+ b = NEXTBYTE; -+ h[n] = (uch)b; -+ Trace((stdout, " (%02x)", h[n])); -+ } -+ undefer_input(__G); -+ GLOBAL(pInfo->encrypted) = TRUE; -+ -+ if (GLOBAL(newzip)) { /* this is first encrypted member in this zipfile */ -+ GLOBAL(newzip) = FALSE; -+ if (passwrd != (char *)NULL) { /* user gave password on command line */ -+ if (!GLOBAL(key)) { -+ if ((GLOBAL(key) = (char *)malloc(strlen(passwrd)+1)) == -+ (char *)NULL) -+ return PK_MEM2; -+ strcpy(GLOBAL(key), passwrd); -+ GLOBAL(nopwd) = TRUE; /* inhibit password prompting! */ -+ } -+ } else if (GLOBAL(key)) { /* get rid of previous zipfile's key */ -+ free(GLOBAL(key)); -+ GLOBAL(key) = (char *)NULL; -+ } -+ } -+ -+ /* if have key already, test it; else allocate memory for it */ -+ if (GLOBAL(key)) { -+ if (!testp(__G__ h)) -+ return PK_COOL; /* existing password OK (else prompt for new) */ -+ else if (GLOBAL(nopwd)) -+ return PK_WARN; /* user indicated no more prompting */ -+ } else if ((GLOBAL(key) = (char *)malloc(IZ_PWLEN+1)) == (char *)NULL) -+ return PK_MEM2; -+ -+ /* try a few keys */ -+ n = 0; -+ do { -+ r = (*G.decr_passwd)((zvoid *)&G, &n, GLOBAL(key), IZ_PWLEN+1, -+ GLOBAL(zipfn), GLOBAL(filename)); -+ if (r == IZ_PW_ERROR) { /* internal error in fetch of PW */ -+ free (GLOBAL(key)); -+ GLOBAL(key) = NULL; -+ return PK_MEM2; -+ } -+ if (r != IZ_PW_ENTERED) { /* user replied "skip" or "skip all" */ -+ *GLOBAL(key) = '\0'; /* We try the NIL password, ... */ -+ n = 0; /* and cancel fetch for this item. */ -+ } -+ if (!testp(__G__ h)) -+ return PK_COOL; -+ if (r == IZ_PW_CANCELALL) /* User replied "Skip all" */ -+ GLOBAL(nopwd) = TRUE; /* inhibit any further PW prompt! */ -+ } while (n > 0); -+ -+ return PK_WARN; -+ -+} /* end function decrypt() */ -+ -+ -+ -+/*********************************************************************** -+ * Test the password. Return -1 if bad, 0 if OK. -+ */ -+local int testp(__G__ h) -+ __GDEF -+ ZCONST uch *h; -+{ -+ int r; -+ char *key_translated; -+ -+ /* On systems with "obscure" native character coding (e.g., EBCDIC), -+ * the first test translates the password to the "main standard" -+ * character coding. */ -+ -+#ifdef STR_TO_CP1 -+ /* allocate buffer for translated password */ -+ if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL) -+ return -1; -+ /* first try, test password translated "standard" charset */ -+ r = testkey(__G__ h, STR_TO_CP1(key_translated, GLOBAL(key))); -+#else /* !STR_TO_CP1 */ -+ /* first try, test password as supplied on the extractor's host */ -+ r = testkey(__G__ h, GLOBAL(key)); -+#endif /* ?STR_TO_CP1 */ -+ -+#ifdef STR_TO_CP2 -+ if (r != 0) { -+#ifndef STR_TO_CP1 -+ /* now prepare for second (and maybe third) test with translated pwd */ -+ if ((key_translated = malloc(strlen(GLOBAL(key)) + 1)) == (char *)NULL) -+ return -1; -+#endif -+ /* second try, password translated to alternate ("standard") charset */ -+ r = testkey(__G__ h, STR_TO_CP2(key_translated, GLOBAL(key))); -+#ifdef STR_TO_CP3 -+ if (r != 0) -+ /* third try, password translated to another "standard" charset */ -+ r = testkey(__G__ h, STR_TO_CP3(key_translated, GLOBAL(key))); -+#endif -+#ifndef STR_TO_CP1 -+ free(key_translated); -+#endif -+ } -+#endif /* STR_TO_CP2 */ -+ -+#ifdef STR_TO_CP1 -+ free(key_translated); -+ if (r != 0) { -+ /* last resort, test password as supplied on the extractor's host */ -+ r = testkey(__G__ h, GLOBAL(key)); -+ } -+#endif /* STR_TO_CP1 */ -+ -+ return r; -+ -+} /* end function testp() */ -+ -+ -+local int testkey(__G__ h, key) -+ __GDEF -+ ZCONST uch *h; /* decrypted header */ -+ ZCONST char *key; /* decryption password to test */ -+{ -+ ush b; -+#ifdef ZIP10 -+ ush c; -+#endif -+ int n; -+ uch *p; -+ uch hh[RAND_HEAD_LEN]; /* decrypted header */ -+ -+ /* set keys and save the encrypted header */ -+ init_keys(__G__ key); -+ memcpy(hh, h, RAND_HEAD_LEN); -+ -+ /* check password */ -+ for (n = 0; n < RAND_HEAD_LEN; n++) { -+ zdecode(hh[n]); -+ Trace((stdout, " %02x", hh[n])); -+ } -+ -+ Trace((stdout, -+ "\n lrec.crc= %08lx crec.crc= %08lx pInfo->ExtLocHdr= %s\n", -+ GLOBAL(lrec.crc32), GLOBAL(pInfo->crc), -+ GLOBAL(pInfo->ExtLocHdr) ? "true":"false")); -+ Trace((stdout, " incnt = %d unzip offset into zipfile = %ld\n", -+ GLOBAL(incnt), -+ GLOBAL(cur_zipfile_bufstart)+(GLOBAL(inptr)-GLOBAL(inbuf)))); -+ -+ /* same test as in zipbare(): */ -+ -+#ifdef ZIP10 /* check two bytes */ -+ c = hh[RAND_HEAD_LEN-2], b = hh[RAND_HEAD_LEN-1]; -+ Trace((stdout, -+ " (c | (b<<8)) = %04x (crc >> 16) = %04x lrec.time = %04x\n", -+ (ush)(c | (b<<8)), (ush)(GLOBAL(lrec.crc32) >> 16), -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff)))); -+ if ((ush)(c | (b<<8)) != (GLOBAL(pInfo->ExtLocHdr) ? -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) & 0xffff) : -+ (ush)(GLOBAL(lrec.crc32) >> 16))) -+ return -1; /* bad */ -+#else -+ b = hh[RAND_HEAD_LEN-1]; -+ Trace((stdout, " b = %02x (crc >> 24) = %02x (lrec.time >> 8) = %02x\n", -+ b, (ush)(GLOBAL(lrec.crc32) >> 24), -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff)); -+ if (b != (GLOBAL(pInfo->ExtLocHdr) ? -+ ((ush)GLOBAL(lrec.last_mod_dos_datetime) >> 8) & 0xff : -+ (ush)(GLOBAL(lrec.crc32) >> 24))) -+ return -1; /* bad */ -+#endif -+ /* password OK: decrypt current buffer contents before leaving */ -+ for (n = (long)GLOBAL(incnt) > GLOBAL(csize) ? -+ (int)GLOBAL(csize) : GLOBAL(incnt), -+ p = GLOBAL(inptr); n--; p++) -+ zdecode(*p); -+ return 0; /* OK */ -+ -+} /* end function testkey() */ -+ -+#endif /* UNZIP && !FUNZIP */ -+ -+#else /* !CRYPT */ -+ - /* something "externally visible" to shut up compiler/linker warnings */ - int zcr_dummy; -+ -+#endif /* ?CRYPT */ -diff -ur zip-2.3.orig/crypt.h zip-2.3/crypt.h ---- zip-2.3.orig/crypt.h 1999-10-09 23:10:00.000000000 +0300 -+++ zip-2.3/crypt.h 2005-07-15 16:19:00.000000000 +0300 -@@ -1,19 +1,13 @@ - /* -- Copyright (c) 1990-1999 Info-ZIP. All rights reserved. -+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - -- See the accompanying file LICENSE, version 1999-Oct-05 or later -+ See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. -- If, for some reason, both of these files are missing, the Info-ZIP license -- also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html -+ If, for some reason, all these files are missing, the Info-ZIP license -+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html - */ - /* -- crypt.h (dummy version) by Info-ZIP. Last revised: 15 Aug 98 -- -- This is a non-functional version of Info-ZIP's crypt.h encryption/ -- decryption header file for Zip, ZipCloak, UnZip and fUnZip. This -- file is not copyrighted and may be distributed without restriction. -- See the "WHERE" file for sites from which to obtain the full crypt -- sources (zcrypt28.zip or later). -+ crypt.h (full version) by Info-ZIP. Last revised: [see CR_VERSION_DATE] - */ - - #ifndef __crypt_h /* don't include more than once */ -@@ -22,11 +16,131 @@ - #ifdef CRYPT - # undef CRYPT - #endif --#define CRYPT 0 /* dummy version */ -+ -+#if !defined(NO_CRYPT) -+# define CRYPT 1 /* full version */ -+#else -+# define CRYPT 0 /* dummy version */ -+#endif -+ -+#if CRYPT -+/* full version */ -+ -+#ifdef CR_BETA -+# undef CR_BETA /* this is not a beta release */ -+#endif -+ -+#define CR_MAJORVER 2 -+#define CR_MINORVER 9 -+#ifdef CR_BETA -+# define CR_BETA_VER "a BETA" -+# define CR_VERSION_DATE "9 April 2000" /* last real code change */ -+#else -+# define CR_BETA_VER "" -+# define CR_VERSION_DATE "22 April 2000" /* last public release date */ -+# define CR_RELEASE -+#endif -+ -+#ifndef __G /* UnZip only, for now (DLL stuff) */ -+# define __G -+# define __G__ -+# define __GDEF -+# define __GPRO void -+# define __GPRO__ -+#endif -+ -+#if defined(MSDOS) || defined(OS2) || defined(WIN32) -+# ifndef DOS_OS2_W32 -+# define DOS_OS2_W32 -+# endif -+#endif -+ -+#if defined(DOS_OS2_W32) || defined(__human68k__) -+# ifndef DOS_H68_OS2_W32 -+# define DOS_H68_OS2_W32 -+# endif -+#endif -+ -+#if defined(VM_CMS) || defined(MVS) -+# ifndef CMS_MVS -+# define CMS_MVS -+# endif -+#endif -+ -+/* To allow combining of Zip and UnZip static libraries in a single binary, -+ * the Zip and UnZip versions of the crypt core functions have to be named -+ * differently. -+ */ -+#ifdef ZIP -+# ifdef REALLY_SHORT_SYMS -+# define decrypt_byte zdcrby -+# else -+# define decrypt_byte zp_decrypt_byte -+# endif -+# define update_keys zp_update_keys -+# define init_keys zp_init_keys -+#else /* !ZIP */ -+# ifdef REALLY_SHORT_SYMS -+# define decrypt_byte dcrbyt -+# endif -+#endif /* ?ZIP */ -+ -+#define IZ_PWLEN 80 /* input buffer size for reading encryption key */ -+#ifndef PWLEN /* for compatibility with previous zcrypt release... */ -+# define PWLEN IZ_PWLEN -+#endif -+#define RAND_HEAD_LEN 12 /* length of encryption random header */ -+ -+/* the crc_32_tab array has to be provided externally for the crypt calculus */ -+#ifndef CRC_32_TAB /* UnZip provides this in globals.h */ -+# if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB)) -+ extern ZCONST ulg near *crc_32_tab; -+# else -+ extern ZCONST ulg Far *crc_32_tab; -+# endif -+#endif /* !CRC_32_TAB */ -+ -+/* encode byte c, using temp t. Warning: c must not have side effects. */ -+#define zencode(c,t) (t=decrypt_byte(__G), update_keys(c), t^(c)) -+ -+/* decode byte c in place */ -+#define zdecode(c) update_keys(__G__ c ^= decrypt_byte(__G)) -+ -+int decrypt_byte OF((__GPRO)); -+int update_keys OF((__GPRO__ int c)); -+void init_keys OF((__GPRO__ ZCONST char *passwd)); -+ -+#ifdef ZIP -+ void crypthead OF((ZCONST char *, ulg, FILE *)); -+# ifdef UTIL -+ int zipcloak OF((struct zlist far *, FILE *, FILE *, ZCONST char *)); -+ int zipbare OF((struct zlist far *, FILE *, FILE *, ZCONST char *)); -+# else -+ unsigned zfwrite OF((zvoid *, extent, extent, FILE *)); -+ extern char *key; -+# endif -+#endif /* ZIP */ -+ -+#if (defined(UNZIP) && !defined(FUNZIP)) -+ int decrypt OF((__GPRO__ ZCONST char *passwrd)); -+#endif -+ -+#ifdef FUNZIP -+ extern int encrypted; -+# ifdef NEXTBYTE -+# undef NEXTBYTE -+# endif -+# define NEXTBYTE \ -+ (encrypted? update_keys(__G__ getc(G.in)^decrypt_byte(__G)) : getc(G.in)) -+#endif /* FUNZIP */ -+ -+#else /* !CRYPT */ -+/* dummy version */ - - #define zencode - #define zdecode - - #define zfwrite fwrite - -+#endif /* ?CRYPT */ - #endif /* !__crypt_h */ diff --git a/tags/pisi-1.1_rc10/tests/zip2/files/zip-2.3-unix_configure-pic.patch b/tags/pisi-1.1_rc10/tests/zip2/files/zip-2.3-unix_configure-pic.patch deleted file mode 100644 index 45b137b0..00000000 --- a/tags/pisi-1.1_rc10/tests/zip2/files/zip-2.3-unix_configure-pic.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- unix/configure.orig 2004-09-28 06:45:33.000000000 +0000 -+++ unix/configure 2004-09-28 06:54:53.000000000 +0000 -@@ -29,6 +29,9 @@ - - echo Check if we can use asm code - OBJA="" -+piclib="$(echo | $CPP -dM $CFLAGS - | grep -i __pic__)" -+echo "Checking if compiler wants to create pic code" -+[ "$piclib" == "" ] && \ - if eval "$CPP match.S > _match.s 2>/dev/null"; then - if test ! -s _match.s || grep error < _match.s > /dev/null; then - : diff --git a/tags/pisi-1.1_rc10/tests/zip2/files/zip-CAN-2004-1010.patch b/tags/pisi-1.1_rc10/tests/zip2/files/zip-CAN-2004-1010.patch deleted file mode 100644 index 150d6407..00000000 --- a/tags/pisi-1.1_rc10/tests/zip2/files/zip-CAN-2004-1010.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- zip-2.3/unix/unix.c.orig 2004-11-05 15:44:41.000000000 -0500 -+++ zip-2.3/unix/unix.c 2004-11-05 15:50:28.000000000 -0500 -@@ -319,8 +319,8 @@ iztimes *t; /* return value: - a file size of -1 */ - { - struct stat s; /* results of stat() */ -- char name[FNMAX]; -- int len = strlen(f); -+ char *name; -+ size_t len = strlen(f); - - if (f == label) { - if (a != NULL) -@@ -331,6 +331,11 @@ iztimes *t; /* return value: - t->atime = t->mtime = t->ctime = label_utim; - return label_time; - } -+ -+ name = malloc(len+1); -+ if (!name) -+ return 0; -+ - strcpy(name, f); - if (name[len - 1] == '/') - name[len - 1] = '\0'; diff --git a/tags/pisi-1.1_rc10/tests/zip2/pspec.xml b/tags/pisi-1.1_rc10/tests/zip2/pspec.xml deleted file mode 100644 index 5c439849..00000000 --- a/tags/pisi-1.1_rc10/tests/zip2/pspec.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - zip - ftp://ftp.freesoftware.com/pub/infozip/Zip.html - - PACKAGER - PACKAGER_EMAIL - - Info-ZIP - category - component - Info ZIP (encryption support) - Info ZIP (encryption support) - ftp://ftp.linux.org.tr/pub/mirrors/gentoo/distfiles/zip23.tar.gz - - zip-2.3-unix_configure-pic.patch - - zcrypt.patch - - - unzip - patch - - - - - zip - - unzip - - - /usr/bin - /usr/share/doc - /usr/share/man - - - - - - 2005-08-11 - 2.4 - - - - - diff --git a/tags/pisi-1.1_rc10/tools/pygettext.py b/tags/pisi-1.1_rc10/tools/pygettext.py deleted file mode 100644 index bb0dd35d..00000000 --- a/tags/pisi-1.1_rc10/tools/pygettext.py +++ /dev/null @@ -1,669 +0,0 @@ -#! /usr/bin/env python -# -*- coding: iso-8859-1 -*- -# Originally written by Barry Warsaw -# -# Minimally patched to make it even more xgettext compatible -# by Peter Funk -# -# 2002-11-22 Jürgen Hermann -# Added checks that _() only contains string literals, and -# command line args are resolved to module lists, i.e. you -# can now pass a filename, a module or package name, or a -# directory (including globbing chars, important for Win32). -# Made docstring fit in 80 chars wide displays using pydoc. -# - -# for selftesting -try: - import fintl - _ = fintl.gettext -except ImportError: - _ = lambda s: s - -__doc__ = _("""pygettext -- Python equivalent of xgettext(1) - -Many systems (Solaris, Linux, Gnu) provide extensive tools that ease the -internationalization of C programs. Most of these tools are independent of -the programming language and can be used from within Python programs. -Martin von Loewis' work[1] helps considerably in this regard. - -There's one problem though; xgettext is the program that scans source code -looking for message strings, but it groks only C (or C++). Python -introduces a few wrinkles, such as dual quoting characters, triple quoted -strings, and raw strings. xgettext understands none of this. - -Enter pygettext, which uses Python's standard tokenize module to scan -Python source code, generating .pot files identical to what GNU xgettext[2] -generates for C and C++ code. From there, the standard GNU tools can be -used. - -A word about marking Python strings as candidates for translation. GNU -xgettext recognizes the following keywords: gettext, dgettext, dcgettext, -and gettext_noop. But those can be a lot of text to include all over your -code. C and C++ have a trick: they use the C preprocessor. Most -internationalized C source includes a #define for gettext() to _() so that -what has to be written in the source is much less. Thus these are both -translatable strings: - - gettext("Translatable String") - _("Translatable String") - -Python of course has no preprocessor so this doesn't work so well. Thus, -pygettext searches only for _() by default, but see the -k/--keyword flag -below for how to augment this. - - [1] http://www.python.org/workshops/1997-10/proceedings/loewis.html - [2] http://www.gnu.org/software/gettext/gettext.html - -NOTE: pygettext attempts to be option and feature compatible with GNU -xgettext where ever possible. However some options are still missing or are -not fully implemented. Also, xgettext's use of command line switches with -option arguments is broken, and in these cases, pygettext just defines -additional switches. - -Usage: pygettext [options] inputfile ... - -Options: - - -a - --extract-all - Extract all strings. - - -d name - --default-domain=name - Rename the default output file from messages.pot to name.pot. - - -E - --escape - Replace non-ASCII characters with octal escape sequences. - - -D - --docstrings - Extract module, class, method, and function docstrings. These do - not need to be wrapped in _() markers, and in fact cannot be for - Python to consider them docstrings. (See also the -X option). - - -h - --help - Print this help message and exit. - - -k word - --keyword=word - Keywords to look for in addition to the default set, which are: - %(DEFAULTKEYWORDS)s - - You can have multiple -k flags on the command line. - - -K - --no-default-keywords - Disable the default set of keywords (see above). Any keywords - explicitly added with the -k/--keyword option are still recognized. - - --no-location - Do not write filename/lineno location comments. - - -n - --add-location - Write filename/lineno location comments indicating where each - extracted string is found in the source. These lines appear before - each msgid. The style of comments is controlled by the -S/--style - option. This is the default. - - -o filename - --output=filename - Rename the default output file from messages.pot to filename. If - filename is `-' then the output is sent to standard out. - - -p dir - --output-dir=dir - Output files will be placed in directory dir. - - -S stylename - --style stylename - Specify which style to use for location comments. Two styles are - supported: - - Solaris # File: filename, line: line-number - GNU #: filename:line - - The style name is case insensitive. GNU style is the default. - - -v - --verbose - Print the names of the files being processed. - - -V - --version - Print the version of pygettext and exit. - - -w columns - --width=columns - Set width of output to columns. - - -x filename - --exclude-file=filename - Specify a file that contains a list of strings that are not be - extracted from the input files. Each string to be excluded must - appear on a line by itself in the file. - - -X filename - --no-docstrings=filename - Specify a file that contains a list of files (one per line) that - should not have their docstrings extracted. This is only useful in - conjunction with the -D option above. - -If `inputfile' is -, standard input is read. -""") - -import os -import imp -import sys -import glob -import time -import getopt -import token -import tokenize -import operator - -__version__ = '1.5' - -default_keywords = ['_'] -DEFAULTKEYWORDS = ', '.join(default_keywords) - -EMPTYSTRING = '' - - - -# The normal pot-file header. msgmerge and Emacs's po-mode work better if it's -# there. -pot_header = _('''\ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\\n" -"POT-Creation-Date: %(time)s\\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n" -"Last-Translator: FULL NAME \\n" -"Language-Team: LANGUAGE \\n" -"MIME-Version: 1.0\\n" -"Content-Type: text/plain; charset=CHARSET\\n" -"Content-Transfer-Encoding: ENCODING\\n" -"Generated-By: pygettext.py %(version)s\\n" - -''') - - -def usage(code, msg=''): - print >> sys.stderr, __doc__ % globals() - if msg: - print >> sys.stderr, msg - sys.exit(code) - - - -escapes = [] - -def make_escapes(pass_iso8859): - global escapes - if pass_iso8859: - # Allow iso-8859 characters to pass through so that e.g. 'msgid - # "Höhe"' would result not result in 'msgid "H\366he"'. Otherwise we - # escape any character outside the 32..126 range. - mod = 128 - else: - mod = 256 - for i in range(256): - if 32 <= (i % mod) <= 126: - escapes.append(chr(i)) - else: - escapes.append("\\%03o" % i) - escapes[ord('\\')] = '\\\\' - escapes[ord('\t')] = '\\t' - escapes[ord('\r')] = '\\r' - escapes[ord('\n')] = '\\n' - escapes[ord('\"')] = '\\"' - - -def escape(s): - global escapes - s = list(s) - for i in range(len(s)): - s[i] = escapes[ord(s[i])] - return EMPTYSTRING.join(s) - - -def safe_eval(s): - # unwrap quotes, safely - return eval(s, {'__builtins__':{}}, {}) - - -def normalize(s): - # This converts the various Python string types into a format that is - # appropriate for .po files, namely much closer to C style. - lines = s.split('\n') - if len(lines) == 1: - s = '"' + escape(s) + '"' - else: - if not lines[-1]: - del lines[-1] - lines[-1] = lines[-1] + '\n' - for i in range(len(lines)): - lines[i] = escape(lines[i]) - lineterm = '\\n"\n"' - s = '""\n"' + lineterm.join(lines) + '"' - return s - - -def containsAny(str, set): - """Check whether 'str' contains ANY of the chars in 'set'""" - return 1 in [c in str for c in set] - - -def _visit_pyfiles(list, dirname, names): - """Helper for getFilesForName().""" - # get extension for python source files - if not globals().has_key('_py_ext'): - global _py_ext - _py_ext = [triple[0] for triple in imp.get_suffixes() - if triple[2] == imp.PY_SOURCE][0] - - # don't recurse into CVS directories - if 'CVS' in names: - names.remove('CVS') - - # add all *.py files to list - list.extend( - [os.path.join(dirname, file) for file in names - if os.path.splitext(file)[1] == _py_ext] - ) - - -def _get_modpkg_path(dotted_name, pathlist=None): - """Get the filesystem path for a module or a package. - - Return the file system path to a file for a module, and to a directory for - a package. Return None if the name is not found, or is a builtin or - extension module. - """ - # split off top-most name - parts = dotted_name.split('.', 1) - - if len(parts) > 1: - # we have a dotted path, import top-level package - try: - file, pathname, description = imp.find_module(parts[0], pathlist) - if file: file.close() - except ImportError: - return None - - # check if it's indeed a package - if description[2] == imp.PKG_DIRECTORY: - # recursively handle the remaining name parts - pathname = _get_modpkg_path(parts[1], [pathname]) - else: - pathname = None - else: - # plain name - try: - file, pathname, description = imp.find_module( - dotted_name, pathlist) - if file: - file.close() - if description[2] not in [imp.PY_SOURCE, imp.PKG_DIRECTORY]: - pathname = None - except ImportError: - pathname = None - - return pathname - - -def getFilesForName(name): - """Get a list of module files for a filename, a module or package name, - or a directory. - """ - if not os.path.exists(name): - # check for glob chars - if containsAny(name, "*?[]"): - files = glob.glob(name) - list = [] - for file in files: - list.extend(getFilesForName(file)) - return list - - # try to find module or package - name = _get_modpkg_path(name) - if not name: - return [] - - if os.path.isdir(name): - # find all python files in directory - list = [] - os.path.walk(name, _visit_pyfiles, list) - return list - elif os.path.exists(name): - # a single file - return [name] - - return [] - - -class TokenEater: - def __init__(self, options): - self.__options = options - self.__messages = {} - self.__state = self.__waiting - self.__data = [] - self.__lineno = -1 - self.__freshmodule = 1 - self.__curfile = None - - def __call__(self, ttype, tstring, stup, etup, line): - # dispatch -## import token -## print >> sys.stderr, 'ttype:', token.tok_name[ttype], \ -## 'tstring:', tstring - self.__state(ttype, tstring, stup[0]) - - def __waiting(self, ttype, tstring, lineno): - opts = self.__options - # Do docstring extractions, if enabled - if opts.docstrings and not opts.nodocstrings.get(self.__curfile): - # module docstring? - if self.__freshmodule: - if ttype == tokenize.STRING: - self.__addentry(safe_eval(tstring), lineno, isdocstring=1) - self.__freshmodule = 0 - elif ttype not in (tokenize.COMMENT, tokenize.NL): - self.__freshmodule = 0 - return - # class docstring? - if ttype == tokenize.NAME and tstring in ('class', 'def'): - self.__state = self.__suiteseen - return - if ttype == tokenize.NAME and tstring in opts.keywords: - self.__state = self.__keywordseen - - def __suiteseen(self, ttype, tstring, lineno): - # ignore anything until we see the colon - if ttype == tokenize.OP and tstring == ':': - self.__state = self.__suitedocstring - - def __suitedocstring(self, ttype, tstring, lineno): - # ignore any intervening noise - if ttype == tokenize.STRING: - self.__addentry(safe_eval(tstring), lineno, isdocstring=1) - self.__state = self.__waiting - elif ttype not in (tokenize.NEWLINE, tokenize.INDENT, - tokenize.COMMENT): - # there was no class docstring - self.__state = self.__waiting - - def __keywordseen(self, ttype, tstring, lineno): - if ttype == tokenize.OP and tstring == '(': - self.__data = [] - self.__lineno = lineno - self.__state = self.__openseen - else: - self.__state = self.__waiting - - def __openseen(self, ttype, tstring, lineno): - if ttype == tokenize.OP and tstring == ')': - # We've seen the last of the translatable strings. Record the - # line number of the first line of the strings and update the list - # of messages seen. Reset state for the next batch. If there - # were no strings inside _(), then just ignore this entry. - if self.__data: - self.__addentry(EMPTYSTRING.join(self.__data)) - self.__state = self.__waiting - elif ttype == tokenize.STRING: - self.__data.append(safe_eval(tstring)) - elif ttype not in [tokenize.COMMENT, token.INDENT, token.DEDENT, - token.NEWLINE, tokenize.NL]: - # warn if we see anything else than STRING or whitespace - print >> sys.stderr, _( - '*** %(file)s:%(lineno)s: Seen unexpected token "%(token)s"' - ) % { - 'token': tstring, - 'file': self.__curfile, - 'lineno': self.__lineno - } - self.__state = self.__waiting - - def __addentry(self, msg, lineno=None, isdocstring=0): - if lineno is None: - lineno = self.__lineno - if not msg in self.__options.toexclude: - entry = (self.__curfile, lineno) - self.__messages.setdefault(msg, {})[entry] = isdocstring - - def set_filename(self, filename): - self.__curfile = filename - self.__freshmodule = 1 - - def write(self, fp): - options = self.__options - timestamp = time.strftime('%Y-%m-%d %H:%M+%Z') - # The time stamp in the header doesn't have the same format as that - # generated by xgettext... - print >> fp, pot_header % {'time': timestamp, 'version': __version__} - # Sort the entries. First sort each particular entry's keys, then - # sort all the entries by their first item. - reverse = {} - for k, v in self.__messages.items(): - keys = v.keys() - keys.sort() - reverse.setdefault(tuple(keys), []).append((k, v)) - rkeys = reverse.keys() - rkeys.sort() - for rkey in rkeys: - rentries = reverse[rkey] - rentries.sort() - for k, v in rentries: - isdocstring = 0 - # If the entry was gleaned out of a docstring, then add a - # comment stating so. This is to aid translators who may wish - # to skip translating some unimportant docstrings. - if reduce(operator.__add__, v.values()): - isdocstring = 1 - # k is the message string, v is a dictionary-set of (filename, - # lineno) tuples. We want to sort the entries in v first by - # file name and then by line number. - v = v.keys() - v.sort() - if not options.writelocations: - pass - # location comments are different b/w Solaris and GNU: - elif options.locationstyle == options.SOLARIS: - for filename, lineno in v: - d = {'filename': filename, 'lineno': lineno} - print >>fp, _( - '# File: %(filename)s, line: %(lineno)d') % d - elif options.locationstyle == options.GNU: - # fit as many locations on one line, as long as the - # resulting line length doesn't exceeds 'options.width' - locline = '#:' - for filename, lineno in v: - d = {'filename': filename, 'lineno': lineno} - s = _(' %(filename)s:%(lineno)d') % d - if len(locline) + len(s) <= options.width: - locline = locline + s - else: - print >> fp, locline - locline = "#:" + s - if len(locline) > 2: - print >> fp, locline - if isdocstring: - print >> fp, '#, docstring' - print >> fp, 'msgid', normalize(k) - print >> fp, 'msgstr ""\n' - - - -def main(): - global default_keywords - try: - opts, args = getopt.getopt( - sys.argv[1:], - 'ad:DEhk:Kno:p:S:Vvw:x:X:', - ['extract-all', 'default-domain=', 'escape', 'help', - 'keyword=', 'no-default-keywords', - 'add-location', 'no-location', 'output=', 'output-dir=', - 'style=', 'verbose', 'version', 'width=', 'exclude-file=', - 'docstrings', 'no-docstrings', - ]) - except getopt.error, msg: - usage(1, msg) - - # for holding option values - class Options: - # constants - GNU = 1 - SOLARIS = 2 - # defaults - extractall = 0 # FIXME: currently this option has no effect at all. - escape = 0 - keywords = [] - outpath = '' - outfile = 'messages.pot' - writelocations = 1 - locationstyle = GNU - verbose = 0 - width = 78 - excludefilename = '' - docstrings = 0 - nodocstrings = {} - - options = Options() - locations = {'gnu' : options.GNU, - 'solaris' : options.SOLARIS, - } - - # parse options - for opt, arg in opts: - if opt in ('-h', '--help'): - usage(0) - elif opt in ('-a', '--extract-all'): - options.extractall = 1 - elif opt in ('-d', '--default-domain'): - options.outfile = arg + '.pot' - elif opt in ('-E', '--escape'): - options.escape = 1 - elif opt in ('-D', '--docstrings'): - options.docstrings = 1 - elif opt in ('-k', '--keyword'): - options.keywords.append(arg) - elif opt in ('-K', '--no-default-keywords'): - default_keywords = [] - elif opt in ('-n', '--add-location'): - options.writelocations = 1 - elif opt in ('--no-location',): - options.writelocations = 0 - elif opt in ('-S', '--style'): - options.locationstyle = locations.get(arg.lower()) - if options.locationstyle is None: - usage(1, _('Invalid value for --style: %s') % arg) - elif opt in ('-o', '--output'): - options.outfile = arg - elif opt in ('-p', '--output-dir'): - options.outpath = arg - elif opt in ('-v', '--verbose'): - options.verbose = 1 - elif opt in ('-V', '--version'): - print _('pygettext.py (xgettext for Python) %s') % __version__ - sys.exit(0) - elif opt in ('-w', '--width'): - try: - options.width = int(arg) - except ValueError: - usage(1, _('--width argument must be an integer: %s') % arg) - elif opt in ('-x', '--exclude-file'): - options.excludefilename = arg - elif opt in ('-X', '--no-docstrings'): - fp = open(arg) - try: - while 1: - line = fp.readline() - if not line: - break - options.nodocstrings[line[:-1]] = 1 - finally: - fp.close() - - # calculate escapes - make_escapes(options.escape) - - # calculate all keywords - options.keywords.extend(default_keywords) - - # initialize list of strings to exclude - if options.excludefilename: - try: - fp = open(options.excludefilename) - options.toexclude = fp.readlines() - fp.close() - except IOError: - print >> sys.stderr, _( - "Can't read --exclude-file: %s") % options.excludefilename - sys.exit(1) - else: - options.toexclude = [] - - # resolve args to module lists - expanded = [] - for arg in args: - if arg == '-': - expanded.append(arg) - else: - expanded.extend(getFilesForName(arg)) - args = expanded - - # slurp through all the files - eater = TokenEater(options) - for filename in args: - if filename == '-': - if options.verbose: - print _('Reading standard input') - fp = sys.stdin - closep = 0 - else: - if options.verbose: - print _('Working on %s') % filename - fp = open(filename) - closep = 1 - try: - eater.set_filename(filename) - try: - tokenize.tokenize(fp.readline, eater) - except tokenize.TokenError, e: - print >> sys.stderr, '%s: %s, line %d, column %d' % ( - e[0], filename, e[1][0], e[1][1]) - finally: - if closep: - fp.close() - - # write the output - if options.outfile == '-': - fp = sys.stdout - closep = 0 - else: - if options.outpath: - options.outfile = os.path.join(options.outpath, options.outfile) - fp = open(options.outfile, 'w') - closep = 1 - try: - eater.write(fp) - finally: - if closep: - fp.close() - - -if __name__ == '__main__': - main() - # some more test strings - _(u'a unicode string') - # this one creates a warning - _('*** Seen unexpected token "%(token)s"') % {'token': 'test'} - _('more' 'than' 'one' 'string') diff --git a/tags/pisi-1.1_rc10/tools/svndist.py b/tags/pisi-1.1_rc10/tools/svndist.py deleted file mode 100755 index dfc3896c..00000000 --- a/tags/pisi-1.1_rc10/tools/svndist.py +++ /dev/null @@ -1,31 +0,0 @@ -#! /usr/bin/python -# a script to preare PiSi source tarball from svn -# author: exa - -#TODO: arguments for svn snapshot with rev number, or a tag to override default - -import sys -import os -import shutil - -def run(cmd): - print 'running', cmd - os.system(cmd) - -sys.path.insert(0, '.') -import pisi -if not os.path.exists('svndist'): - os.makedirs('svndist') - -ver = pisi.__version__ - -if os.path.exists('svndist/pisi-%s' % ver): - shutil.rmtree('svndist/pisi-%s' % ver) - -print 'Exporting svn directory' -run('svn export http://svn.uludag.org.tr/uludag/trunk/pisi svndist/pisi-%s' % ver) - -os.chdir('svndist') -run('tar cjvf pisi-%s.tar.bz2 pisi-%s' % (ver, ver)) - -print 'Have a look at svndist directory' diff --git a/tags/pisi-1.1_rc10/tools/update-po.sh b/tags/pisi-1.1_rc10/tools/update-po.sh deleted file mode 100755 index 4fc9e533..00000000 --- a/tags/pisi-1.1_rc10/tools/update-po.sh +++ /dev/null @@ -1,8 +0,0 @@ - -find pisi -iname '*.py' | grep -v pisi/cli/commands.py >exclude -python tools/pygettext.py -D -X exclude -o po/pisi.pot pisi pisi-cli scripts /usr/lib/python2.4/optparse.py -for lang in po/*.po -do - msgmerge -U $lang po/pisi.pot -done -rm exclude
-

-Depoda toplam %(nr_source)d -kaynak paket, ve bu paketlerden oluşturulacak -%(nr_packages)d ikili paket bulunmaktadır. Toplam %(nr_patches)d yama mevcuttur. -

- -

-%(errors)s -

- -

En fazla yamalanmış 5 kaynak paket:

-%(most_patched)s -

- -

En uzun actions.py betikli 5 kaynak paket:

-%(longpy)s -

- -

Eksik ikili paketler

-%(missing)s -

- -%(sizes)s - -

Paketçiler:

-%(packagers)s -

- -